diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.c b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.c new file mode 100644 index 0000000..7a68306 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.c @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ace.h" +#include "internal-sliscp-light.h" +#include "internal-util.h" +#include + +/** + * \brief Size of the state for the internal ACE permutation. + */ +#define ACE_STATE_SIZE SLISCP_LIGHT320_STATE_SIZE + +/** + * \brief Rate for absorbing data into the ACE state and for + * squeezing data out again. + */ +#define ACE_RATE 8 + +aead_cipher_t const ace_cipher = { + "ACE", + ACE_KEY_SIZE, + ACE_NONCE_SIZE, + ACE_TAG_SIZE, + AEAD_FLAG_NONE, + ace_aead_encrypt, + ace_aead_decrypt +}; + +aead_hash_algorithm_t const ace_hash_algorithm = { + "ACE-HASH", + sizeof(ace_hash_state_t), + ACE_HASH_SIZE, + AEAD_FLAG_NONE, + ace_hash, + (aead_hash_init_t)ace_hash_init, + (aead_hash_update_t)ace_hash_update, + (aead_hash_finalize_t)ace_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/* Indices of where a rate byte is located in the state. We don't + * need this array any more because sliscp_light320_permute() operates + * on byte-swapped states where the rate bytes are contiguous in the + * first 8 bytes */ +/* +static unsigned char const ace_rate_posn[8] = { + 0, 1, 2, 3, 16, 17, 18, 19 +}; +*/ + +/** + * \brief Initializes the ACE state. + * + * \param state ACE permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void ace_init + (unsigned char state[ACE_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by interleaving the key and nonce */ + memcpy(state, k, 8); + memcpy(state + 8, npub, 8); + memcpy(state + 16, k + 8, 8); + memset(state + 24, 0, 8); + memcpy(state + 32, npub + 8, 8); + + /* Swap some of the state bytes to make the rate bytes contiguous */ + sliscp_light320_swap(state); + + /* Run the permutation to scramble the initial state */ + sliscp_light320_permute(state); + + /* Absorb the key in two further permutation operations */ + lw_xor_block(state, k, 8); + sliscp_light320_permute(state); + lw_xor_block(state, k + 8, 8); + sliscp_light320_permute(state); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= ACE_RATE) { + lw_xor_block(state, ad, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light320_permute(state); + ad += ACE_RATE; + adlen -= ACE_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light320_permute(state); + } +} + +/** + * \brief Finalizes the ACE encryption or decryption operation. + * + * \param state ACE permutation state. + * \param k Points to the 128-bit key. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void ace_finalize + (unsigned char state[ACE_STATE_SIZE], const unsigned char *k, + unsigned char *tag) +{ + /* Absorb the key into the state again */ + lw_xor_block(state, k, 8); + sliscp_light320_permute(state); + lw_xor_block(state, k + 8, 8); + sliscp_light320_permute(state); + + /* Swap the state bytes back to the canonical order */ + sliscp_light320_swap(state); + + /* Copy out the authentication tag */ + memcpy(tag, state, 8); + memcpy(tag + 8, state + 16, 8); +} + +int ace_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ACE_TAG_SIZE; + + /* Initialize the ACE state and absorb the associated data */ + ace_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ACE_RATE) { + lw_xor_block_2_dest(c, state, m, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += ACE_RATE; + m += ACE_RATE; + mlen -= ACE_RATE; + } + temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += mlen; + + /* Generate the authentication tag */ + ace_finalize(state, k, c); + return 0; +} + +int ace_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ACE_TAG_SIZE) + return -1; + *mlen = clen - ACE_TAG_SIZE; + + /* Initialize the ACE state and absorb the associated data */ + ace_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ACE_TAG_SIZE; + while (clen >= ACE_RATE) { + lw_xor_block_swap(m, state, c, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += ACE_RATE; + m += ACE_RATE; + clen -= ACE_RATE; + } + temp = (unsigned)clen; + lw_xor_block_swap(m, state, c, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += clen; + + /* Finalize the ACE state and compare against the authentication tag */ + ace_finalize(state, k, state); + return aead_check_tag(mtemp, *mlen, state, c, ACE_TAG_SIZE); +} + +/* Pre-hashed version of the ACE-HASH initialization vector */ +static unsigned char const ace_hash_iv[ACE_STATE_SIZE] = { + 0xb9, 0x7d, 0xda, 0x3f, 0x66, 0x2c, 0xd1, 0xa6, + 0x65, 0xd1, 0x80, 0xd6, 0x49, 0xdc, 0xa1, 0x8c, + 0x0c, 0x5f, 0x0e, 0xca, 0x70, 0x37, 0x58, 0x75, + 0x29, 0x7d, 0xb0, 0xb0, 0x72, 0x73, 0xce, 0xa8, + 0x99, 0x71, 0xde, 0x8a, 0x9a, 0x65, 0x72, 0x24 +}; + +int ace_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned temp; + + /* Load the initialization vector and hash it, which can be pre-computed */ + /* + memset(state, 0, sizeof(state)); + state[8] = 0x80; + state[9] = 0x40; + state[10] = 0x40; + sliscp_light320_swap(state); + sliscp_light320_permute(state); + */ + memcpy(state, ace_hash_iv, ACE_STATE_SIZE); + + /* Absorb the input data */ + while (inlen >= ACE_RATE) { + lw_xor_block(state, in, ACE_RATE); + sliscp_light320_permute(state); + in += ACE_RATE; + inlen -= ACE_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + sliscp_light320_permute(state); + + /* Squeeze out the hash value */ + memcpy(out, state, 8); + for (temp = 0; temp < 3; ++temp) { + out += 8; + sliscp_light320_permute(state); + memcpy(out, state, 8); + } + return 0; +} + +void ace_hash_init(ace_hash_state_t *state) +{ + memcpy(state->s.state, ace_hash_iv, ACE_STATE_SIZE); + state->s.count = 0; +} + +void ace_hash_update + (ace_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned len; + + /* Handle the left-over rate block from last time */ + if (state->s.count != 0) { + len = ACE_RATE - state->s.count; + if (len > inlen) + len = (unsigned)inlen; + lw_xor_block(state->s.state + state->s.count, in, len); + in += len; + inlen -= len; + state->s.count += len; + if (state->s.count >= ACE_RATE) { + sliscp_light320_permute(state->s.state); + state->s.count = 0; + } else { + /* Not enough input data yet to fill up the whole block */ + return; + } + } + + /* Process as many full rate blocks as we can */ + while (inlen >= ACE_RATE) { + lw_xor_block(state->s.state, in, ACE_RATE); + sliscp_light320_permute(state->s.state); + in += ACE_RATE; + inlen -= ACE_RATE; + } + + /* Handle any left-over data */ + len = (unsigned)inlen; + lw_xor_block(state->s.state, in, len); + state->s.count = len; +} + +void ace_hash_finalize(ace_hash_state_t *state, unsigned char *out) +{ + unsigned temp; + + /* Pad and hash the final input block */ + state->s.state[state->s.count] ^= 0x80; + sliscp_light320_permute(state->s.state); + state->s.count = 0; + + /* Squeeze out the hash value */ + memcpy(out, state->s.state, 9); + for (temp = 0; temp < 3; ++temp) { + out += 8; + sliscp_light320_permute(state->s.state); + memcpy(out, state->s.state, 8); + } +} diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.h b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.h new file mode 100644 index 0000000..4497927 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/ace.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ACE_H +#define LWCRYPTO_ACE_H + +#include "aead-common.h" + +/** + * \file ace.h + * \brief ACE authenticated encryption algorithm. + * + * ACE is an authenticated encryption algorithm with a 128-bit key, + * a 128-bit nonce, and a 128-bit tag. It uses a duplex construction + * on top of a 320-bit permutation. The permutation is a generalised + * version of sLiSCP-light, extended from 256 bits to 320 bits. + * ACE also has a companion hash algorithm with a 256-bit output. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ACE. + */ +#define ACE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for ACE. + */ +#define ACE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for ACE. + */ +#define ACE_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for ACE-HASH. + */ +#define ACE_HASH_SIZE 32 + +/** + * \brief Meta-information block for the ACE cipher. + */ +extern aead_cipher_t const ace_cipher; + +/** + * \brief Meta-information block for the ACE-HASH hash algorithm. + */ +extern aead_hash_algorithm_t const ace_hash_algorithm; + +/** + * \brief State information for the ACE-HASH incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ace_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with ACE. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ace_aead_decrypt() + */ +int ace_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ACE. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ace_aead_encrypt() + */ +int ace_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ACE-HASH to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ACE_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int ace_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ACE-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ace_hash_update(), ace_hash_finalize(), ace_hash() + */ +void ace_hash_init(ace_hash_state_t *state); + +/** + * \brief Updates the ACE-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ace_hash_init(), ace_hash_finalize() + */ +void ace_hash_update + (ace_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ACE-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ace_hash_init(), ace_hash_update() + */ +void ace_hash_finalize(ace_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.c b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.h b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/api.h b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/encrypt.c b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..99cb7f3 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "ace.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return ace_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return ace_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-320-avr.S b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-320-avr.S new file mode 100644 index 0000000..98e5eaf --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-320-avr.S @@ -0,0 +1,1767 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 96 +table_0: + .byte 7 + .byte 83 + .byte 67 + .byte 80 + .byte 40 + .byte 20 + .byte 10 + .byte 93 + .byte 228 + .byte 92 + .byte 174 + .byte 87 + .byte 155 + .byte 73 + .byte 94 + .byte 145 + .byte 72 + .byte 36 + .byte 224 + .byte 127 + .byte 204 + .byte 141 + .byte 198 + .byte 99 + .byte 209 + .byte 190 + .byte 50 + .byte 83 + .byte 169 + .byte 84 + .byte 26 + .byte 29 + .byte 78 + .byte 96 + .byte 48 + .byte 24 + .byte 34 + .byte 40 + .byte 117 + .byte 104 + .byte 52 + .byte 154 + .byte 247 + .byte 108 + .byte 37 + .byte 225 + .byte 112 + .byte 56 + .byte 98 + .byte 130 + .byte 253 + .byte 246 + .byte 123 + .byte 189 + .byte 150 + .byte 71 + .byte 249 + .byte 157 + .byte 206 + .byte 103 + .byte 113 + .byte 107 + .byte 118 + .byte 64 + .byte 32 + .byte 16 + .byte 170 + .byte 136 + .byte 160 + .byte 79 + .byte 39 + .byte 19 + .byte 43 + .byte 220 + .byte 176 + .byte 190 + .byte 95 + .byte 47 + .byte 233 + .byte 139 + .byte 9 + .byte 91 + .byte 173 + .byte 214 + .byte 207 + .byte 89 + .byte 30 + .byte 233 + .byte 116 + .byte 186 + .byte 183 + .byte 198 + .byte 173 + .byte 127 + .byte 63 + .byte 31 + + .text +.global sliscp_light320_permute + .type sliscp_light320_permute, @function +sliscp_light320_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 34 + ldd r21,Z+8 + ldd r20,Z+9 + ldd r19,Z+10 + ldd r18,Z+11 + ldd r27,Z+12 + ldd r26,Z+13 + ldd r23,Z+14 + ldd r22,Z+15 + ldd r5,Z+24 + ldd r4,Z+25 + ldd r3,Z+26 + ldd r2,Z+27 + ldd r9,Z+28 + ldd r8,Z+29 + ldd r7,Z+30 + ldd r6,Z+31 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ld r21,Z + ldd r20,Z+1 + ldd r19,Z+2 + ldd r18,Z+3 + ldd r27,Z+16 + ldd r26,Z+17 + ldd r23,Z+18 + ldd r22,Z+19 + ldd r5,Z+4 + ldd r4,Z+5 + ldd r3,Z+6 + ldd r2,Z+7 + ldd r9,Z+20 + ldd r8,Z+21 + ldd r7,Z+22 + ldd r6,Z+23 + ldd r13,Z+32 + ldd r12,Z+33 + ldd r11,Z+34 + ldd r10,Z+35 + ldd r25,Z+26 + ldd r24,Z+27 + ldd r15,Z+28 + ldd r14,Z+29 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r16,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r16 +#endif + ldi r30,0 +60: +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + pop r30 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + pop r30 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + pop r30 + ldd r16,Y+1 + ldd r17,Y+2 + ldd r1,Y+3 + ldd r0,Y+4 + eor r16,r2 + eor r17,r3 + eor r1,r4 + eor r0,r5 + com r16 + com r17 + com r1 + com r0 + std Y+1,r16 + std Y+2,r17 + std Y+3,r1 + std Y+4,r0 + ldd r16,Y+5 + ldd r17,Y+6 + ldd r1,Y+7 + ldd r0,Y+8 + eor r16,r6 + eor r17,r7 + eor r1,r8 + eor r0,r9 + com r17 + com r1 + com r0 + std Y+6,r17 + std Y+7,r1 + std Y+8,r0 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r16,r0 + std Y+5,r16 + ldd r16,Y+9 + ldd r17,Y+10 + ldd r1,Y+11 + ldd r0,Y+12 + eor r16,r10 + eor r17,r11 + eor r1,r12 + eor r0,r13 + com r16 + com r17 + com r1 + com r0 + std Y+9,r16 + std Y+10,r17 + std Y+11,r1 + std Y+12,r0 + ldd r16,Y+13 + ldd r17,Y+14 + ldd r1,Y+15 + ldd r0,Y+16 + eor r16,r14 + eor r17,r15 + eor r1,r24 + eor r0,r25 + com r17 + com r1 + com r0 + std Y+14,r17 + std Y+15,r1 + std Y+16,r0 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r16,r0 + std Y+13,r16 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + com r10 + com r11 + com r12 + com r13 + eor r14,r22 + eor r15,r23 + eor r24,r26 + eor r25,r27 + com r15 + com r24 + com r25 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r14,r0 + movw r16,r10 + mov r1,r12 + mov r0,r13 + ldd r10,Y+1 + ldd r11,Y+2 + ldd r12,Y+3 + ldd r13,Y+4 + std Y+1,r2 + std Y+2,r3 + std Y+3,r4 + std Y+4,r5 + movw r2,r18 + movw r4,r20 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + std Y+9,r16 + std Y+10,r17 + std Y+11,r1 + std Y+12,r0 + movw r16,r14 + mov r1,r24 + mov r0,r25 + ldd r14,Y+5 + ldd r15,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + movw r6,r22 + movw r8,r26 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + std Y+13,r16 + std Y+14,r17 + std Y+15,r1 + std Y+16,r0 + ldi r17,96 + cpse r30,r17 + rjmp 60b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r21 + std Z+1,r20 + std Z+2,r19 + std Z+3,r18 + std Z+16,r27 + std Z+17,r26 + std Z+18,r23 + std Z+19,r22 + std Z+4,r5 + std Z+5,r4 + std Z+6,r3 + std Z+7,r2 + std Z+20,r9 + std Z+21,r8 + std Z+22,r7 + std Z+23,r6 + std Z+32,r13 + std Z+33,r12 + std Z+34,r11 + std Z+35,r10 + std Z+36,r25 + std Z+37,r24 + std Z+38,r15 + std Z+39,r14 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + ldd r2,Y+9 + ldd r3,Y+10 + ldd r4,Y+11 + ldd r5,Y+12 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + std Z+8,r21 + std Z+9,r20 + std Z+10,r19 + std Z+11,r18 + std Z+12,r27 + std Z+13,r26 + std Z+14,r23 + std Z+15,r22 + std Z+24,r5 + std Z+25,r4 + std Z+26,r3 + std Z+27,r2 + std Z+28,r9 + std Z+29,r8 + std Z+30,r7 + std Z+31,r6 + adiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + eor r1,r1 + ret + .size sliscp_light320_permute, .-sliscp_light320_permute + + .text +.global sliscp_light320_swap + .type sliscp_light320_swap, @function +sliscp_light320_swap: + movw r30,r24 +.L__stack_usage = 2 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ret + .size sliscp_light320_swap, .-sliscp_light320_swap + +#endif diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.c b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.c new file mode 100644 index 0000000..dd3a688 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sliscp-light.h" + +#if !defined(__AVR__) + +/** + * \brief Performs one round of the Simeck-64 block cipher. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + */ +#define simeck64_round(x, y) \ + do { \ + (y) ^= (leftRotate5((x)) & (x)) ^ leftRotate1((x)) ^ \ + 0xFFFFFFFEU ^ (_rc & 1); \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with the 8 round version of Simeck-64. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck64_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck64_round(x, y); /* Round 1 */ \ + simeck64_round(y, x); /* Round 2 */ \ + simeck64_round(x, y); /* Round 3 */ \ + simeck64_round(y, x); /* Round 4 */ \ + simeck64_round(x, y); /* Round 5 */ \ + simeck64_round(y, x); /* Round 6 */ \ + simeck64_round(x, y); /* Round 7 */ \ + simeck64_round(y, x); /* Round 8 */ \ + } while (0) + +/* Helper macros for 48-bit left rotations */ +#define leftRotate5_48(x) (((x) << 5) | ((x) >> 19)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 23)) + +/** + * \brief Performs one round of the Simeck-48 block cipher. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + */ +#define simeck48_round(x, y) \ + do { \ + (y) ^= (leftRotate5_48((x)) & (x)) ^ leftRotate1_48((x)) ^ \ + 0x00FFFFFEU ^ (_rc & 1); \ + (y) &= 0x00FFFFFFU; \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 48-bit block with the 6 round version of Simeck-48. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck48_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck48_round(x, y); /* Round 1 */ \ + simeck48_round(y, x); /* Round 2 */ \ + simeck48_round(x, y); /* Round 3 */ \ + simeck48_round(y, x); /* Round 4 */ \ + simeck48_round(x, y); /* Round 5 */ \ + simeck48_round(y, x); /* Round 6 */ \ + } while (0) + +/* Interleaved rc0, rc1, sc0, and sc1 values for each round */ +static unsigned char const sliscp_light256_RC[18 * 4] = { + 0x0f, 0x47, 0x08, 0x64, 0x04, 0xb2, 0x86, 0x6b, + 0x43, 0xb5, 0xe2, 0x6f, 0xf1, 0x37, 0x89, 0x2c, + 0x44, 0x96, 0xe6, 0xdd, 0x73, 0xee, 0xca, 0x99, + 0xe5, 0x4c, 0x17, 0xea, 0x0b, 0xf5, 0x8e, 0x0f, + 0x47, 0x07, 0x64, 0x04, 0xb2, 0x82, 0x6b, 0x43, + 0xb5, 0xa1, 0x6f, 0xf1, 0x37, 0x78, 0x2c, 0x44, + 0x96, 0xa2, 0xdd, 0x73, 0xee, 0xb9, 0x99, 0xe5, + 0x4c, 0xf2, 0xea, 0x0b, 0xf5, 0x85, 0x0f, 0x47, + 0x07, 0x23, 0x04, 0xb2, 0x82, 0xd9, 0x43, 0xb5 +}; + +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 24); /* Assumes the block is pre-swapped */ + x4 = be_load_word32(block + 16); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 12); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 8, x2); + be_store_word32(block + 24, x3); /* Assumes the block is pre-swapped */ + be_store_word32(block + 16, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 12, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spix(unsigned char block[32]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 12); + t2 = le_load_word32(block + 24); + le_store_word32(block + 24, t1); + le_store_word32(block + 12, t2); +} + +void sliscp_light256_permute_spoc(unsigned char block[32]) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x3 = be_load_word32(block + 20); + x4 = be_load_word32(block + 8); + x5 = be_load_word32(block + 12); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 16, x2); /* Assumes the block is pre-swapped */ + be_store_word32(block + 20, x3); + be_store_word32(block + 8, x4); + be_store_word32(block + 12, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spoc(unsigned char block[32]) +{ + uint64_t t1, t2; + t1 = le_load_word64(block + 8); + t2 = le_load_word64(block + 16); + le_store_word64(block + 16, t1); + le_store_word64(block + 8, t2); +} + +/* Load a big-endian 24-bit word from a byte buffer */ +#define be_load_word24(ptr) \ + ((((uint32_t)((ptr)[0])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[2]))) + +/* Store a big-endian 24-bit word into a byte buffer */ +#define be_store_word24(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 16); \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)_x; \ + } while (0) + +void sliscp_light192_permute(unsigned char block[24]) +{ + /* Interleaved rc0, rc1, sc0, and sc1 values for each round */ + static unsigned char const RC[18 * 4] = { + 0x07, 0x27, 0x08, 0x29, 0x04, 0x34, 0x0c, 0x1d, + 0x06, 0x2e, 0x0a, 0x33, 0x25, 0x19, 0x2f, 0x2a, + 0x17, 0x35, 0x38, 0x1f, 0x1c, 0x0f, 0x24, 0x10, + 0x12, 0x08, 0x36, 0x18, 0x3b, 0x0c, 0x0d, 0x14, + 0x26, 0x0a, 0x2b, 0x1e, 0x15, 0x2f, 0x3e, 0x31, + 0x3f, 0x38, 0x01, 0x09, 0x20, 0x24, 0x21, 0x2d, + 0x30, 0x36, 0x11, 0x1b, 0x28, 0x0d, 0x39, 0x16, + 0x3c, 0x2b, 0x05, 0x3d, 0x22, 0x3e, 0x27, 0x03, + 0x13, 0x01, 0x34, 0x02, 0x1a, 0x21, 0x2e, 0x23 + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables. Each 24-bit block is + * placed into a separate 32-bit word which improves efficiency below */ + x0 = be_load_word24(block); + x1 = be_load_word24(block + 3); + x2 = be_load_word24(block + 6); + x3 = be_load_word24(block + 9); + x4 = be_load_word24(block + 12); + x5 = be_load_word24(block + 15); + x6 = be_load_word24(block + 18); + x7 = be_load_word24(block + 21); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-48 to two of the 48-bit sub-blocks */ + simeck48_box(x2, x3, rc[0]); + simeck48_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0x00FFFFFFU; + x1 ^= 0x00FFFF00U ^ rc[2]; + x4 ^= 0x00FFFFFFU; + x5 ^= 0x00FFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word24(block, x0); + be_store_word24(block + 3, x1); + be_store_word24(block + 6, x2); + be_store_word24(block + 9, x3); + be_store_word24(block + 12, x4); + be_store_word24(block + 15, x5); + be_store_word24(block + 18, x6); + be_store_word24(block + 21, x7); +} + +void sliscp_light320_permute(unsigned char block[40]) +{ + /* Interleaved rc0, rc1, rc2, sc0, sc1, and sc2 values for each round */ + static unsigned char const RC[16 * 6] = { + 0x07, 0x53, 0x43, 0x50, 0x28, 0x14, 0x0a, 0x5d, + 0xe4, 0x5c, 0xae, 0x57, 0x9b, 0x49, 0x5e, 0x91, + 0x48, 0x24, 0xe0, 0x7f, 0xcc, 0x8d, 0xc6, 0x63, + 0xd1, 0xbe, 0x32, 0x53, 0xa9, 0x54, 0x1a, 0x1d, + 0x4e, 0x60, 0x30, 0x18, 0x22, 0x28, 0x75, 0x68, + 0x34, 0x9a, 0xf7, 0x6c, 0x25, 0xe1, 0x70, 0x38, + 0x62, 0x82, 0xfd, 0xf6, 0x7b, 0xbd, 0x96, 0x47, + 0xf9, 0x9d, 0xce, 0x67, 0x71, 0x6b, 0x76, 0x40, + 0x20, 0x10, 0xaa, 0x88, 0xa0, 0x4f, 0x27, 0x13, + 0x2b, 0xdc, 0xb0, 0xbe, 0x5f, 0x2f, 0xe9, 0x8b, + 0x09, 0x5b, 0xad, 0xd6, 0xcf, 0x59, 0x1e, 0xe9, + 0x74, 0xba, 0xb7, 0xc6, 0xad, 0x7f, 0x3f, 0x1f + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 12); + x4 = be_load_word32(block + 4); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + x8 = be_load_word32(block + 32); + x9 = be_load_word32(block + 36); + + /* Perform all permutation rounds */ + for (round = 0; round < 16; ++round, rc += 6) { + /* Apply Simeck-64 to three of the 64-bit sub-blocks */ + simeck64_box(x0, x1, rc[0]); + simeck64_box(x4, x5, rc[1]); + simeck64_box(x8, x9, rc[2]); + x6 ^= x8; + x7 ^= x9; + x2 ^= x4; + x3 ^= x5; + x8 ^= x0; + x9 ^= x1; + + /* Add step constants */ + x2 ^= 0xFFFFFFFFU; + x3 ^= 0xFFFFFF00U ^ rc[3]; + x6 ^= 0xFFFFFFFFU; + x7 ^= 0xFFFFFF00U ^ rc[4]; + x8 ^= 0xFFFFFFFFU; + x9 ^= 0xFFFFFF00U ^ rc[5]; + + /* Rotate the sub-blocks */ + t0 = x8; + t1 = x9; + x8 = x2; + x9 = x3; + x2 = x4; + x3 = x5; + x4 = x0; + x5 = x1; + x0 = x6; + x1 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 16, x1); /* Assumes the block is pre-swapped */ + be_store_word32(block + 8, x2); + be_store_word32(block + 12, x3); + be_store_word32(block + 4, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); + be_store_word32(block + 32, x8); + be_store_word32(block + 36, x9); +} + +void sliscp_light320_swap(unsigned char block[40]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 4); + t2 = le_load_word32(block + 16); + le_store_word32(block + 16, t1); + le_store_word32(block + 4, t2); +} + +#endif /* !__AVR__ */ diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.h b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.h new file mode 100644 index 0000000..8a5e8d5 --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-sliscp-light.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SLISCP_LIGHT_H +#define LW_INTERNAL_SLISCP_LIGHT_H + +/** + * \file internal-sliscp-light.h + * \brief sLiSCP-light permutation + * + * There are three variants of sLiSCP-light in use in the NIST submissions: + * + * \li sLiSCP-light-256 with a 256-bit block size, used in SPIX and SpoC. + * \li sLiSCP-light-192 with a 192-bit block size, used in SpoC. + * \li sLiSCP-light-320 with a 320-bit block size, used in ACE. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace, + * https://uwaterloo.ca/communications-security-lab/lwc/spix, + * https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for sLiSCP-light-256. + */ +#define SLISCP_LIGHT256_STATE_SIZE 32 + +/** + * \brief Size of the state for sLiSCP-light-192. + */ +#define SLISCP_LIGHT192_STATE_SIZE 24 + +/** + * \brief Size of the state for sLiSCP-light-320. + */ +#define SLISCP_LIGHT320_STATE_SIZE 40 + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * \param rounds Number of rounds to be performed, usually 9 or 18. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SPIX cipher. SPIX places the rate bytes at + * positions 8, 9, 10, 11, 24, 25, 26, and 27. + * + * This function assumes that bytes 24-27 have been pre-swapped with + * bytes 12-15 so that the rate portion of the state is contiguous. + * + * The sliscp_light256_swap_spix() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spix() + */ +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SPIX. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spix() + */ +void sliscp_light256_swap_spix(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SpoC-128 cipher. SpoC-128 interleaves the + * rate bytes and the mask bytes. This version assumes that the + * rate and mask are in contiguous bytes of the state. + * + * SpoC-128 absorbs bytes using the mask bytes of the state at offsets + * 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, and 31. + * It squeezes bytes using the rate bytes of the state at offsets + * 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, and 23. + * + * This function assumes that bytes 8-15 have been pre-swapped with 16-23 + * so that the rate and mask portions of the state are contiguous. + * + * The sliscp_light256_swap_spoc() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spoc() + */ +void sliscp_light256_permute_spoc(unsigned char block[32]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SpoC-128. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spoc() + */ +void sliscp_light256_swap_spoc(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 192-bit block. + * + * \param block Points to the block to be permuted. + */ +void sliscp_light192_permute(unsigned char block[24]); + +/** + * \brief Performs the sLiSCP-light permutation on a 320-bit block. + * + * \param block Points to the block to be permuted. + * + * The ACE specification refers to this permutation as "ACE" but that + * can be confused with the name of the AEAD mode so we call this + * permutation "sLiSCP-light-320" instead. + * + * ACE absorbs and squeezes data at the rate bytes 0, 1, 2, 3, 16, 17, 18, 19. + * Efficiency can suffer because of the discontinuity in rate byte positions. + * + * To counteract this, we assume that the input to the permutation has been + * pre-swapped: bytes 4, 5, 6, 7 are swapped with bytes 16, 17, 18, 19 so + * that the rate is contiguous at the start of the state. + * + * The sliscp_light320_swap() function can be used to switch between the + * canonical order and the pre-swapped order. + * + * \sa sliscp_light320_swap() + */ +void sliscp_light320_permute(unsigned char block[40]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 320-bit block. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light320_permute() + */ +void sliscp_light320_swap(unsigned char block[40]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-util.h b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ace/Implementations/crypto_aead/aceae128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.c b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.c new file mode 100644 index 0000000..7a68306 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.c @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ace.h" +#include "internal-sliscp-light.h" +#include "internal-util.h" +#include + +/** + * \brief Size of the state for the internal ACE permutation. + */ +#define ACE_STATE_SIZE SLISCP_LIGHT320_STATE_SIZE + +/** + * \brief Rate for absorbing data into the ACE state and for + * squeezing data out again. + */ +#define ACE_RATE 8 + +aead_cipher_t const ace_cipher = { + "ACE", + ACE_KEY_SIZE, + ACE_NONCE_SIZE, + ACE_TAG_SIZE, + AEAD_FLAG_NONE, + ace_aead_encrypt, + ace_aead_decrypt +}; + +aead_hash_algorithm_t const ace_hash_algorithm = { + "ACE-HASH", + sizeof(ace_hash_state_t), + ACE_HASH_SIZE, + AEAD_FLAG_NONE, + ace_hash, + (aead_hash_init_t)ace_hash_init, + (aead_hash_update_t)ace_hash_update, + (aead_hash_finalize_t)ace_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/* Indices of where a rate byte is located in the state. We don't + * need this array any more because sliscp_light320_permute() operates + * on byte-swapped states where the rate bytes are contiguous in the + * first 8 bytes */ +/* +static unsigned char const ace_rate_posn[8] = { + 0, 1, 2, 3, 16, 17, 18, 19 +}; +*/ + +/** + * \brief Initializes the ACE state. + * + * \param state ACE permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void ace_init + (unsigned char state[ACE_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by interleaving the key and nonce */ + memcpy(state, k, 8); + memcpy(state + 8, npub, 8); + memcpy(state + 16, k + 8, 8); + memset(state + 24, 0, 8); + memcpy(state + 32, npub + 8, 8); + + /* Swap some of the state bytes to make the rate bytes contiguous */ + sliscp_light320_swap(state); + + /* Run the permutation to scramble the initial state */ + sliscp_light320_permute(state); + + /* Absorb the key in two further permutation operations */ + lw_xor_block(state, k, 8); + sliscp_light320_permute(state); + lw_xor_block(state, k + 8, 8); + sliscp_light320_permute(state); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= ACE_RATE) { + lw_xor_block(state, ad, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light320_permute(state); + ad += ACE_RATE; + adlen -= ACE_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light320_permute(state); + } +} + +/** + * \brief Finalizes the ACE encryption or decryption operation. + * + * \param state ACE permutation state. + * \param k Points to the 128-bit key. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void ace_finalize + (unsigned char state[ACE_STATE_SIZE], const unsigned char *k, + unsigned char *tag) +{ + /* Absorb the key into the state again */ + lw_xor_block(state, k, 8); + sliscp_light320_permute(state); + lw_xor_block(state, k + 8, 8); + sliscp_light320_permute(state); + + /* Swap the state bytes back to the canonical order */ + sliscp_light320_swap(state); + + /* Copy out the authentication tag */ + memcpy(tag, state, 8); + memcpy(tag + 8, state + 16, 8); +} + +int ace_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ACE_TAG_SIZE; + + /* Initialize the ACE state and absorb the associated data */ + ace_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ACE_RATE) { + lw_xor_block_2_dest(c, state, m, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += ACE_RATE; + m += ACE_RATE; + mlen -= ACE_RATE; + } + temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += mlen; + + /* Generate the authentication tag */ + ace_finalize(state, k, c); + return 0; +} + +int ace_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ACE_TAG_SIZE) + return -1; + *mlen = clen - ACE_TAG_SIZE; + + /* Initialize the ACE state and absorb the associated data */ + ace_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ACE_TAG_SIZE; + while (clen >= ACE_RATE) { + lw_xor_block_swap(m, state, c, ACE_RATE); + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += ACE_RATE; + m += ACE_RATE; + clen -= ACE_RATE; + } + temp = (unsigned)clen; + lw_xor_block_swap(m, state, c, temp); + state[temp] ^= 0x80; /* padding */ + state[ACE_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light320_permute(state); + c += clen; + + /* Finalize the ACE state and compare against the authentication tag */ + ace_finalize(state, k, state); + return aead_check_tag(mtemp, *mlen, state, c, ACE_TAG_SIZE); +} + +/* Pre-hashed version of the ACE-HASH initialization vector */ +static unsigned char const ace_hash_iv[ACE_STATE_SIZE] = { + 0xb9, 0x7d, 0xda, 0x3f, 0x66, 0x2c, 0xd1, 0xa6, + 0x65, 0xd1, 0x80, 0xd6, 0x49, 0xdc, 0xa1, 0x8c, + 0x0c, 0x5f, 0x0e, 0xca, 0x70, 0x37, 0x58, 0x75, + 0x29, 0x7d, 0xb0, 0xb0, 0x72, 0x73, 0xce, 0xa8, + 0x99, 0x71, 0xde, 0x8a, 0x9a, 0x65, 0x72, 0x24 +}; + +int ace_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[ACE_STATE_SIZE]; + unsigned temp; + + /* Load the initialization vector and hash it, which can be pre-computed */ + /* + memset(state, 0, sizeof(state)); + state[8] = 0x80; + state[9] = 0x40; + state[10] = 0x40; + sliscp_light320_swap(state); + sliscp_light320_permute(state); + */ + memcpy(state, ace_hash_iv, ACE_STATE_SIZE); + + /* Absorb the input data */ + while (inlen >= ACE_RATE) { + lw_xor_block(state, in, ACE_RATE); + sliscp_light320_permute(state); + in += ACE_RATE; + inlen -= ACE_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + sliscp_light320_permute(state); + + /* Squeeze out the hash value */ + memcpy(out, state, 8); + for (temp = 0; temp < 3; ++temp) { + out += 8; + sliscp_light320_permute(state); + memcpy(out, state, 8); + } + return 0; +} + +void ace_hash_init(ace_hash_state_t *state) +{ + memcpy(state->s.state, ace_hash_iv, ACE_STATE_SIZE); + state->s.count = 0; +} + +void ace_hash_update + (ace_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned len; + + /* Handle the left-over rate block from last time */ + if (state->s.count != 0) { + len = ACE_RATE - state->s.count; + if (len > inlen) + len = (unsigned)inlen; + lw_xor_block(state->s.state + state->s.count, in, len); + in += len; + inlen -= len; + state->s.count += len; + if (state->s.count >= ACE_RATE) { + sliscp_light320_permute(state->s.state); + state->s.count = 0; + } else { + /* Not enough input data yet to fill up the whole block */ + return; + } + } + + /* Process as many full rate blocks as we can */ + while (inlen >= ACE_RATE) { + lw_xor_block(state->s.state, in, ACE_RATE); + sliscp_light320_permute(state->s.state); + in += ACE_RATE; + inlen -= ACE_RATE; + } + + /* Handle any left-over data */ + len = (unsigned)inlen; + lw_xor_block(state->s.state, in, len); + state->s.count = len; +} + +void ace_hash_finalize(ace_hash_state_t *state, unsigned char *out) +{ + unsigned temp; + + /* Pad and hash the final input block */ + state->s.state[state->s.count] ^= 0x80; + sliscp_light320_permute(state->s.state); + state->s.count = 0; + + /* Squeeze out the hash value */ + memcpy(out, state->s.state, 9); + for (temp = 0; temp < 3; ++temp) { + out += 8; + sliscp_light320_permute(state->s.state); + memcpy(out, state->s.state, 8); + } +} diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.h b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.h new file mode 100644 index 0000000..4497927 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/ace.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ACE_H +#define LWCRYPTO_ACE_H + +#include "aead-common.h" + +/** + * \file ace.h + * \brief ACE authenticated encryption algorithm. + * + * ACE is an authenticated encryption algorithm with a 128-bit key, + * a 128-bit nonce, and a 128-bit tag. It uses a duplex construction + * on top of a 320-bit permutation. The permutation is a generalised + * version of sLiSCP-light, extended from 256 bits to 320 bits. + * ACE also has a companion hash algorithm with a 256-bit output. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ACE. + */ +#define ACE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for ACE. + */ +#define ACE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for ACE. + */ +#define ACE_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for ACE-HASH. + */ +#define ACE_HASH_SIZE 32 + +/** + * \brief Meta-information block for the ACE cipher. + */ +extern aead_cipher_t const ace_cipher; + +/** + * \brief Meta-information block for the ACE-HASH hash algorithm. + */ +extern aead_hash_algorithm_t const ace_hash_algorithm; + +/** + * \brief State information for the ACE-HASH incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ace_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with ACE. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ace_aead_decrypt() + */ +int ace_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ACE. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ace_aead_encrypt() + */ +int ace_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ACE-HASH to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ACE_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int ace_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ACE-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ace_hash_update(), ace_hash_finalize(), ace_hash() + */ +void ace_hash_init(ace_hash_state_t *state); + +/** + * \brief Updates the ACE-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ace_hash_init(), ace_hash_finalize() + */ +void ace_hash_update + (ace_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ACE-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ace_hash_init(), ace_hash_update() + */ +void ace_hash_finalize(ace_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.c b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.h b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/api.h b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/hash.c b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/hash.c new file mode 100644 index 0000000..388f638 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "ace.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return ace_hash(out, in, inlen); +} diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-320-avr.S b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-320-avr.S new file mode 100644 index 0000000..98e5eaf --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-320-avr.S @@ -0,0 +1,1767 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 96 +table_0: + .byte 7 + .byte 83 + .byte 67 + .byte 80 + .byte 40 + .byte 20 + .byte 10 + .byte 93 + .byte 228 + .byte 92 + .byte 174 + .byte 87 + .byte 155 + .byte 73 + .byte 94 + .byte 145 + .byte 72 + .byte 36 + .byte 224 + .byte 127 + .byte 204 + .byte 141 + .byte 198 + .byte 99 + .byte 209 + .byte 190 + .byte 50 + .byte 83 + .byte 169 + .byte 84 + .byte 26 + .byte 29 + .byte 78 + .byte 96 + .byte 48 + .byte 24 + .byte 34 + .byte 40 + .byte 117 + .byte 104 + .byte 52 + .byte 154 + .byte 247 + .byte 108 + .byte 37 + .byte 225 + .byte 112 + .byte 56 + .byte 98 + .byte 130 + .byte 253 + .byte 246 + .byte 123 + .byte 189 + .byte 150 + .byte 71 + .byte 249 + .byte 157 + .byte 206 + .byte 103 + .byte 113 + .byte 107 + .byte 118 + .byte 64 + .byte 32 + .byte 16 + .byte 170 + .byte 136 + .byte 160 + .byte 79 + .byte 39 + .byte 19 + .byte 43 + .byte 220 + .byte 176 + .byte 190 + .byte 95 + .byte 47 + .byte 233 + .byte 139 + .byte 9 + .byte 91 + .byte 173 + .byte 214 + .byte 207 + .byte 89 + .byte 30 + .byte 233 + .byte 116 + .byte 186 + .byte 183 + .byte 198 + .byte 173 + .byte 127 + .byte 63 + .byte 31 + + .text +.global sliscp_light320_permute + .type sliscp_light320_permute, @function +sliscp_light320_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 34 + ldd r21,Z+8 + ldd r20,Z+9 + ldd r19,Z+10 + ldd r18,Z+11 + ldd r27,Z+12 + ldd r26,Z+13 + ldd r23,Z+14 + ldd r22,Z+15 + ldd r5,Z+24 + ldd r4,Z+25 + ldd r3,Z+26 + ldd r2,Z+27 + ldd r9,Z+28 + ldd r8,Z+29 + ldd r7,Z+30 + ldd r6,Z+31 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ld r21,Z + ldd r20,Z+1 + ldd r19,Z+2 + ldd r18,Z+3 + ldd r27,Z+16 + ldd r26,Z+17 + ldd r23,Z+18 + ldd r22,Z+19 + ldd r5,Z+4 + ldd r4,Z+5 + ldd r3,Z+6 + ldd r2,Z+7 + ldd r9,Z+20 + ldd r8,Z+21 + ldd r7,Z+22 + ldd r6,Z+23 + ldd r13,Z+32 + ldd r12,Z+33 + ldd r11,Z+34 + ldd r10,Z+35 + ldd r25,Z+26 + ldd r24,Z+27 + ldd r15,Z+28 + ldd r14,Z+29 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r16,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r16 +#endif + ldi r30,0 +60: +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + movw r16,r18 + mov r1,r20 + mov r0,r21 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r18 + and r17,r19 + and r1,r20 + and r0,r21 + eor r22,r16 + eor r23,r17 + eor r26,r1 + eor r27,r0 + com r23 + com r26 + com r27 + ldi r16,255 + lsr r30 + rol r16 + eor r22,r16 + movw r16,r22 + mov r1,r26 + mov r0,r27 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r22 + and r17,r23 + and r1,r26 + and r0,r27 + eor r18,r16 + eor r19,r17 + eor r20,r1 + eor r21,r0 + com r19 + com r20 + com r21 + ldi r16,255 + lsr r30 + rol r16 + eor r18,r16 + pop r30 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r4 + mov r0,r5 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r4 + and r0,r5 + eor r6,r16 + eor r7,r17 + eor r8,r1 + eor r9,r0 + com r7 + com r8 + com r9 + ldi r16,255 + lsr r30 + rol r16 + eor r6,r16 + movw r16,r6 + mov r1,r8 + mov r0,r9 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r6 + and r17,r7 + and r1,r8 + and r0,r9 + eor r2,r16 + eor r3,r17 + eor r4,r1 + eor r5,r0 + com r3 + com r4 + com r5 + ldi r16,255 + lsr r30 + rol r16 + eor r2,r16 + pop r30 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + inc r30 + push r30 + mov r30,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + mov r0,r13 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + and r0,r13 + eor r14,r16 + eor r15,r17 + eor r24,r1 + eor r25,r0 + com r15 + com r24 + com r25 + ldi r16,255 + lsr r30 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r24 + mov r0,r25 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + bst r0,7 + lsl r16 + rol r17 + rol r1 + rol r0 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r24 + and r0,r25 + eor r10,r16 + eor r11,r17 + eor r12,r1 + eor r13,r0 + com r11 + com r12 + com r13 + ldi r16,255 + lsr r30 + rol r16 + eor r10,r16 + pop r30 + ldd r16,Y+1 + ldd r17,Y+2 + ldd r1,Y+3 + ldd r0,Y+4 + eor r16,r2 + eor r17,r3 + eor r1,r4 + eor r0,r5 + com r16 + com r17 + com r1 + com r0 + std Y+1,r16 + std Y+2,r17 + std Y+3,r1 + std Y+4,r0 + ldd r16,Y+5 + ldd r17,Y+6 + ldd r1,Y+7 + ldd r0,Y+8 + eor r16,r6 + eor r17,r7 + eor r1,r8 + eor r0,r9 + com r17 + com r1 + com r0 + std Y+6,r17 + std Y+7,r1 + std Y+8,r0 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r16,r0 + std Y+5,r16 + ldd r16,Y+9 + ldd r17,Y+10 + ldd r1,Y+11 + ldd r0,Y+12 + eor r16,r10 + eor r17,r11 + eor r1,r12 + eor r0,r13 + com r16 + com r17 + com r1 + com r0 + std Y+9,r16 + std Y+10,r17 + std Y+11,r1 + std Y+12,r0 + ldd r16,Y+13 + ldd r17,Y+14 + ldd r1,Y+15 + ldd r0,Y+16 + eor r16,r14 + eor r17,r15 + eor r1,r24 + eor r0,r25 + com r17 + com r1 + com r0 + std Y+14,r17 + std Y+15,r1 + std Y+16,r0 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r16,r0 + std Y+13,r16 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + com r10 + com r11 + com r12 + com r13 + eor r14,r22 + eor r15,r23 + eor r24,r26 + eor r25,r27 + com r15 + com r24 + com r25 +#if defined(RAMPZ) + elpm r0,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r0,Z +#elif defined(__AVR_TINY__) + ld r0,Z +#else + lpm +#endif + inc r30 + eor r14,r0 + movw r16,r10 + mov r1,r12 + mov r0,r13 + ldd r10,Y+1 + ldd r11,Y+2 + ldd r12,Y+3 + ldd r13,Y+4 + std Y+1,r2 + std Y+2,r3 + std Y+3,r4 + std Y+4,r5 + movw r2,r18 + movw r4,r20 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + std Y+9,r16 + std Y+10,r17 + std Y+11,r1 + std Y+12,r0 + movw r16,r14 + mov r1,r24 + mov r0,r25 + ldd r14,Y+5 + ldd r15,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + movw r6,r22 + movw r8,r26 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + std Y+13,r16 + std Y+14,r17 + std Y+15,r1 + std Y+16,r0 + ldi r17,96 + cpse r30,r17 + rjmp 60b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r21 + std Z+1,r20 + std Z+2,r19 + std Z+3,r18 + std Z+16,r27 + std Z+17,r26 + std Z+18,r23 + std Z+19,r22 + std Z+4,r5 + std Z+5,r4 + std Z+6,r3 + std Z+7,r2 + std Z+20,r9 + std Z+21,r8 + std Z+22,r7 + std Z+23,r6 + std Z+32,r13 + std Z+33,r12 + std Z+34,r11 + std Z+35,r10 + std Z+36,r25 + std Z+37,r24 + std Z+38,r15 + std Z+39,r14 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + ldd r2,Y+9 + ldd r3,Y+10 + ldd r4,Y+11 + ldd r5,Y+12 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + std Z+8,r21 + std Z+9,r20 + std Z+10,r19 + std Z+11,r18 + std Z+12,r27 + std Z+13,r26 + std Z+14,r23 + std Z+15,r22 + std Z+24,r5 + std Z+25,r4 + std Z+26,r3 + std Z+27,r2 + std Z+28,r9 + std Z+29,r8 + std Z+30,r7 + std Z+31,r6 + adiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + eor r1,r1 + ret + .size sliscp_light320_permute, .-sliscp_light320_permute + + .text +.global sliscp_light320_swap + .type sliscp_light320_swap, @function +sliscp_light320_swap: + movw r30,r24 +.L__stack_usage = 2 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ret + .size sliscp_light320_swap, .-sliscp_light320_swap + +#endif diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.c b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.c new file mode 100644 index 0000000..dd3a688 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sliscp-light.h" + +#if !defined(__AVR__) + +/** + * \brief Performs one round of the Simeck-64 block cipher. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + */ +#define simeck64_round(x, y) \ + do { \ + (y) ^= (leftRotate5((x)) & (x)) ^ leftRotate1((x)) ^ \ + 0xFFFFFFFEU ^ (_rc & 1); \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with the 8 round version of Simeck-64. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck64_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck64_round(x, y); /* Round 1 */ \ + simeck64_round(y, x); /* Round 2 */ \ + simeck64_round(x, y); /* Round 3 */ \ + simeck64_round(y, x); /* Round 4 */ \ + simeck64_round(x, y); /* Round 5 */ \ + simeck64_round(y, x); /* Round 6 */ \ + simeck64_round(x, y); /* Round 7 */ \ + simeck64_round(y, x); /* Round 8 */ \ + } while (0) + +/* Helper macros for 48-bit left rotations */ +#define leftRotate5_48(x) (((x) << 5) | ((x) >> 19)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 23)) + +/** + * \brief Performs one round of the Simeck-48 block cipher. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + */ +#define simeck48_round(x, y) \ + do { \ + (y) ^= (leftRotate5_48((x)) & (x)) ^ leftRotate1_48((x)) ^ \ + 0x00FFFFFEU ^ (_rc & 1); \ + (y) &= 0x00FFFFFFU; \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 48-bit block with the 6 round version of Simeck-48. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck48_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck48_round(x, y); /* Round 1 */ \ + simeck48_round(y, x); /* Round 2 */ \ + simeck48_round(x, y); /* Round 3 */ \ + simeck48_round(y, x); /* Round 4 */ \ + simeck48_round(x, y); /* Round 5 */ \ + simeck48_round(y, x); /* Round 6 */ \ + } while (0) + +/* Interleaved rc0, rc1, sc0, and sc1 values for each round */ +static unsigned char const sliscp_light256_RC[18 * 4] = { + 0x0f, 0x47, 0x08, 0x64, 0x04, 0xb2, 0x86, 0x6b, + 0x43, 0xb5, 0xe2, 0x6f, 0xf1, 0x37, 0x89, 0x2c, + 0x44, 0x96, 0xe6, 0xdd, 0x73, 0xee, 0xca, 0x99, + 0xe5, 0x4c, 0x17, 0xea, 0x0b, 0xf5, 0x8e, 0x0f, + 0x47, 0x07, 0x64, 0x04, 0xb2, 0x82, 0x6b, 0x43, + 0xb5, 0xa1, 0x6f, 0xf1, 0x37, 0x78, 0x2c, 0x44, + 0x96, 0xa2, 0xdd, 0x73, 0xee, 0xb9, 0x99, 0xe5, + 0x4c, 0xf2, 0xea, 0x0b, 0xf5, 0x85, 0x0f, 0x47, + 0x07, 0x23, 0x04, 0xb2, 0x82, 0xd9, 0x43, 0xb5 +}; + +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 24); /* Assumes the block is pre-swapped */ + x4 = be_load_word32(block + 16); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 12); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 8, x2); + be_store_word32(block + 24, x3); /* Assumes the block is pre-swapped */ + be_store_word32(block + 16, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 12, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spix(unsigned char block[32]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 12); + t2 = le_load_word32(block + 24); + le_store_word32(block + 24, t1); + le_store_word32(block + 12, t2); +} + +void sliscp_light256_permute_spoc(unsigned char block[32]) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x3 = be_load_word32(block + 20); + x4 = be_load_word32(block + 8); + x5 = be_load_word32(block + 12); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 16, x2); /* Assumes the block is pre-swapped */ + be_store_word32(block + 20, x3); + be_store_word32(block + 8, x4); + be_store_word32(block + 12, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spoc(unsigned char block[32]) +{ + uint64_t t1, t2; + t1 = le_load_word64(block + 8); + t2 = le_load_word64(block + 16); + le_store_word64(block + 16, t1); + le_store_word64(block + 8, t2); +} + +/* Load a big-endian 24-bit word from a byte buffer */ +#define be_load_word24(ptr) \ + ((((uint32_t)((ptr)[0])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[2]))) + +/* Store a big-endian 24-bit word into a byte buffer */ +#define be_store_word24(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 16); \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)_x; \ + } while (0) + +void sliscp_light192_permute(unsigned char block[24]) +{ + /* Interleaved rc0, rc1, sc0, and sc1 values for each round */ + static unsigned char const RC[18 * 4] = { + 0x07, 0x27, 0x08, 0x29, 0x04, 0x34, 0x0c, 0x1d, + 0x06, 0x2e, 0x0a, 0x33, 0x25, 0x19, 0x2f, 0x2a, + 0x17, 0x35, 0x38, 0x1f, 0x1c, 0x0f, 0x24, 0x10, + 0x12, 0x08, 0x36, 0x18, 0x3b, 0x0c, 0x0d, 0x14, + 0x26, 0x0a, 0x2b, 0x1e, 0x15, 0x2f, 0x3e, 0x31, + 0x3f, 0x38, 0x01, 0x09, 0x20, 0x24, 0x21, 0x2d, + 0x30, 0x36, 0x11, 0x1b, 0x28, 0x0d, 0x39, 0x16, + 0x3c, 0x2b, 0x05, 0x3d, 0x22, 0x3e, 0x27, 0x03, + 0x13, 0x01, 0x34, 0x02, 0x1a, 0x21, 0x2e, 0x23 + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables. Each 24-bit block is + * placed into a separate 32-bit word which improves efficiency below */ + x0 = be_load_word24(block); + x1 = be_load_word24(block + 3); + x2 = be_load_word24(block + 6); + x3 = be_load_word24(block + 9); + x4 = be_load_word24(block + 12); + x5 = be_load_word24(block + 15); + x6 = be_load_word24(block + 18); + x7 = be_load_word24(block + 21); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-48 to two of the 48-bit sub-blocks */ + simeck48_box(x2, x3, rc[0]); + simeck48_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0x00FFFFFFU; + x1 ^= 0x00FFFF00U ^ rc[2]; + x4 ^= 0x00FFFFFFU; + x5 ^= 0x00FFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word24(block, x0); + be_store_word24(block + 3, x1); + be_store_word24(block + 6, x2); + be_store_word24(block + 9, x3); + be_store_word24(block + 12, x4); + be_store_word24(block + 15, x5); + be_store_word24(block + 18, x6); + be_store_word24(block + 21, x7); +} + +void sliscp_light320_permute(unsigned char block[40]) +{ + /* Interleaved rc0, rc1, rc2, sc0, sc1, and sc2 values for each round */ + static unsigned char const RC[16 * 6] = { + 0x07, 0x53, 0x43, 0x50, 0x28, 0x14, 0x0a, 0x5d, + 0xe4, 0x5c, 0xae, 0x57, 0x9b, 0x49, 0x5e, 0x91, + 0x48, 0x24, 0xe0, 0x7f, 0xcc, 0x8d, 0xc6, 0x63, + 0xd1, 0xbe, 0x32, 0x53, 0xa9, 0x54, 0x1a, 0x1d, + 0x4e, 0x60, 0x30, 0x18, 0x22, 0x28, 0x75, 0x68, + 0x34, 0x9a, 0xf7, 0x6c, 0x25, 0xe1, 0x70, 0x38, + 0x62, 0x82, 0xfd, 0xf6, 0x7b, 0xbd, 0x96, 0x47, + 0xf9, 0x9d, 0xce, 0x67, 0x71, 0x6b, 0x76, 0x40, + 0x20, 0x10, 0xaa, 0x88, 0xa0, 0x4f, 0x27, 0x13, + 0x2b, 0xdc, 0xb0, 0xbe, 0x5f, 0x2f, 0xe9, 0x8b, + 0x09, 0x5b, 0xad, 0xd6, 0xcf, 0x59, 0x1e, 0xe9, + 0x74, 0xba, 0xb7, 0xc6, 0xad, 0x7f, 0x3f, 0x1f + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 12); + x4 = be_load_word32(block + 4); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + x8 = be_load_word32(block + 32); + x9 = be_load_word32(block + 36); + + /* Perform all permutation rounds */ + for (round = 0; round < 16; ++round, rc += 6) { + /* Apply Simeck-64 to three of the 64-bit sub-blocks */ + simeck64_box(x0, x1, rc[0]); + simeck64_box(x4, x5, rc[1]); + simeck64_box(x8, x9, rc[2]); + x6 ^= x8; + x7 ^= x9; + x2 ^= x4; + x3 ^= x5; + x8 ^= x0; + x9 ^= x1; + + /* Add step constants */ + x2 ^= 0xFFFFFFFFU; + x3 ^= 0xFFFFFF00U ^ rc[3]; + x6 ^= 0xFFFFFFFFU; + x7 ^= 0xFFFFFF00U ^ rc[4]; + x8 ^= 0xFFFFFFFFU; + x9 ^= 0xFFFFFF00U ^ rc[5]; + + /* Rotate the sub-blocks */ + t0 = x8; + t1 = x9; + x8 = x2; + x9 = x3; + x2 = x4; + x3 = x5; + x4 = x0; + x5 = x1; + x0 = x6; + x1 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 16, x1); /* Assumes the block is pre-swapped */ + be_store_word32(block + 8, x2); + be_store_word32(block + 12, x3); + be_store_word32(block + 4, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); + be_store_word32(block + 32, x8); + be_store_word32(block + 36, x9); +} + +void sliscp_light320_swap(unsigned char block[40]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 4); + t2 = le_load_word32(block + 16); + le_store_word32(block + 16, t1); + le_store_word32(block + 4, t2); +} + +#endif /* !__AVR__ */ diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.h b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.h new file mode 100644 index 0000000..8a5e8d5 --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-sliscp-light.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SLISCP_LIGHT_H +#define LW_INTERNAL_SLISCP_LIGHT_H + +/** + * \file internal-sliscp-light.h + * \brief sLiSCP-light permutation + * + * There are three variants of sLiSCP-light in use in the NIST submissions: + * + * \li sLiSCP-light-256 with a 256-bit block size, used in SPIX and SpoC. + * \li sLiSCP-light-192 with a 192-bit block size, used in SpoC. + * \li sLiSCP-light-320 with a 320-bit block size, used in ACE. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace, + * https://uwaterloo.ca/communications-security-lab/lwc/spix, + * https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for sLiSCP-light-256. + */ +#define SLISCP_LIGHT256_STATE_SIZE 32 + +/** + * \brief Size of the state for sLiSCP-light-192. + */ +#define SLISCP_LIGHT192_STATE_SIZE 24 + +/** + * \brief Size of the state for sLiSCP-light-320. + */ +#define SLISCP_LIGHT320_STATE_SIZE 40 + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * \param rounds Number of rounds to be performed, usually 9 or 18. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SPIX cipher. SPIX places the rate bytes at + * positions 8, 9, 10, 11, 24, 25, 26, and 27. + * + * This function assumes that bytes 24-27 have been pre-swapped with + * bytes 12-15 so that the rate portion of the state is contiguous. + * + * The sliscp_light256_swap_spix() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spix() + */ +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SPIX. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spix() + */ +void sliscp_light256_swap_spix(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SpoC-128 cipher. SpoC-128 interleaves the + * rate bytes and the mask bytes. This version assumes that the + * rate and mask are in contiguous bytes of the state. + * + * SpoC-128 absorbs bytes using the mask bytes of the state at offsets + * 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, and 31. + * It squeezes bytes using the rate bytes of the state at offsets + * 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, and 23. + * + * This function assumes that bytes 8-15 have been pre-swapped with 16-23 + * so that the rate and mask portions of the state are contiguous. + * + * The sliscp_light256_swap_spoc() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spoc() + */ +void sliscp_light256_permute_spoc(unsigned char block[32]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SpoC-128. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spoc() + */ +void sliscp_light256_swap_spoc(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 192-bit block. + * + * \param block Points to the block to be permuted. + */ +void sliscp_light192_permute(unsigned char block[24]); + +/** + * \brief Performs the sLiSCP-light permutation on a 320-bit block. + * + * \param block Points to the block to be permuted. + * + * The ACE specification refers to this permutation as "ACE" but that + * can be confused with the name of the AEAD mode so we call this + * permutation "sLiSCP-light-320" instead. + * + * ACE absorbs and squeezes data at the rate bytes 0, 1, 2, 3, 16, 17, 18, 19. + * Efficiency can suffer because of the discontinuity in rate byte positions. + * + * To counteract this, we assume that the input to the permutation has been + * pre-swapped: bytes 4, 5, 6, 7 are swapped with bytes 16, 17, 18, 19 so + * that the rate is contiguous at the start of the state. + * + * The sliscp_light320_swap() function can be used to switch between the + * canonical order and the pre-swapped order. + * + * \sa sliscp_light320_swap() + */ +void sliscp_light320_permute(unsigned char block[40]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 320-bit block. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light320_permute() + */ +void sliscp_light320_swap(unsigned char block[40]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-util.h b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ace/Implementations/crypto_hash/acehash256v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.c b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.h b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/api.h b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.c b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.c new file mode 100644 index 0000000..80b2e46 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.c @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ascon128.h" +#include "internal-ascon.h" +#include + +/** + * \brief Initialization vector for ASCON-128. + */ +#define ASCON128_IV 0x80400c0600000000ULL + +/** + * \brief Initialization vector for ASCON-128a. + */ +#define ASCON128a_IV 0x80800c0800000000ULL + +/** + * \brief Initialization vector for ASCON-80pq. + */ +#define ASCON80PQ_IV 0xa0400c06U + +aead_cipher_t const ascon128_cipher = { + "ASCON-128", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128_aead_encrypt, + ascon128_aead_decrypt +}; + +aead_cipher_t const ascon128a_cipher = { + "ASCON-128a", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128a_aead_encrypt, + ascon128a_aead_decrypt +}; + +aead_cipher_t const ascon80pq_cipher = { + "ASCON-80pq", + ASCON80PQ_KEY_SIZE, + ASCON80PQ_NONCE_SIZE, + ASCON80PQ_TAG_SIZE, + AEAD_FLAG_NONE, + ascon80pq_aead_encrypt, + ascon80pq_aead_decrypt +}; + +/** + * \brief Absorbs data into an ASCON state. + * + * \param state The state to absorb the data into. + * \param data Points to the data to be absorbed. + * \param len Length of the data to be absorbed. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_absorb + (ascon_state_t *state, const unsigned char *data, + unsigned long long len, uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block(state->B, data, rate); + ascon_permute(state, first_round); + data += rate; + len -= rate; + } + lw_xor_block(state->B, data, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; + ascon_permute(state, first_round); +} + +/** + * \brief Encrypts a block of data with an ASCON state. + * + * \param state The state to encrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to encrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_encrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_2_dest(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_2_dest(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +/** + * \brief Decrypts a block of data with an ASCON state. + * + * \param state The state to decrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to decrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_decrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_swap(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_swap(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 16, 4); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 16, 4); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k + 4, 16); + return 0; +} + +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON80PQ_TAG_SIZE) + return -1; + *mlen = clen - ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k + 4, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON80PQ_TAG_SIZE); +} diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.h b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.h new file mode 100644 index 0000000..fd9db13 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/ascon128.h @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ASCON_H +#define LWCRYPTO_ASCON_H + +#include "aead-common.h" + +/** + * \file ascon128.h + * \brief ASCON-128 encryption algorithm and related family members. + * + * The ASCON family consists of several related algorithms: + * + * \li ASCON-128 with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. + * \li ASCON-128a with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 128 bits. This is faster than ASCON-128 but may + * not be as secure. + * \li ASCON-80pq with a 160-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. This is similar to ASCON-128 but has a + * 160-bit key instead which may be more resistant against quantum computers. + * \li ASCON-HASH with a 256-bit hash output. + * + * References: https://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ASCON-128 and ASCON-128a. + */ +#define ASCON128_KEY_SIZE 16 + +/** + * \brief Size of the nonce for ASCON-128 and ASCON-128a. + */ +#define ASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-128 and ASCON-128a. + */ +#define ASCON128_TAG_SIZE 16 + +/** + * \brief Size of the key for ASCON-80pq. + */ +#define ASCON80PQ_KEY_SIZE 20 + +/** + * \brief Size of the nonce for ASCON-80pq. + */ +#define ASCON80PQ_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-80pq. + */ +#define ASCON80PQ_TAG_SIZE 16 + +/** + * \brief Size of the hash output for ASCON-HASH. + */ +#define ASCON_HASH_SIZE 32 + +/** + * \brief State information for ASCON-HASH and ASCON-XOF incremental modes. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ascon_hash_state_t; + +/** + * \brief Meta-information block for the ASCON-128 cipher. + */ +extern aead_cipher_t const ascon128_cipher; + +/** + * \brief Meta-information block for the ASCON-128a cipher. + */ +extern aead_cipher_t const ascon128a_cipher; + +/** + * \brief Meta-information block for the ASCON-80pq cipher. + */ +extern aead_cipher_t const ascon80pq_cipher; + +/** + * \brief Meta-information block for the ASCON-HASH algorithm. + */ +extern aead_hash_algorithm_t const ascon_hash_algorithm; + +/** + * \brief Meta-information block for the ASCON-XOF algorithm. + */ +extern aead_hash_algorithm_t const ascon_xof_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ASCON-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128_aead_decrypt() + */ +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128_aead_encrypt() + */ +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-128a. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128a_aead_decrypt() + */ +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128a. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128a_aead_encrypt() + */ +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-80pq. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon80pq_aead_decrypt() + */ +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-80pq. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon80pq_aead_encrypt() + */ +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ASCON-HASH. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa ascon_hash_init(), ascon_hash_absorb(), ascon_hash_squeeze() + */ +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_hash_update(), ascon_hash_finalize(), ascon_hash() + */ +void ascon_hash_init(ascon_hash_state_t *state); + +/** + * \brief Updates an ASCON-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ascon_hash_init(), ascon_hash_finalize() + */ +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ASCON-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ascon_hash_init(), ascon_hash_update() + */ +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with ASCON-XOF and generates a + * fixed-length 32 byte output. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * Use ascon_xof_squeeze() instead if you need variable-length XOF ouutput. + * + * \sa ascon_xof_init(), ascon_xof_absorb(), ascon_xof_squeeze() + */ +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-XOF hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_xof_absorb(), ascon_xof_squeeze(), ascon_xof() + */ +void ascon_xof_init(ascon_hash_state_t *state); + +/** + * \brief Aborbs more input data into an ASCON-XOF state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from an ASCON-XOF state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa ascon_xof_init(), ascon_xof_update() + */ +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/encrypt.c b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/encrypt.c new file mode 100644 index 0000000..4f35480 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "ascon128.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon128a_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon128a_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon-avr.S b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.c b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.h b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-util.h b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128av12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.c b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.h b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/api.h b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.c b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.c new file mode 100644 index 0000000..80b2e46 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.c @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ascon128.h" +#include "internal-ascon.h" +#include + +/** + * \brief Initialization vector for ASCON-128. + */ +#define ASCON128_IV 0x80400c0600000000ULL + +/** + * \brief Initialization vector for ASCON-128a. + */ +#define ASCON128a_IV 0x80800c0800000000ULL + +/** + * \brief Initialization vector for ASCON-80pq. + */ +#define ASCON80PQ_IV 0xa0400c06U + +aead_cipher_t const ascon128_cipher = { + "ASCON-128", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128_aead_encrypt, + ascon128_aead_decrypt +}; + +aead_cipher_t const ascon128a_cipher = { + "ASCON-128a", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128a_aead_encrypt, + ascon128a_aead_decrypt +}; + +aead_cipher_t const ascon80pq_cipher = { + "ASCON-80pq", + ASCON80PQ_KEY_SIZE, + ASCON80PQ_NONCE_SIZE, + ASCON80PQ_TAG_SIZE, + AEAD_FLAG_NONE, + ascon80pq_aead_encrypt, + ascon80pq_aead_decrypt +}; + +/** + * \brief Absorbs data into an ASCON state. + * + * \param state The state to absorb the data into. + * \param data Points to the data to be absorbed. + * \param len Length of the data to be absorbed. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_absorb + (ascon_state_t *state, const unsigned char *data, + unsigned long long len, uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block(state->B, data, rate); + ascon_permute(state, first_round); + data += rate; + len -= rate; + } + lw_xor_block(state->B, data, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; + ascon_permute(state, first_round); +} + +/** + * \brief Encrypts a block of data with an ASCON state. + * + * \param state The state to encrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to encrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_encrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_2_dest(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_2_dest(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +/** + * \brief Decrypts a block of data with an ASCON state. + * + * \param state The state to decrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to decrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_decrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_swap(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_swap(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 16, 4); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 16, 4); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k + 4, 16); + return 0; +} + +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON80PQ_TAG_SIZE) + return -1; + *mlen = clen - ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k + 4, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON80PQ_TAG_SIZE); +} diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.h b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.h new file mode 100644 index 0000000..fd9db13 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/ascon128.h @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ASCON_H +#define LWCRYPTO_ASCON_H + +#include "aead-common.h" + +/** + * \file ascon128.h + * \brief ASCON-128 encryption algorithm and related family members. + * + * The ASCON family consists of several related algorithms: + * + * \li ASCON-128 with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. + * \li ASCON-128a with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 128 bits. This is faster than ASCON-128 but may + * not be as secure. + * \li ASCON-80pq with a 160-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. This is similar to ASCON-128 but has a + * 160-bit key instead which may be more resistant against quantum computers. + * \li ASCON-HASH with a 256-bit hash output. + * + * References: https://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ASCON-128 and ASCON-128a. + */ +#define ASCON128_KEY_SIZE 16 + +/** + * \brief Size of the nonce for ASCON-128 and ASCON-128a. + */ +#define ASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-128 and ASCON-128a. + */ +#define ASCON128_TAG_SIZE 16 + +/** + * \brief Size of the key for ASCON-80pq. + */ +#define ASCON80PQ_KEY_SIZE 20 + +/** + * \brief Size of the nonce for ASCON-80pq. + */ +#define ASCON80PQ_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-80pq. + */ +#define ASCON80PQ_TAG_SIZE 16 + +/** + * \brief Size of the hash output for ASCON-HASH. + */ +#define ASCON_HASH_SIZE 32 + +/** + * \brief State information for ASCON-HASH and ASCON-XOF incremental modes. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ascon_hash_state_t; + +/** + * \brief Meta-information block for the ASCON-128 cipher. + */ +extern aead_cipher_t const ascon128_cipher; + +/** + * \brief Meta-information block for the ASCON-128a cipher. + */ +extern aead_cipher_t const ascon128a_cipher; + +/** + * \brief Meta-information block for the ASCON-80pq cipher. + */ +extern aead_cipher_t const ascon80pq_cipher; + +/** + * \brief Meta-information block for the ASCON-HASH algorithm. + */ +extern aead_hash_algorithm_t const ascon_hash_algorithm; + +/** + * \brief Meta-information block for the ASCON-XOF algorithm. + */ +extern aead_hash_algorithm_t const ascon_xof_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ASCON-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128_aead_decrypt() + */ +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128_aead_encrypt() + */ +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-128a. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128a_aead_decrypt() + */ +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128a. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128a_aead_encrypt() + */ +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-80pq. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon80pq_aead_decrypt() + */ +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-80pq. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon80pq_aead_encrypt() + */ +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ASCON-HASH. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa ascon_hash_init(), ascon_hash_absorb(), ascon_hash_squeeze() + */ +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_hash_update(), ascon_hash_finalize(), ascon_hash() + */ +void ascon_hash_init(ascon_hash_state_t *state); + +/** + * \brief Updates an ASCON-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ascon_hash_init(), ascon_hash_finalize() + */ +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ASCON-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ascon_hash_init(), ascon_hash_update() + */ +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with ASCON-XOF and generates a + * fixed-length 32 byte output. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * Use ascon_xof_squeeze() instead if you need variable-length XOF ouutput. + * + * \sa ascon_xof_init(), ascon_xof_absorb(), ascon_xof_squeeze() + */ +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-XOF hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_xof_absorb(), ascon_xof_squeeze(), ascon_xof() + */ +void ascon_xof_init(ascon_hash_state_t *state); + +/** + * \brief Aborbs more input data into an ASCON-XOF state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from an ASCON-XOF state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa ascon_xof_init(), ascon_xof_update() + */ +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/encrypt.c b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/encrypt.c new file mode 100644 index 0000000..f32284a --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "ascon128.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon-avr.S b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.c b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.h b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-util.h b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon128v12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.c b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.h b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/api.h b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/api.h new file mode 100644 index 0000000..f99b349 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 20 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.c b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.c new file mode 100644 index 0000000..80b2e46 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.c @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ascon128.h" +#include "internal-ascon.h" +#include + +/** + * \brief Initialization vector for ASCON-128. + */ +#define ASCON128_IV 0x80400c0600000000ULL + +/** + * \brief Initialization vector for ASCON-128a. + */ +#define ASCON128a_IV 0x80800c0800000000ULL + +/** + * \brief Initialization vector for ASCON-80pq. + */ +#define ASCON80PQ_IV 0xa0400c06U + +aead_cipher_t const ascon128_cipher = { + "ASCON-128", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128_aead_encrypt, + ascon128_aead_decrypt +}; + +aead_cipher_t const ascon128a_cipher = { + "ASCON-128a", + ASCON128_KEY_SIZE, + ASCON128_NONCE_SIZE, + ASCON128_TAG_SIZE, + AEAD_FLAG_NONE, + ascon128a_aead_encrypt, + ascon128a_aead_decrypt +}; + +aead_cipher_t const ascon80pq_cipher = { + "ASCON-80pq", + ASCON80PQ_KEY_SIZE, + ASCON80PQ_NONCE_SIZE, + ASCON80PQ_TAG_SIZE, + AEAD_FLAG_NONE, + ascon80pq_aead_encrypt, + ascon80pq_aead_decrypt +}; + +/** + * \brief Absorbs data into an ASCON state. + * + * \param state The state to absorb the data into. + * \param data Points to the data to be absorbed. + * \param len Length of the data to be absorbed. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_absorb + (ascon_state_t *state, const unsigned char *data, + unsigned long long len, uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block(state->B, data, rate); + ascon_permute(state, first_round); + data += rate; + len -= rate; + } + lw_xor_block(state->B, data, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; + ascon_permute(state, first_round); +} + +/** + * \brief Encrypts a block of data with an ASCON state. + * + * \param state The state to encrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to encrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_encrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_2_dest(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_2_dest(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +/** + * \brief Decrypts a block of data with an ASCON state. + * + * \param state The state to decrypt with. + * \param dest Points to the destination buffer. + * \param src Points to the source buffer. + * \param len Length of the data to decrypt from \a src into \a dest. + * \param rate Block rate, which is either 8 or 16. + * \param first_round First round of the permutation to apply each block. + */ +static void ascon_decrypt + (ascon_state_t *state, unsigned char *dest, + const unsigned char *src, unsigned long long len, + uint8_t rate, uint8_t first_round) +{ + while (len >= rate) { + lw_xor_block_swap(dest, state->B, src, rate); + ascon_permute(state, first_round); + dest += rate; + src += rate; + len -= rate; + } + lw_xor_block_swap(dest, state->B, src, (unsigned)len); + state->B[(unsigned)len] ^= 0x80; +} + +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 16, 4); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k, 16); + return 0; +} + +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON128_TAG_SIZE) + return -1; + *mlen = clen - ASCON128_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word64(state.B, ASCON128a_IV); + memcpy(state.B + 8, k, ASCON128_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON128_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, ASCON128_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 16, 4); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 16, 4); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 16, k, ASCON128_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON128_TAG_SIZE); +} + +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Encrypt the plaintext to create the ciphertext */ + ascon_encrypt(&state, c, m, mlen, 8, 6); + + /* Finalize and compute the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block_2_src(c + mlen, state.B + 24, k + 4, 16); + return 0; +} + +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ascon_state_t state; + (void)nsec; + + /* Set the length of the returned plaintext */ + if (clen < ASCON80PQ_TAG_SIZE) + return -1; + *mlen = clen - ASCON80PQ_TAG_SIZE; + + /* Initialize the ASCON state */ + be_store_word32(state.B, ASCON80PQ_IV); + memcpy(state.B + 4, k, ASCON80PQ_KEY_SIZE); + memcpy(state.B + 24, npub, ASCON80PQ_NONCE_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 20, k, ASCON80PQ_KEY_SIZE); + + /* Absorb the associated data into the state */ + if (adlen > 0) + ascon_absorb(&state, ad, adlen, 8, 6); + + /* Separator between the associated data and the payload */ + state.B[39] ^= 0x01; + + /* Decrypt the ciphertext to create the plaintext */ + ascon_decrypt(&state, m, c, *mlen, 8, 6); + + /* Finalize and check the authentication tag */ + lw_xor_block(state.B + 8, k, ASCON80PQ_KEY_SIZE); + ascon_permute(&state, 0); + lw_xor_block(state.B + 24, k + 4, 16); + return aead_check_tag + (m, *mlen, state.B + 24, c + *mlen, ASCON80PQ_TAG_SIZE); +} diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.h b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.h new file mode 100644 index 0000000..fd9db13 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/ascon128.h @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ASCON_H +#define LWCRYPTO_ASCON_H + +#include "aead-common.h" + +/** + * \file ascon128.h + * \brief ASCON-128 encryption algorithm and related family members. + * + * The ASCON family consists of several related algorithms: + * + * \li ASCON-128 with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. + * \li ASCON-128a with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 128 bits. This is faster than ASCON-128 but may + * not be as secure. + * \li ASCON-80pq with a 160-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. This is similar to ASCON-128 but has a + * 160-bit key instead which may be more resistant against quantum computers. + * \li ASCON-HASH with a 256-bit hash output. + * + * References: https://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ASCON-128 and ASCON-128a. + */ +#define ASCON128_KEY_SIZE 16 + +/** + * \brief Size of the nonce for ASCON-128 and ASCON-128a. + */ +#define ASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-128 and ASCON-128a. + */ +#define ASCON128_TAG_SIZE 16 + +/** + * \brief Size of the key for ASCON-80pq. + */ +#define ASCON80PQ_KEY_SIZE 20 + +/** + * \brief Size of the nonce for ASCON-80pq. + */ +#define ASCON80PQ_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-80pq. + */ +#define ASCON80PQ_TAG_SIZE 16 + +/** + * \brief Size of the hash output for ASCON-HASH. + */ +#define ASCON_HASH_SIZE 32 + +/** + * \brief State information for ASCON-HASH and ASCON-XOF incremental modes. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ascon_hash_state_t; + +/** + * \brief Meta-information block for the ASCON-128 cipher. + */ +extern aead_cipher_t const ascon128_cipher; + +/** + * \brief Meta-information block for the ASCON-128a cipher. + */ +extern aead_cipher_t const ascon128a_cipher; + +/** + * \brief Meta-information block for the ASCON-80pq cipher. + */ +extern aead_cipher_t const ascon80pq_cipher; + +/** + * \brief Meta-information block for the ASCON-HASH algorithm. + */ +extern aead_hash_algorithm_t const ascon_hash_algorithm; + +/** + * \brief Meta-information block for the ASCON-XOF algorithm. + */ +extern aead_hash_algorithm_t const ascon_xof_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ASCON-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128_aead_decrypt() + */ +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128_aead_encrypt() + */ +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-128a. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128a_aead_decrypt() + */ +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128a. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128a_aead_encrypt() + */ +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-80pq. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon80pq_aead_decrypt() + */ +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-80pq. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon80pq_aead_encrypt() + */ +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ASCON-HASH. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa ascon_hash_init(), ascon_hash_absorb(), ascon_hash_squeeze() + */ +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_hash_update(), ascon_hash_finalize(), ascon_hash() + */ +void ascon_hash_init(ascon_hash_state_t *state); + +/** + * \brief Updates an ASCON-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ascon_hash_init(), ascon_hash_finalize() + */ +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ASCON-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ascon_hash_init(), ascon_hash_update() + */ +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with ASCON-XOF and generates a + * fixed-length 32 byte output. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * Use ascon_xof_squeeze() instead if you need variable-length XOF ouutput. + * + * \sa ascon_xof_init(), ascon_xof_absorb(), ascon_xof_squeeze() + */ +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-XOF hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_xof_absorb(), ascon_xof_squeeze(), ascon_xof() + */ +void ascon_xof_init(ascon_hash_state_t *state); + +/** + * \brief Aborbs more input data into an ASCON-XOF state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from an ASCON-XOF state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa ascon_xof_init(), ascon_xof_update() + */ +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/encrypt.c b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/encrypt.c new file mode 100644 index 0000000..08b7dc9 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "ascon128.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon80pq_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return ascon80pq_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon-avr.S b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.c b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.h b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-util.h b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ascon/Implementations/crypto_aead/ascon80pqv12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.c b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.h b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/api.h b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon-hash.c b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon-hash.c new file mode 100644 index 0000000..b2c570d --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon-hash.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ascon128.h" +#include "internal-ascon.h" +#include + +#define ASCON_HASH_RATE 8 +#define ascon_hash_permute() \ + ascon_permute((ascon_state_t *)(state->s.state), 0) + +aead_hash_algorithm_t const ascon_hash_algorithm = { + "ASCON-HASH", + sizeof(ascon_hash_state_t), + ASCON_HASH_SIZE, + AEAD_FLAG_NONE, + ascon_hash, + (aead_hash_init_t)ascon_hash_init, + (aead_hash_update_t)ascon_hash_update, + (aead_hash_finalize_t)ascon_hash_finalize, + 0, /* absorb */ + 0 /* squeeze */ +}; + +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + ascon_hash_state_t state; + ascon_hash_init(&state); + ascon_hash_update(&state, in, inlen); + ascon_hash_finalize(&state, out); + return 0; +} + +void ascon_hash_init(ascon_hash_state_t *state) +{ + static unsigned char const hash_iv[40] = { + 0xee, 0x93, 0x98, 0xaa, 0xdb, 0x67, 0xf0, 0x3d, + 0x8b, 0xb2, 0x18, 0x31, 0xc6, 0x0f, 0x10, 0x02, + 0xb4, 0x8a, 0x92, 0xdb, 0x98, 0xd5, 0xda, 0x62, + 0x43, 0x18, 0x99, 0x21, 0xb8, 0xf8, 0xe3, 0xe8, + 0x34, 0x8f, 0xa5, 0xc9, 0xd5, 0x25, 0xe1, 0x40 + }; + memcpy(state->s.state, hash_iv, sizeof(hash_iv)); + state->s.count = 0; + state->s.mode = 0; +} + +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned temp; + + /* Handle the partial left-over block from last time */ + if (state->s.count) { + temp = ASCON_HASH_RATE - state->s.count; + if (temp > inlen) { + temp = (unsigned)inlen; + lw_xor_block(state->s.state + state->s.count, in, temp); + state->s.count += temp; + return; + } + lw_xor_block(state->s.state + state->s.count, in, temp); + state->s.count = 0; + in += temp; + inlen -= temp; + ascon_hash_permute(); + } + + /* Process full blocks that are aligned at state->s.count == 0 */ + while (inlen >= ASCON_HASH_RATE) { + lw_xor_block(state->s.state, in, ASCON_HASH_RATE); + in += ASCON_HASH_RATE; + inlen -= ASCON_HASH_RATE; + ascon_hash_permute(); + } + + /* Process the left-over block at the end of the input */ + temp = (unsigned)inlen; + lw_xor_block(state->s.state, in, temp); + state->s.count = temp; +} + +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out) +{ + unsigned index; + + /* Pad the final block */ + state->s.state[state->s.count] ^= 0x80; + + /* Squeeze out the finalized hash value */ + for (index = 0; index < ASCON_HASH_SIZE; index += ASCON_HASH_RATE) { + ascon_hash_permute(); + memcpy(out, state->s.state, ASCON_HASH_RATE); + out += ASCON_HASH_RATE; + } +} diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon128.h b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon128.h new file mode 100644 index 0000000..fd9db13 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/ascon128.h @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ASCON_H +#define LWCRYPTO_ASCON_H + +#include "aead-common.h" + +/** + * \file ascon128.h + * \brief ASCON-128 encryption algorithm and related family members. + * + * The ASCON family consists of several related algorithms: + * + * \li ASCON-128 with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. + * \li ASCON-128a with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 128 bits. This is faster than ASCON-128 but may + * not be as secure. + * \li ASCON-80pq with a 160-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. This is similar to ASCON-128 but has a + * 160-bit key instead which may be more resistant against quantum computers. + * \li ASCON-HASH with a 256-bit hash output. + * + * References: https://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ASCON-128 and ASCON-128a. + */ +#define ASCON128_KEY_SIZE 16 + +/** + * \brief Size of the nonce for ASCON-128 and ASCON-128a. + */ +#define ASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-128 and ASCON-128a. + */ +#define ASCON128_TAG_SIZE 16 + +/** + * \brief Size of the key for ASCON-80pq. + */ +#define ASCON80PQ_KEY_SIZE 20 + +/** + * \brief Size of the nonce for ASCON-80pq. + */ +#define ASCON80PQ_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-80pq. + */ +#define ASCON80PQ_TAG_SIZE 16 + +/** + * \brief Size of the hash output for ASCON-HASH. + */ +#define ASCON_HASH_SIZE 32 + +/** + * \brief State information for ASCON-HASH and ASCON-XOF incremental modes. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ascon_hash_state_t; + +/** + * \brief Meta-information block for the ASCON-128 cipher. + */ +extern aead_cipher_t const ascon128_cipher; + +/** + * \brief Meta-information block for the ASCON-128a cipher. + */ +extern aead_cipher_t const ascon128a_cipher; + +/** + * \brief Meta-information block for the ASCON-80pq cipher. + */ +extern aead_cipher_t const ascon80pq_cipher; + +/** + * \brief Meta-information block for the ASCON-HASH algorithm. + */ +extern aead_hash_algorithm_t const ascon_hash_algorithm; + +/** + * \brief Meta-information block for the ASCON-XOF algorithm. + */ +extern aead_hash_algorithm_t const ascon_xof_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ASCON-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128_aead_decrypt() + */ +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128_aead_encrypt() + */ +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-128a. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128a_aead_decrypt() + */ +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128a. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128a_aead_encrypt() + */ +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-80pq. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon80pq_aead_decrypt() + */ +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-80pq. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon80pq_aead_encrypt() + */ +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ASCON-HASH. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa ascon_hash_init(), ascon_hash_absorb(), ascon_hash_squeeze() + */ +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_hash_update(), ascon_hash_finalize(), ascon_hash() + */ +void ascon_hash_init(ascon_hash_state_t *state); + +/** + * \brief Updates an ASCON-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ascon_hash_init(), ascon_hash_finalize() + */ +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ASCON-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ascon_hash_init(), ascon_hash_update() + */ +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with ASCON-XOF and generates a + * fixed-length 32 byte output. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * Use ascon_xof_squeeze() instead if you need variable-length XOF ouutput. + * + * \sa ascon_xof_init(), ascon_xof_absorb(), ascon_xof_squeeze() + */ +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-XOF hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_xof_absorb(), ascon_xof_squeeze(), ascon_xof() + */ +void ascon_xof_init(ascon_hash_state_t *state); + +/** + * \brief Aborbs more input data into an ASCON-XOF state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from an ASCON-XOF state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa ascon_xof_init(), ascon_xof_update() + */ +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/hash.c b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/hash.c new file mode 100644 index 0000000..5c69526 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "ascon128.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return ascon_hash(out, in, inlen); +} diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon-avr.S b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.c b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.h b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-util.h b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconhashv12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.c b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.h b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/api.h b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon-xof.c b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon-xof.c new file mode 100644 index 0000000..1d1e71f --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon-xof.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "ascon128.h" +#include "internal-ascon.h" +#include + +#define ASCON_XOF_RATE 8 +#define ascon_xof_permute() \ + ascon_permute((ascon_state_t *)(state->s.state), 0) + +aead_hash_algorithm_t const ascon_xof_algorithm = { + "ASCON-XOF", + sizeof(ascon_hash_state_t), + ASCON_HASH_SIZE, + AEAD_FLAG_NONE, + ascon_xof, + (aead_hash_init_t)ascon_xof_init, + 0, /* update */ + 0, /* finalize */ + (aead_xof_absorb_t)ascon_xof_absorb, + (aead_xof_squeeze_t)ascon_xof_squeeze +}; + +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + ascon_hash_state_t state; + ascon_xof_init(&state); + ascon_xof_absorb(&state, in, inlen); + ascon_xof_squeeze(&state, out, ASCON_HASH_SIZE); + return 0; +} + +void ascon_xof_init(ascon_hash_state_t *state) +{ + static unsigned char const xof_iv[40] = { + 0xb5, 0x7e, 0x27, 0x3b, 0x81, 0x4c, 0xd4, 0x16, + 0x2b, 0x51, 0x04, 0x25, 0x62, 0xae, 0x24, 0x20, + 0x66, 0xa3, 0xa7, 0x76, 0x8d, 0xdf, 0x22, 0x18, + 0x5a, 0xad, 0x0a, 0x7a, 0x81, 0x53, 0x65, 0x0c, + 0x4f, 0x3e, 0x0e, 0x32, 0x53, 0x94, 0x93, 0xb6 + }; + memcpy(state->s.state, xof_iv, sizeof(xof_iv)); + state->s.count = 0; + state->s.mode = 0; +} + +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + if (state->s.mode) { + /* We were squeezing output - go back to the absorb phase */ + state->s.mode = 0; + state->s.count = 0; + ascon_xof_permute(); + } + ascon_hash_update(state, in, inlen); +} + +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen) +{ + unsigned temp; + + /* Pad the final input block if we were still in the absorb phase */ + if (!state->s.mode) { + state->s.state[state->s.count] ^= 0x80; + state->s.count = 0; + state->s.mode = 1; + } + + /* Handle left-over partial blocks from last time */ + if (state->s.count) { + temp = ASCON_XOF_RATE - state->s.count; + if (temp > outlen) { + temp = (unsigned)outlen; + memcpy(out, state->s.state + state->s.count, temp); + state->s.count += temp; + return; + } + memcpy(out, state->s.state + state->s.count, temp); + out += temp; + outlen -= temp; + state->s.count = 0; + } + + /* Handle full blocks */ + while (outlen >= ASCON_XOF_RATE) { + ascon_xof_permute(); + memcpy(out, state->s.state, ASCON_XOF_RATE); + out += ASCON_XOF_RATE; + outlen -= ASCON_XOF_RATE; + } + + /* Handle the left-over block */ + if (outlen > 0) { + temp = (unsigned)outlen; + ascon_xof_permute(); + memcpy(out, state->s.state, temp); + state->s.count = temp; + } +} diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon128.h b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon128.h new file mode 100644 index 0000000..fd9db13 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/ascon128.h @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ASCON_H +#define LWCRYPTO_ASCON_H + +#include "aead-common.h" + +/** + * \file ascon128.h + * \brief ASCON-128 encryption algorithm and related family members. + * + * The ASCON family consists of several related algorithms: + * + * \li ASCON-128 with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. + * \li ASCON-128a with a 128-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 128 bits. This is faster than ASCON-128 but may + * not be as secure. + * \li ASCON-80pq with a 160-bit key, a 128-bit nonce, a 128-bit authentication + * tag, and a block rate of 64 bits. This is similar to ASCON-128 but has a + * 160-bit key instead which may be more resistant against quantum computers. + * \li ASCON-HASH with a 256-bit hash output. + * + * References: https://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ASCON-128 and ASCON-128a. + */ +#define ASCON128_KEY_SIZE 16 + +/** + * \brief Size of the nonce for ASCON-128 and ASCON-128a. + */ +#define ASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-128 and ASCON-128a. + */ +#define ASCON128_TAG_SIZE 16 + +/** + * \brief Size of the key for ASCON-80pq. + */ +#define ASCON80PQ_KEY_SIZE 20 + +/** + * \brief Size of the nonce for ASCON-80pq. + */ +#define ASCON80PQ_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for ASCON-80pq. + */ +#define ASCON80PQ_TAG_SIZE 16 + +/** + * \brief Size of the hash output for ASCON-HASH. + */ +#define ASCON_HASH_SIZE 32 + +/** + * \brief State information for ASCON-HASH and ASCON-XOF incremental modes. + */ +typedef union +{ + struct { + unsigned char state[40]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} ascon_hash_state_t; + +/** + * \brief Meta-information block for the ASCON-128 cipher. + */ +extern aead_cipher_t const ascon128_cipher; + +/** + * \brief Meta-information block for the ASCON-128a cipher. + */ +extern aead_cipher_t const ascon128a_cipher; + +/** + * \brief Meta-information block for the ASCON-80pq cipher. + */ +extern aead_cipher_t const ascon80pq_cipher; + +/** + * \brief Meta-information block for the ASCON-HASH algorithm. + */ +extern aead_hash_algorithm_t const ascon_hash_algorithm; + +/** + * \brief Meta-information block for the ASCON-XOF algorithm. + */ +extern aead_hash_algorithm_t const ascon_xof_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ASCON-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128_aead_decrypt() + */ +int ascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128_aead_encrypt() + */ +int ascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-128a. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon128a_aead_decrypt() + */ +int ascon128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-128a. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon128a_aead_encrypt() + */ +int ascon128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ASCON-80pq. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa ascon80pq_aead_decrypt() + */ +int ascon80pq_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ASCON-80pq. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 20 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa ascon80pq_aead_encrypt() + */ +int ascon80pq_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ASCON-HASH. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa ascon_hash_init(), ascon_hash_absorb(), ascon_hash_squeeze() + */ +int ascon_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-HASH hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_hash_update(), ascon_hash_finalize(), ascon_hash() + */ +void ascon_hash_init(ascon_hash_state_t *state); + +/** + * \brief Updates an ASCON-HASH state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa ascon_hash_init(), ascon_hash_finalize() + */ +void ascon_hash_update + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an ASCON-HASH hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa ascon_hash_init(), ascon_hash_update() + */ +void ascon_hash_finalize + (ascon_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with ASCON-XOF and generates a + * fixed-length 32 byte output. + * + * \param out Buffer to receive the hash output which must be at least + * ASCON_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * Use ascon_xof_squeeze() instead if you need variable-length XOF ouutput. + * + * \sa ascon_xof_init(), ascon_xof_absorb(), ascon_xof_squeeze() + */ +int ascon_xof + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an ASCON-XOF hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa ascon_xof_absorb(), ascon_xof_squeeze(), ascon_xof() + */ +void ascon_xof_init(ascon_hash_state_t *state); + +/** + * \brief Aborbs more input data into an ASCON-XOF state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +void ascon_xof_absorb + (ascon_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from an ASCON-XOF state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa ascon_xof_init(), ascon_xof_update() + */ +void ascon_xof_squeeze + (ascon_hash_state_t *state, unsigned char *out, unsigned long long outlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/hash.c b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/hash.c new file mode 100644 index 0000000..6f37a9d --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "ascon128.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return ascon_xof(out, in, inlen); +} diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon-avr.S b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.c b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.h b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-util.h b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/ascon/Implementations/crypto_hash/asconxofv12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.c b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/api.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.c b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.c new file mode 100644 index 0000000..ceb0fd6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.c @@ -0,0 +1,556 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "comet.h" +#include "internal-cham.h" +#include "internal-speck64.h" +#include "internal-util.h" +#include + +aead_cipher_t const comet_128_cham_cipher = { + "COMET-128_CHAM-128/128", + COMET_KEY_SIZE, + COMET_128_NONCE_SIZE, + COMET_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_128_cham_aead_encrypt, + comet_128_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_cham_cipher = { + "COMET-64_CHAM-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_cham_aead_encrypt, + comet_64_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_speck_cipher = { + "COMET-64_SPECK-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_speck_aead_encrypt, + comet_64_speck_aead_decrypt +}; + +/** + * \brief Adjusts the Z state to generate the key to use on the next block. + * + * \param Z The Z state to be adjusted. + */ +static void comet_adjust_block_key(unsigned char Z[16]) +{ + /* Doubles the 64-bit prefix to Z in the F(2^64) field */ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)(Z[7])) >> 7); + for (index = 7; index > 0; --index) + Z[index] = (Z[index] << 1) | (Z[index - 1] >> 7); + Z[0] = (Z[0] << 1) ^ (mask & 0x1B); +} + +/* Function prototype for the encrypt function of the underyling cipher */ +typedef void (*comet_encrypt_block_t) + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Processes the associated data for COMET. + * + * \param Y Internal COMET block state of \a block_size bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param block_size Size of the block for the underlying cipher. + * \param encrypt Encryption function for the underlying cipher. + * \param ad Points to the associated data. + * \param adlen Number of bytes of associated data; must be >= 1. + */ +static void comet_process_ad + (unsigned char *Y, unsigned char Z[16], unsigned block_size, + comet_encrypt_block_t encrypt, const unsigned char *ad, + unsigned long long adlen) +{ + /* Domain separator for associated data */ + Z[15] ^= 0x08; + + /* Process all associated data blocks except the last partial block */ + while (adlen >= block_size) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, block_size); + ad += block_size; + adlen -= block_size; + } + + /* Pad and process the partial block on the end */ + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + Z[15] ^= 0x10; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Shuffles the words in a 128-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_128 + (unsigned char out[16], const unsigned char in[16]) +{ + uint32_t x0, x1, x2, x3; + x0 = le_load_word32(in); + x1 = le_load_word32(in + 4); + x2 = le_load_word32(in + 8); + x3 = le_load_word32(in + 12); + le_store_word32(out, x3); + le_store_word32(out + 4, rightRotate1(x2)); + le_store_word32(out + 8, x0); + le_store_word32(out + 12, x1); +} + +/** + * \brief Shuffles the words in a 64-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_64 + (unsigned char out[8], const unsigned char in[8]) +{ + uint32_t x01 = le_load_word32(in); + uint16_t x2 = ((uint16_t)(in[4])) | (((uint16_t)(in[5])) << 8); + out[0] = in[6]; + out[1] = in[7]; + x2 = (x2 >> 1) | (x2 << 15); + out[2] = (uint8_t)x2; + out[3] = (uint8_t)(x2 >> 8); + le_store_word32(out + 4, x01); +} + +/** + * \brief Encrypts the plaintext with COMET-128 to produce the ciphertext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, 16); + lw_xor_block_2_src(c, m, Ys, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Encrypts the plaintext with COMET-64 to produce the ciphertext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, 8); + lw_xor_block_2_src(c, m, Ys, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-128 to produce the plaintext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 16); + lw_xor_block(Y, m, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-64 to produce the plaintext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 8); + lw_xor_block(Y, m, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_128(Y, Z, cham128_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_128_TAG_SIZE) + return -1; + *mlen = clen - COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_128_TAG_SIZE) + comet_decrypt_128(Y, Z, cham128_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_128_TAG_SIZE); +} + +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, cham64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, cham64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} + +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, speck64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, speck64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.h new file mode 100644 index 0000000..d1b24a6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/comet.h @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_COMET_H +#define LWCRYPTO_COMET_H + +#include "aead-common.h" + +/** + * \file comet.h + * \brief COMET authenticated encryption algorithm. + * + * COMET is a family of authenticated encryption algorithms that are + * built around an underlying block cipher. This library implements + * three members of the family: + * + * \li COMET-128_CHAM-128/128 which has a 128-bit key, a 128-bit nonce, + * and a 128-bit tag, built around the CHAM-128/128 block cipher. + * \li COMET-64_CHAM-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the CHAM-64/128 block cipher. + * \li COMET-64_SPECK-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the SPECK-64/128 block cipher. + * + * There is also another family member that is built around AES but + * this library does not implement that version. + * + * References: https://www.isical.ac.in/~lightweight/comet/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all COMET family members. + */ +#define COMET_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for the 128-bit versions of COMET. + */ +#define COMET_128_TAG_SIZE 16 + +/** + * \brief Size of the authentication tag for the 64-bit versions of COMET. + */ +#define COMET_64_TAG_SIZE 8 + +/** + * \brief Size of the nonce for the 128-bit versions of COMET. + */ +#define COMET_128_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for the 64-bit versions of COMET. + */ +#define COMET_64_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the COMET-128_CHAM-128/128 cipher. + */ +extern aead_cipher_t const comet_128_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_CHAM-64/128 cipher. + */ +extern aead_cipher_t const comet_64_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_SPECK-64/128 cipher. + */ +extern aead_cipher_t const comet_64_speck_cipher; + +/** + * \brief Encrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_128_cham_aead_decrypt() + */ +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_128_cham_aead_encrypt() + */ +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_cham_aead_decrypt() + */ +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_cham_aead_encrypt() + */ +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_speck_aead_decrypt() + */ +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_speck_aead_encrypt() + */ +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/encrypt.c b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..66c5ad7 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "comet.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_128_cham_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_128_cham_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham-avr.S b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham-avr.S new file mode 100644 index 0000000..514a09a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham-avr.S @@ -0,0 +1,915 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global cham128_128_encrypt + .type cham128_128_encrypt, @function +cham128_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 48 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+21,r2 + std Y+22,r3 + std Y+23,r4 + std Y+24,r5 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+17,r2 + std Y+18,r3 + std Y+19,r4 + std Y+20,r5 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+29,r2 + std Y+30,r3 + std Y+31,r4 + std Y+32,r5 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+25,r2 + std Y+26,r3 + std Y+27,r4 + std Y+28,r5 + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r18,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + mov r30,r1 +197: + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+1 + eor r10,r0 + ldd r0,Y+2 + eor r11,r0 + ldd r0,Y+3 + eor r12,r0 + ldd r0,Y+4 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+5 + ldd r11,Y+6 + ldd r12,Y+7 + ldd r13,Y+8 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+9 + eor r10,r0 + ldd r0,Y+10 + eor r11,r0 + ldd r0,Y+11 + eor r12,r0 + ldd r0,Y+12 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+17 + eor r10,r0 + ldd r0,Y+18 + eor r11,r0 + ldd r0,Y+19 + eor r12,r0 + ldd r0,Y+20 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+25 + eor r10,r0 + ldd r0,Y+26 + eor r11,r0 + ldd r0,Y+27 + eor r12,r0 + ldd r0,Y+28 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+29 + ldd r11,Y+30 + ldd r12,Y+31 + ldd r13,Y+32 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + ldi r31,80 + cpse r30,r31 + rjmp 197b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r18 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size cham128_128_encrypt, .-cham128_128_encrypt + + .text +.global cham64_128_encrypt + .type cham64_128_encrypt, @function +cham64_128_encrypt: + push r28 + push r29 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 38 + ld r18,Z + ldd r19,Z+1 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+1,r18 + std Y+2,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+19,r22 + std Y+20,r23 + ldd r18,Z+2 + ldd r19,Z+3 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+3,r18 + std Y+4,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+17,r22 + std Y+18,r23 + ldd r18,Z+4 + ldd r19,Z+5 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+5,r18 + std Y+6,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+23,r22 + std Y+24,r23 + ldd r18,Z+6 + ldd r19,Z+7 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+7,r18 + std Y+8,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+21,r22 + std Y+22,r23 + ldd r18,Z+8 + ldd r19,Z+9 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+9,r18 + std Y+10,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+27,r22 + std Y+28,r23 + ldd r18,Z+10 + ldd r19,Z+11 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+11,r18 + std Y+12,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+25,r22 + std Y+26,r23 + ldd r18,Z+12 + ldd r19,Z+13 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+13,r18 + std Y+14,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+31,r22 + std Y+32,r23 + ldd r18,Z+14 + ldd r19,Z+15 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+15,r18 + std Y+16,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+29,r22 + std Y+30,r23 + ld r19,X+ + ld r18,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + mov r16,r1 +201: + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+1 + eor r30,r0 + ldd r0,Y+2 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+3 + ldd r31,Y+4 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+5 + eor r30,r0 + ldd r0,Y+6 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+7 + ldd r31,Y+8 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+9 + eor r30,r0 + ldd r0,Y+10 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+11 + ldd r31,Y+12 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+13 + eor r30,r0 + ldd r0,Y+14 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+15 + ldd r31,Y+16 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+17 + eor r30,r0 + ldd r0,Y+18 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+19 + ldd r31,Y+20 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+21 + eor r30,r0 + ldd r0,Y+22 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+23 + ldd r31,Y+24 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+25 + eor r30,r0 + ldd r0,Y+26 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+27 + ldd r31,Y+28 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+29 + eor r30,r0 + ldd r0,Y+30 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+31 + ldd r31,Y+32 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + ldi r17,80 + cpse r16,r17 + rjmp 201b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r18 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r29 + pop r28 + ret + .size cham64_128_encrypt, .-cham64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.c b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.c new file mode 100644 index 0000000..23351a3 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.c @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-cham.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t x0, x1, x2, x3; + uint32_t k[8]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word32(key); + k[1] = le_load_word32(key + 4); + k[2] = le_load_word32(key + 8); + k[3] = le_load_word32(key + 12); + k[4] = k[1] ^ leftRotate1(k[1]) ^ leftRotate11(k[1]); + k[5] = k[0] ^ leftRotate1(k[0]) ^ leftRotate11(k[0]); + k[6] = k[3] ^ leftRotate1(k[3]) ^ leftRotate11(k[3]); + k[7] = k[2] ^ leftRotate1(k[2]) ^ leftRotate11(k[2]); + k[0] ^= leftRotate1(k[0]) ^ leftRotate8(k[0]); + k[1] ^= leftRotate1(k[1]) ^ leftRotate8(k[1]); + k[2] ^= leftRotate1(k[2]) ^ leftRotate8(k[2]); + k[3] ^= leftRotate1(k[3]) ^ leftRotate8(k[3]); + + /* Unpack the input block */ + x0 = le_load_word32(input); + x1 = le_load_word32(input + 4); + x2 = le_load_word32(input + 8); + x3 = le_load_word32(input + 12); + + /* Perform the 80 rounds eight at a time */ + for (round = 0; round < 80; round += 8) { + x0 = leftRotate8((x0 ^ round) + (leftRotate1(x1) ^ k[0])); + x1 = leftRotate1((x1 ^ (round + 1)) + (leftRotate8(x2) ^ k[1])); + x2 = leftRotate8((x2 ^ (round + 2)) + (leftRotate1(x3) ^ k[2])); + x3 = leftRotate1((x3 ^ (round + 3)) + (leftRotate8(x0) ^ k[3])); + x0 = leftRotate8((x0 ^ (round + 4)) + (leftRotate1(x1) ^ k[4])); + x1 = leftRotate1((x1 ^ (round + 5)) + (leftRotate8(x2) ^ k[5])); + x2 = leftRotate8((x2 ^ (round + 6)) + (leftRotate1(x3) ^ k[6])); + x3 = leftRotate1((x3 ^ (round + 7)) + (leftRotate8(x0) ^ k[7])); + } + + /* Pack the state into the output block */ + le_store_word32(output, x0); + le_store_word32(output + 4, x1); + le_store_word32(output + 8, x2); + le_store_word32(output + 12, x3); +} + +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint16_t x0, x1, x2, x3; + uint16_t k[16]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word16(key); + k[1] = le_load_word16(key + 2); + k[2] = le_load_word16(key + 4); + k[3] = le_load_word16(key + 6); + k[4] = le_load_word16(key + 8); + k[5] = le_load_word16(key + 10); + k[6] = le_load_word16(key + 12); + k[7] = le_load_word16(key + 14); + k[8] = k[1] ^ leftRotate1_16(k[1]) ^ leftRotate11_16(k[1]); + k[9] = k[0] ^ leftRotate1_16(k[0]) ^ leftRotate11_16(k[0]); + k[10] = k[3] ^ leftRotate1_16(k[3]) ^ leftRotate11_16(k[3]); + k[11] = k[2] ^ leftRotate1_16(k[2]) ^ leftRotate11_16(k[2]); + k[12] = k[5] ^ leftRotate1_16(k[5]) ^ leftRotate11_16(k[5]); + k[13] = k[4] ^ leftRotate1_16(k[4]) ^ leftRotate11_16(k[4]); + k[14] = k[7] ^ leftRotate1_16(k[7]) ^ leftRotate11_16(k[7]); + k[15] = k[6] ^ leftRotate1_16(k[6]) ^ leftRotate11_16(k[6]); + k[0] ^= leftRotate1_16(k[0]) ^ leftRotate8_16(k[0]); + k[1] ^= leftRotate1_16(k[1]) ^ leftRotate8_16(k[1]); + k[2] ^= leftRotate1_16(k[2]) ^ leftRotate8_16(k[2]); + k[3] ^= leftRotate1_16(k[3]) ^ leftRotate8_16(k[3]); + k[4] ^= leftRotate1_16(k[4]) ^ leftRotate8_16(k[4]); + k[5] ^= leftRotate1_16(k[5]) ^ leftRotate8_16(k[5]); + k[6] ^= leftRotate1_16(k[6]) ^ leftRotate8_16(k[6]); + k[7] ^= leftRotate1_16(k[7]) ^ leftRotate8_16(k[7]); + + /* Unpack the input block */ + x0 = le_load_word16(input); + x1 = le_load_word16(input + 2); + x2 = le_load_word16(input + 4); + x3 = le_load_word16(input + 6); + + /* Perform the 80 rounds four at a time */ + for (round = 0; round < 80; round += 4) { + x0 = leftRotate8_16 + ((x0 ^ round) + + (leftRotate1_16(x1) ^ k[round % 16])); + x1 = leftRotate1_16 + ((x1 ^ (round + 1)) + + (leftRotate8_16(x2) ^ k[(round + 1) % 16])); + x2 = leftRotate8_16 + ((x2 ^ (round + 2)) + + (leftRotate1_16(x3) ^ k[(round + 2) % 16])); + x3 = leftRotate1_16 + ((x3 ^ (round + 3)) + + (leftRotate8_16(x0) ^ k[(round + 3) % 16])); + } + + /* Pack the state into the output block */ + le_store_word16(output, x0); + le_store_word16(output + 2, x1); + le_store_word16(output + 4, x2); + le_store_word16(output + 6, x3); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.h new file mode 100644 index 0000000..29d5ccf --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-cham.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_CHAM_H +#define LW_INTERNAL_CHAM_H + +/** + * \file internal-cham.h + * \brief CHAM block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 128-bit block with CHAM-128-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 64-bit block with CHAM-64-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64-avr.S b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64-avr.S new file mode 100644 index 0000000..d8d641e --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64-avr.S @@ -0,0 +1,272 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global speck64_128_encrypt + .type speck64_128_encrypt, @function +speck64_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ld r14,X+ + ld r15,X+ + ld r24,X+ + ld r25,X+ + ld r30,X+ + ld r31,X+ + ld r12,X+ + ld r13,X+ + mov r16,r1 +25: + add r31,r14 + adc r12,r15 + adc r13,r24 + adc r30,r25 + eor r31,r18 + eor r12,r19 + eor r13,r20 + eor r30,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r31 + eor r15,r12 + eor r24,r13 + eor r25,r30 + mov r0,r22 + mov r22,r23 + add r22,r18 + mov r23,r2 + adc r23,r19 + mov r2,r3 + adc r2,r20 + mov r3,r0 + adc r3,r21 + eor r22,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + inc r16 + add r12,r14 + adc r13,r15 + adc r30,r24 + adc r31,r25 + eor r12,r18 + eor r13,r19 + eor r30,r20 + eor r31,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r12 + eor r15,r13 + eor r24,r30 + eor r25,r31 + mov r0,r4 + mov r4,r5 + add r4,r18 + mov r5,r6 + adc r5,r19 + mov r6,r7 + adc r6,r20 + mov r7,r0 + adc r7,r21 + eor r4,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + inc r16 + add r13,r14 + adc r30,r15 + adc r31,r24 + adc r12,r25 + eor r13,r18 + eor r30,r19 + eor r31,r20 + eor r12,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r13 + eor r15,r30 + eor r24,r31 + eor r25,r12 + mov r0,r12 + mov r12,r31 + mov r31,r30 + mov r30,r13 + mov r13,r0 + mov r0,r8 + mov r8,r9 + add r8,r18 + mov r9,r10 + adc r9,r19 + mov r10,r11 + adc r10,r20 + mov r11,r0 + adc r11,r21 + eor r8,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + inc r16 + ldi r17,27 + cpse r16,r17 + rjmp 25b + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r30 + st X+,r31 + st X+,r12 + st X+,r13 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size speck64_128_encrypt, .-speck64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.c b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.c new file mode 100644 index 0000000..494c801 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-speck64.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t l0, l1, l2, s; + uint32_t x, y; + uint8_t round; + + /* Unpack the key and the input block */ + s = le_load_word32(key); + l0 = le_load_word32(key + 4); + l1 = le_load_word32(key + 8); + l2 = le_load_word32(key + 12); + y = le_load_word32(input); + x = le_load_word32(input + 4); + + /* Perform all 27 encryption rounds, in groups of 3 */ + #define round_xy() \ + do { \ + x = (rightRotate8(x) + y) ^ s; \ + y = leftRotate3(y) ^ x; \ + } while (0) + #define schedule(l) \ + do { \ + l = (s + rightRotate8(l)) ^ round; \ + s = leftRotate3(s) ^ l; \ + ++round; \ + } while (0) + for (round = 0; round < 27; ) { + round_xy(); + schedule(l0); + round_xy(); + schedule(l1); + round_xy(); + schedule(l2); + } + + /* Write the result to the output */ + le_store_word32(output, y); + le_store_word32(output + 4, x); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.h new file mode 100644 index 0000000..fdf840a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-speck64.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPECK64_H +#define LW_INTERNAL_SPECK64_H + +/** + * \file internal-speck64.h + * \brief SPECK-64 block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 64-bit block with SPECK-64-128 in COMET byte order. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \note This version expects the key, input, and output to be in + * little-endian byte order, as expected by the COMET specification. + */ +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-util.h b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/comet/Implementations/crypto_aead/comet128chamv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.c b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/api.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/api.h new file mode 100644 index 0000000..9f9959f --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 15 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.c b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.c new file mode 100644 index 0000000..ceb0fd6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.c @@ -0,0 +1,556 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "comet.h" +#include "internal-cham.h" +#include "internal-speck64.h" +#include "internal-util.h" +#include + +aead_cipher_t const comet_128_cham_cipher = { + "COMET-128_CHAM-128/128", + COMET_KEY_SIZE, + COMET_128_NONCE_SIZE, + COMET_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_128_cham_aead_encrypt, + comet_128_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_cham_cipher = { + "COMET-64_CHAM-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_cham_aead_encrypt, + comet_64_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_speck_cipher = { + "COMET-64_SPECK-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_speck_aead_encrypt, + comet_64_speck_aead_decrypt +}; + +/** + * \brief Adjusts the Z state to generate the key to use on the next block. + * + * \param Z The Z state to be adjusted. + */ +static void comet_adjust_block_key(unsigned char Z[16]) +{ + /* Doubles the 64-bit prefix to Z in the F(2^64) field */ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)(Z[7])) >> 7); + for (index = 7; index > 0; --index) + Z[index] = (Z[index] << 1) | (Z[index - 1] >> 7); + Z[0] = (Z[0] << 1) ^ (mask & 0x1B); +} + +/* Function prototype for the encrypt function of the underyling cipher */ +typedef void (*comet_encrypt_block_t) + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Processes the associated data for COMET. + * + * \param Y Internal COMET block state of \a block_size bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param block_size Size of the block for the underlying cipher. + * \param encrypt Encryption function for the underlying cipher. + * \param ad Points to the associated data. + * \param adlen Number of bytes of associated data; must be >= 1. + */ +static void comet_process_ad + (unsigned char *Y, unsigned char Z[16], unsigned block_size, + comet_encrypt_block_t encrypt, const unsigned char *ad, + unsigned long long adlen) +{ + /* Domain separator for associated data */ + Z[15] ^= 0x08; + + /* Process all associated data blocks except the last partial block */ + while (adlen >= block_size) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, block_size); + ad += block_size; + adlen -= block_size; + } + + /* Pad and process the partial block on the end */ + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + Z[15] ^= 0x10; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Shuffles the words in a 128-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_128 + (unsigned char out[16], const unsigned char in[16]) +{ + uint32_t x0, x1, x2, x3; + x0 = le_load_word32(in); + x1 = le_load_word32(in + 4); + x2 = le_load_word32(in + 8); + x3 = le_load_word32(in + 12); + le_store_word32(out, x3); + le_store_word32(out + 4, rightRotate1(x2)); + le_store_word32(out + 8, x0); + le_store_word32(out + 12, x1); +} + +/** + * \brief Shuffles the words in a 64-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_64 + (unsigned char out[8], const unsigned char in[8]) +{ + uint32_t x01 = le_load_word32(in); + uint16_t x2 = ((uint16_t)(in[4])) | (((uint16_t)(in[5])) << 8); + out[0] = in[6]; + out[1] = in[7]; + x2 = (x2 >> 1) | (x2 << 15); + out[2] = (uint8_t)x2; + out[3] = (uint8_t)(x2 >> 8); + le_store_word32(out + 4, x01); +} + +/** + * \brief Encrypts the plaintext with COMET-128 to produce the ciphertext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, 16); + lw_xor_block_2_src(c, m, Ys, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Encrypts the plaintext with COMET-64 to produce the ciphertext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, 8); + lw_xor_block_2_src(c, m, Ys, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-128 to produce the plaintext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 16); + lw_xor_block(Y, m, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-64 to produce the plaintext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 8); + lw_xor_block(Y, m, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_128(Y, Z, cham128_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_128_TAG_SIZE) + return -1; + *mlen = clen - COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_128_TAG_SIZE) + comet_decrypt_128(Y, Z, cham128_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_128_TAG_SIZE); +} + +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, cham64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, cham64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} + +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, speck64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, speck64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.h new file mode 100644 index 0000000..d1b24a6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/comet.h @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_COMET_H +#define LWCRYPTO_COMET_H + +#include "aead-common.h" + +/** + * \file comet.h + * \brief COMET authenticated encryption algorithm. + * + * COMET is a family of authenticated encryption algorithms that are + * built around an underlying block cipher. This library implements + * three members of the family: + * + * \li COMET-128_CHAM-128/128 which has a 128-bit key, a 128-bit nonce, + * and a 128-bit tag, built around the CHAM-128/128 block cipher. + * \li COMET-64_CHAM-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the CHAM-64/128 block cipher. + * \li COMET-64_SPECK-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the SPECK-64/128 block cipher. + * + * There is also another family member that is built around AES but + * this library does not implement that version. + * + * References: https://www.isical.ac.in/~lightweight/comet/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all COMET family members. + */ +#define COMET_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for the 128-bit versions of COMET. + */ +#define COMET_128_TAG_SIZE 16 + +/** + * \brief Size of the authentication tag for the 64-bit versions of COMET. + */ +#define COMET_64_TAG_SIZE 8 + +/** + * \brief Size of the nonce for the 128-bit versions of COMET. + */ +#define COMET_128_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for the 64-bit versions of COMET. + */ +#define COMET_64_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the COMET-128_CHAM-128/128 cipher. + */ +extern aead_cipher_t const comet_128_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_CHAM-64/128 cipher. + */ +extern aead_cipher_t const comet_64_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_SPECK-64/128 cipher. + */ +extern aead_cipher_t const comet_64_speck_cipher; + +/** + * \brief Encrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_128_cham_aead_decrypt() + */ +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_128_cham_aead_encrypt() + */ +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_cham_aead_decrypt() + */ +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_cham_aead_encrypt() + */ +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_speck_aead_decrypt() + */ +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_speck_aead_encrypt() + */ +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/encrypt.c b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..e832eac --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "comet.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_64_cham_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_64_cham_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham-avr.S b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham-avr.S new file mode 100644 index 0000000..514a09a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham-avr.S @@ -0,0 +1,915 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global cham128_128_encrypt + .type cham128_128_encrypt, @function +cham128_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 48 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+21,r2 + std Y+22,r3 + std Y+23,r4 + std Y+24,r5 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+17,r2 + std Y+18,r3 + std Y+19,r4 + std Y+20,r5 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+29,r2 + std Y+30,r3 + std Y+31,r4 + std Y+32,r5 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+25,r2 + std Y+26,r3 + std Y+27,r4 + std Y+28,r5 + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r18,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + mov r30,r1 +197: + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+1 + eor r10,r0 + ldd r0,Y+2 + eor r11,r0 + ldd r0,Y+3 + eor r12,r0 + ldd r0,Y+4 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+5 + ldd r11,Y+6 + ldd r12,Y+7 + ldd r13,Y+8 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+9 + eor r10,r0 + ldd r0,Y+10 + eor r11,r0 + ldd r0,Y+11 + eor r12,r0 + ldd r0,Y+12 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+17 + eor r10,r0 + ldd r0,Y+18 + eor r11,r0 + ldd r0,Y+19 + eor r12,r0 + ldd r0,Y+20 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+25 + eor r10,r0 + ldd r0,Y+26 + eor r11,r0 + ldd r0,Y+27 + eor r12,r0 + ldd r0,Y+28 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+29 + ldd r11,Y+30 + ldd r12,Y+31 + ldd r13,Y+32 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + ldi r31,80 + cpse r30,r31 + rjmp 197b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r18 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size cham128_128_encrypt, .-cham128_128_encrypt + + .text +.global cham64_128_encrypt + .type cham64_128_encrypt, @function +cham64_128_encrypt: + push r28 + push r29 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 38 + ld r18,Z + ldd r19,Z+1 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+1,r18 + std Y+2,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+19,r22 + std Y+20,r23 + ldd r18,Z+2 + ldd r19,Z+3 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+3,r18 + std Y+4,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+17,r22 + std Y+18,r23 + ldd r18,Z+4 + ldd r19,Z+5 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+5,r18 + std Y+6,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+23,r22 + std Y+24,r23 + ldd r18,Z+6 + ldd r19,Z+7 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+7,r18 + std Y+8,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+21,r22 + std Y+22,r23 + ldd r18,Z+8 + ldd r19,Z+9 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+9,r18 + std Y+10,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+27,r22 + std Y+28,r23 + ldd r18,Z+10 + ldd r19,Z+11 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+11,r18 + std Y+12,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+25,r22 + std Y+26,r23 + ldd r18,Z+12 + ldd r19,Z+13 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+13,r18 + std Y+14,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+31,r22 + std Y+32,r23 + ldd r18,Z+14 + ldd r19,Z+15 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+15,r18 + std Y+16,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+29,r22 + std Y+30,r23 + ld r19,X+ + ld r18,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + mov r16,r1 +201: + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+1 + eor r30,r0 + ldd r0,Y+2 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+3 + ldd r31,Y+4 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+5 + eor r30,r0 + ldd r0,Y+6 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+7 + ldd r31,Y+8 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+9 + eor r30,r0 + ldd r0,Y+10 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+11 + ldd r31,Y+12 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+13 + eor r30,r0 + ldd r0,Y+14 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+15 + ldd r31,Y+16 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+17 + eor r30,r0 + ldd r0,Y+18 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+19 + ldd r31,Y+20 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+21 + eor r30,r0 + ldd r0,Y+22 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+23 + ldd r31,Y+24 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+25 + eor r30,r0 + ldd r0,Y+26 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+27 + ldd r31,Y+28 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+29 + eor r30,r0 + ldd r0,Y+30 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+31 + ldd r31,Y+32 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + ldi r17,80 + cpse r16,r17 + rjmp 201b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r18 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r29 + pop r28 + ret + .size cham64_128_encrypt, .-cham64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.c b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.c new file mode 100644 index 0000000..23351a3 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.c @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-cham.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t x0, x1, x2, x3; + uint32_t k[8]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word32(key); + k[1] = le_load_word32(key + 4); + k[2] = le_load_word32(key + 8); + k[3] = le_load_word32(key + 12); + k[4] = k[1] ^ leftRotate1(k[1]) ^ leftRotate11(k[1]); + k[5] = k[0] ^ leftRotate1(k[0]) ^ leftRotate11(k[0]); + k[6] = k[3] ^ leftRotate1(k[3]) ^ leftRotate11(k[3]); + k[7] = k[2] ^ leftRotate1(k[2]) ^ leftRotate11(k[2]); + k[0] ^= leftRotate1(k[0]) ^ leftRotate8(k[0]); + k[1] ^= leftRotate1(k[1]) ^ leftRotate8(k[1]); + k[2] ^= leftRotate1(k[2]) ^ leftRotate8(k[2]); + k[3] ^= leftRotate1(k[3]) ^ leftRotate8(k[3]); + + /* Unpack the input block */ + x0 = le_load_word32(input); + x1 = le_load_word32(input + 4); + x2 = le_load_word32(input + 8); + x3 = le_load_word32(input + 12); + + /* Perform the 80 rounds eight at a time */ + for (round = 0; round < 80; round += 8) { + x0 = leftRotate8((x0 ^ round) + (leftRotate1(x1) ^ k[0])); + x1 = leftRotate1((x1 ^ (round + 1)) + (leftRotate8(x2) ^ k[1])); + x2 = leftRotate8((x2 ^ (round + 2)) + (leftRotate1(x3) ^ k[2])); + x3 = leftRotate1((x3 ^ (round + 3)) + (leftRotate8(x0) ^ k[3])); + x0 = leftRotate8((x0 ^ (round + 4)) + (leftRotate1(x1) ^ k[4])); + x1 = leftRotate1((x1 ^ (round + 5)) + (leftRotate8(x2) ^ k[5])); + x2 = leftRotate8((x2 ^ (round + 6)) + (leftRotate1(x3) ^ k[6])); + x3 = leftRotate1((x3 ^ (round + 7)) + (leftRotate8(x0) ^ k[7])); + } + + /* Pack the state into the output block */ + le_store_word32(output, x0); + le_store_word32(output + 4, x1); + le_store_word32(output + 8, x2); + le_store_word32(output + 12, x3); +} + +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint16_t x0, x1, x2, x3; + uint16_t k[16]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word16(key); + k[1] = le_load_word16(key + 2); + k[2] = le_load_word16(key + 4); + k[3] = le_load_word16(key + 6); + k[4] = le_load_word16(key + 8); + k[5] = le_load_word16(key + 10); + k[6] = le_load_word16(key + 12); + k[7] = le_load_word16(key + 14); + k[8] = k[1] ^ leftRotate1_16(k[1]) ^ leftRotate11_16(k[1]); + k[9] = k[0] ^ leftRotate1_16(k[0]) ^ leftRotate11_16(k[0]); + k[10] = k[3] ^ leftRotate1_16(k[3]) ^ leftRotate11_16(k[3]); + k[11] = k[2] ^ leftRotate1_16(k[2]) ^ leftRotate11_16(k[2]); + k[12] = k[5] ^ leftRotate1_16(k[5]) ^ leftRotate11_16(k[5]); + k[13] = k[4] ^ leftRotate1_16(k[4]) ^ leftRotate11_16(k[4]); + k[14] = k[7] ^ leftRotate1_16(k[7]) ^ leftRotate11_16(k[7]); + k[15] = k[6] ^ leftRotate1_16(k[6]) ^ leftRotate11_16(k[6]); + k[0] ^= leftRotate1_16(k[0]) ^ leftRotate8_16(k[0]); + k[1] ^= leftRotate1_16(k[1]) ^ leftRotate8_16(k[1]); + k[2] ^= leftRotate1_16(k[2]) ^ leftRotate8_16(k[2]); + k[3] ^= leftRotate1_16(k[3]) ^ leftRotate8_16(k[3]); + k[4] ^= leftRotate1_16(k[4]) ^ leftRotate8_16(k[4]); + k[5] ^= leftRotate1_16(k[5]) ^ leftRotate8_16(k[5]); + k[6] ^= leftRotate1_16(k[6]) ^ leftRotate8_16(k[6]); + k[7] ^= leftRotate1_16(k[7]) ^ leftRotate8_16(k[7]); + + /* Unpack the input block */ + x0 = le_load_word16(input); + x1 = le_load_word16(input + 2); + x2 = le_load_word16(input + 4); + x3 = le_load_word16(input + 6); + + /* Perform the 80 rounds four at a time */ + for (round = 0; round < 80; round += 4) { + x0 = leftRotate8_16 + ((x0 ^ round) + + (leftRotate1_16(x1) ^ k[round % 16])); + x1 = leftRotate1_16 + ((x1 ^ (round + 1)) + + (leftRotate8_16(x2) ^ k[(round + 1) % 16])); + x2 = leftRotate8_16 + ((x2 ^ (round + 2)) + + (leftRotate1_16(x3) ^ k[(round + 2) % 16])); + x3 = leftRotate1_16 + ((x3 ^ (round + 3)) + + (leftRotate8_16(x0) ^ k[(round + 3) % 16])); + } + + /* Pack the state into the output block */ + le_store_word16(output, x0); + le_store_word16(output + 2, x1); + le_store_word16(output + 4, x2); + le_store_word16(output + 6, x3); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.h new file mode 100644 index 0000000..29d5ccf --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-cham.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_CHAM_H +#define LW_INTERNAL_CHAM_H + +/** + * \file internal-cham.h + * \brief CHAM block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 128-bit block with CHAM-128-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 64-bit block with CHAM-64-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64-avr.S b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64-avr.S new file mode 100644 index 0000000..d8d641e --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64-avr.S @@ -0,0 +1,272 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global speck64_128_encrypt + .type speck64_128_encrypt, @function +speck64_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ld r14,X+ + ld r15,X+ + ld r24,X+ + ld r25,X+ + ld r30,X+ + ld r31,X+ + ld r12,X+ + ld r13,X+ + mov r16,r1 +25: + add r31,r14 + adc r12,r15 + adc r13,r24 + adc r30,r25 + eor r31,r18 + eor r12,r19 + eor r13,r20 + eor r30,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r31 + eor r15,r12 + eor r24,r13 + eor r25,r30 + mov r0,r22 + mov r22,r23 + add r22,r18 + mov r23,r2 + adc r23,r19 + mov r2,r3 + adc r2,r20 + mov r3,r0 + adc r3,r21 + eor r22,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + inc r16 + add r12,r14 + adc r13,r15 + adc r30,r24 + adc r31,r25 + eor r12,r18 + eor r13,r19 + eor r30,r20 + eor r31,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r12 + eor r15,r13 + eor r24,r30 + eor r25,r31 + mov r0,r4 + mov r4,r5 + add r4,r18 + mov r5,r6 + adc r5,r19 + mov r6,r7 + adc r6,r20 + mov r7,r0 + adc r7,r21 + eor r4,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + inc r16 + add r13,r14 + adc r30,r15 + adc r31,r24 + adc r12,r25 + eor r13,r18 + eor r30,r19 + eor r31,r20 + eor r12,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r13 + eor r15,r30 + eor r24,r31 + eor r25,r12 + mov r0,r12 + mov r12,r31 + mov r31,r30 + mov r30,r13 + mov r13,r0 + mov r0,r8 + mov r8,r9 + add r8,r18 + mov r9,r10 + adc r9,r19 + mov r10,r11 + adc r10,r20 + mov r11,r0 + adc r11,r21 + eor r8,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + inc r16 + ldi r17,27 + cpse r16,r17 + rjmp 25b + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r30 + st X+,r31 + st X+,r12 + st X+,r13 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size speck64_128_encrypt, .-speck64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.c b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.c new file mode 100644 index 0000000..494c801 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-speck64.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t l0, l1, l2, s; + uint32_t x, y; + uint8_t round; + + /* Unpack the key and the input block */ + s = le_load_word32(key); + l0 = le_load_word32(key + 4); + l1 = le_load_word32(key + 8); + l2 = le_load_word32(key + 12); + y = le_load_word32(input); + x = le_load_word32(input + 4); + + /* Perform all 27 encryption rounds, in groups of 3 */ + #define round_xy() \ + do { \ + x = (rightRotate8(x) + y) ^ s; \ + y = leftRotate3(y) ^ x; \ + } while (0) + #define schedule(l) \ + do { \ + l = (s + rightRotate8(l)) ^ round; \ + s = leftRotate3(s) ^ l; \ + ++round; \ + } while (0) + for (round = 0; round < 27; ) { + round_xy(); + schedule(l0); + round_xy(); + schedule(l1); + round_xy(); + schedule(l2); + } + + /* Write the result to the output */ + le_store_word32(output, y); + le_store_word32(output + 4, x); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.h new file mode 100644 index 0000000..fdf840a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-speck64.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPECK64_H +#define LW_INTERNAL_SPECK64_H + +/** + * \file internal-speck64.h + * \brief SPECK-64 block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 64-bit block with SPECK-64-128 in COMET byte order. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \note This version expects the key, input, and output to be in + * little-endian byte order, as expected by the COMET specification. + */ +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-util.h b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64chamv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.c b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/api.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/api.h new file mode 100644 index 0000000..9f9959f --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 15 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.c b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.c new file mode 100644 index 0000000..ceb0fd6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.c @@ -0,0 +1,556 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "comet.h" +#include "internal-cham.h" +#include "internal-speck64.h" +#include "internal-util.h" +#include + +aead_cipher_t const comet_128_cham_cipher = { + "COMET-128_CHAM-128/128", + COMET_KEY_SIZE, + COMET_128_NONCE_SIZE, + COMET_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_128_cham_aead_encrypt, + comet_128_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_cham_cipher = { + "COMET-64_CHAM-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_cham_aead_encrypt, + comet_64_cham_aead_decrypt +}; + +aead_cipher_t const comet_64_speck_cipher = { + "COMET-64_SPECK-64/128", + COMET_KEY_SIZE, + COMET_64_NONCE_SIZE, + COMET_64_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + comet_64_speck_aead_encrypt, + comet_64_speck_aead_decrypt +}; + +/** + * \brief Adjusts the Z state to generate the key to use on the next block. + * + * \param Z The Z state to be adjusted. + */ +static void comet_adjust_block_key(unsigned char Z[16]) +{ + /* Doubles the 64-bit prefix to Z in the F(2^64) field */ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)(Z[7])) >> 7); + for (index = 7; index > 0; --index) + Z[index] = (Z[index] << 1) | (Z[index - 1] >> 7); + Z[0] = (Z[0] << 1) ^ (mask & 0x1B); +} + +/* Function prototype for the encrypt function of the underyling cipher */ +typedef void (*comet_encrypt_block_t) + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Processes the associated data for COMET. + * + * \param Y Internal COMET block state of \a block_size bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param block_size Size of the block for the underlying cipher. + * \param encrypt Encryption function for the underlying cipher. + * \param ad Points to the associated data. + * \param adlen Number of bytes of associated data; must be >= 1. + */ +static void comet_process_ad + (unsigned char *Y, unsigned char Z[16], unsigned block_size, + comet_encrypt_block_t encrypt, const unsigned char *ad, + unsigned long long adlen) +{ + /* Domain separator for associated data */ + Z[15] ^= 0x08; + + /* Process all associated data blocks except the last partial block */ + while (adlen >= block_size) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, block_size); + ad += block_size; + adlen -= block_size; + } + + /* Pad and process the partial block on the end */ + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + Z[15] ^= 0x10; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + lw_xor_block(Y, ad, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Shuffles the words in a 128-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_128 + (unsigned char out[16], const unsigned char in[16]) +{ + uint32_t x0, x1, x2, x3; + x0 = le_load_word32(in); + x1 = le_load_word32(in + 4); + x2 = le_load_word32(in + 8); + x3 = le_load_word32(in + 12); + le_store_word32(out, x3); + le_store_word32(out + 4, rightRotate1(x2)); + le_store_word32(out + 8, x0); + le_store_word32(out + 12, x1); +} + +/** + * \brief Shuffles the words in a 64-bit block. + * + * \param out The output block after shuffling. + * \param in The input block to be shuffled. + */ +STATIC_INLINE void comet_shuffle_block_64 + (unsigned char out[8], const unsigned char in[8]) +{ + uint32_t x01 = le_load_word32(in); + uint16_t x2 = ((uint16_t)(in[4])) | (((uint16_t)(in[5])) << 8); + out[0] = in[6]; + out[1] = in[7]; + x2 = (x2 >> 1) | (x2 << 15); + out[2] = (uint8_t)x2; + out[3] = (uint8_t)(x2 >> 8); + le_store_word32(out + 4, x01); +} + +/** + * \brief Encrypts the plaintext with COMET-128 to produce the ciphertext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, 16); + lw_xor_block_2_src(c, m, Ys, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Encrypts the plaintext with COMET-64 to produce the ciphertext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param c Ciphertext on output. + * \param m Plaintext message on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_encrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, 8); + lw_xor_block_2_src(c, m, Ys, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block(Y, m, temp); + lw_xor_block_2_src(c, m, Ys, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-128 to produce the plaintext. + * + * \param Y Internal COMET block state of 16 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_128 + (unsigned char Y[16], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[16]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 16) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 16); + lw_xor_block(Y, m, 16); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_128(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +/** + * \brief Decrypts the ciphertext with COMET-64 to produce the plaintext. + * + * \param Y Internal COMET block state of 8 bytes in size. + * \param Z Internal COMET key state of 16 bytes in size. + * \param encrypt Encryption function for the underlying cipher. + * \param m Plaintext message on output. + * \param c Ciphertext on input. + * \param mlen Length of the plaintext message and the ciphertext. + */ +static void comet_decrypt_64 + (unsigned char Y[8], unsigned char Z[16], + comet_encrypt_block_t encrypt, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char Ys[8]; + + /* Domain separator for payload data */ + Z[15] ^= 0x20; + + /* Process all payload data blocks except the last partial block */ + while (mlen >= 8) { + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, 8); + lw_xor_block(Y, m, 8); + c += 8; + m += 8; + mlen -= 8; + } + + /* Pad and process the partial block on the end */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + Z[15] ^= 0x40; + comet_adjust_block_key(Z); + encrypt(Z, Y, Y); + comet_shuffle_block_64(Ys, Y); + lw_xor_block_2_src(m, c, Ys, temp); + lw_xor_block(Y, m, temp); + Y[temp] ^= 0x01; + } +} + +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_128(Y, Z, cham128_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[16]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_128_TAG_SIZE) + return -1; + *mlen = clen - COMET_128_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memcpy(Y, k, 16); + cham128_128_encrypt(Y, Z, npub); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 16, cham128_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_128_TAG_SIZE) + comet_decrypt_128(Y, Z, cham128_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham128_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_128_TAG_SIZE); +} + +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, cham64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + cham64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, cham64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, cham64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + cham64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} + +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + comet_encrypt_64(Y, Z, speck64_128_encrypt, c, m, mlen); + + /* Generate the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, c + mlen, Y); + return 0; +} + +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char Y[8]; + unsigned char Z[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < COMET_64_TAG_SIZE) + return -1; + *mlen = clen - COMET_64_TAG_SIZE; + + /* Set up the initial state of Y and Z */ + memset(Y, 0, 8); + speck64_128_encrypt(k, Y, Y); + memcpy(Z, npub, 15); + Z[15] = 0; + lw_xor_block(Z, k, 16); + + /* Process the associated data */ + if (adlen > 0) + comet_process_ad(Y, Z, 8, speck64_128_encrypt, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > COMET_64_TAG_SIZE) + comet_decrypt_64(Y, Z, speck64_128_encrypt, m, c, *mlen); + + /* Check the authentication tag */ + Z[15] ^= 0x80; + comet_adjust_block_key(Z); + speck64_128_encrypt(Z, Y, Y); + return aead_check_tag(m, *mlen, Y, c + *mlen, COMET_64_TAG_SIZE); +} diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.h new file mode 100644 index 0000000..d1b24a6 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/comet.h @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_COMET_H +#define LWCRYPTO_COMET_H + +#include "aead-common.h" + +/** + * \file comet.h + * \brief COMET authenticated encryption algorithm. + * + * COMET is a family of authenticated encryption algorithms that are + * built around an underlying block cipher. This library implements + * three members of the family: + * + * \li COMET-128_CHAM-128/128 which has a 128-bit key, a 128-bit nonce, + * and a 128-bit tag, built around the CHAM-128/128 block cipher. + * \li COMET-64_CHAM-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the CHAM-64/128 block cipher. + * \li COMET-64_SPECK-64/128 which has a 128-bit key, a 120-bit nonce, + * and a 64-bit tag, built around the SPECK-64/128 block cipher. + * + * There is also another family member that is built around AES but + * this library does not implement that version. + * + * References: https://www.isical.ac.in/~lightweight/comet/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all COMET family members. + */ +#define COMET_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for the 128-bit versions of COMET. + */ +#define COMET_128_TAG_SIZE 16 + +/** + * \brief Size of the authentication tag for the 64-bit versions of COMET. + */ +#define COMET_64_TAG_SIZE 8 + +/** + * \brief Size of the nonce for the 128-bit versions of COMET. + */ +#define COMET_128_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for the 64-bit versions of COMET. + */ +#define COMET_64_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the COMET-128_CHAM-128/128 cipher. + */ +extern aead_cipher_t const comet_128_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_CHAM-64/128 cipher. + */ +extern aead_cipher_t const comet_64_cham_cipher; + +/** + * \brief Meta-information block for the COMET-64_SPECK-64/128 cipher. + */ +extern aead_cipher_t const comet_64_speck_cipher; + +/** + * \brief Encrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_128_cham_aead_decrypt() + */ +int comet_128_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-128_CHAM-128/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_128_cham_aead_encrypt() + */ +int comet_128_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_cham_aead_decrypt() + */ +int comet_64_cham_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_CHAM-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_cham_aead_encrypt() + */ +int comet_64_cham_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa comet_64_speck_aead_decrypt() + */ +int comet_64_speck_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with COMET-64_SPECK-64/128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa comet_64_speck_aead_encrypt() + */ +int comet_64_speck_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/encrypt.c b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..dc4f508 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "comet.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_64_speck_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return comet_64_speck_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham-avr.S b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham-avr.S new file mode 100644 index 0000000..514a09a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham-avr.S @@ -0,0 +1,915 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global cham128_128_encrypt + .type cham128_128_encrypt, @function +cham128_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 48 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+21,r2 + std Y+22,r3 + std Y+23,r4 + std Y+24,r5 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+17,r2 + std Y+18,r3 + std Y+19,r4 + std Y+20,r5 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+29,r2 + std Y+30,r3 + std Y+31,r4 + std Y+32,r5 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + movw r22,r18 + movw r24,r20 + movw r6,r18 + movw r8,r20 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r18,r6 + eor r19,r7 + eor r20,r8 + eor r21,r9 + movw r2,r18 + movw r4,r20 + eor r18,r25 + eor r19,r22 + eor r20,r23 + eor r21,r24 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Y+25,r2 + std Y+26,r3 + std Y+27,r4 + std Y+28,r5 + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r18,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + mov r30,r1 +197: + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+1 + eor r10,r0 + ldd r0,Y+2 + eor r11,r0 + ldd r0,Y+3 + eor r12,r0 + ldd r0,Y+4 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+5 + ldd r11,Y+6 + ldd r12,Y+7 + ldd r13,Y+8 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+9 + eor r10,r0 + ldd r0,Y+10 + eor r11,r0 + ldd r0,Y+11 + eor r12,r0 + ldd r0,Y+12 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + eor r19,r30 + movw r10,r22 + movw r12,r24 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+17 + eor r10,r0 + ldd r0,Y+18 + eor r11,r0 + ldd r0,Y+19 + eor r12,r0 + ldd r0,Y+20 + eor r13,r0 + add r19,r10 + adc r20,r11 + adc r21,r12 + adc r18,r13 + inc r30 + eor r22,r30 + mov r0,r5 + mov r5,r4 + mov r4,r3 + mov r3,r2 + mov r2,r0 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + add r22,r10 + adc r23,r11 + adc r24,r12 + adc r25,r13 + lsl r22 + rol r23 + rol r24 + rol r25 + adc r22,r1 + inc r30 + eor r3,r30 + movw r10,r6 + movw r12,r8 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + ldd r0,Y+25 + eor r10,r0 + ldd r0,Y+26 + eor r11,r0 + ldd r0,Y+27 + eor r12,r0 + ldd r0,Y+28 + eor r13,r0 + add r3,r10 + adc r4,r11 + adc r5,r12 + adc r2,r13 + inc r30 + eor r6,r30 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r10,Y+29 + ldd r11,Y+30 + ldd r12,Y+31 + ldd r13,Y+32 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + add r6,r10 + adc r7,r11 + adc r8,r12 + adc r9,r13 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + inc r30 + ldi r31,80 + cpse r30,r31 + rjmp 197b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r18 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size cham128_128_encrypt, .-cham128_128_encrypt + + .text +.global cham64_128_encrypt + .type cham64_128_encrypt, @function +cham64_128_encrypt: + push r28 + push r29 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 38 + ld r18,Z + ldd r19,Z+1 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+1,r18 + std Y+2,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+19,r22 + std Y+20,r23 + ldd r18,Z+2 + ldd r19,Z+3 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+3,r18 + std Y+4,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+17,r22 + std Y+18,r23 + ldd r18,Z+4 + ldd r19,Z+5 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+5,r18 + std Y+6,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+23,r22 + std Y+24,r23 + ldd r18,Z+6 + ldd r19,Z+7 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+7,r18 + std Y+8,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+21,r22 + std Y+22,r23 + ldd r18,Z+8 + ldd r19,Z+9 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+9,r18 + std Y+10,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+27,r22 + std Y+28,r23 + ldd r18,Z+10 + ldd r19,Z+11 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+11,r18 + std Y+12,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+25,r22 + std Y+26,r23 + ldd r18,Z+12 + ldd r19,Z+13 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+13,r18 + std Y+14,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+31,r22 + std Y+32,r23 + ldd r18,Z+14 + ldd r19,Z+15 + movw r20,r18 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r18,r24 + eor r19,r25 + movw r22,r18 + eor r18,r21 + eor r19,r20 + std Y+15,r18 + std Y+16,r19 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + eor r22,r25 + eor r23,r24 + std Y+29,r22 + std Y+30,r23 + ld r19,X+ + ld r18,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r24,X+ + ld r25,X+ + mov r16,r1 +201: + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+1 + eor r30,r0 + ldd r0,Y+2 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+3 + ldd r31,Y+4 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+5 + eor r30,r0 + ldd r0,Y+6 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+7 + ldd r31,Y+8 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+9 + eor r30,r0 + ldd r0,Y+10 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+11 + ldd r31,Y+12 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+13 + eor r30,r0 + ldd r0,Y+14 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+15 + ldd r31,Y+16 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+17 + eor r30,r0 + ldd r0,Y+18 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+19 + ldd r31,Y+20 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+21 + eor r30,r0 + ldd r0,Y+22 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+23 + ldd r31,Y+24 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + eor r19,r16 + movw r30,r20 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+25 + eor r30,r0 + ldd r0,Y+26 + eor r31,r0 + add r19,r30 + adc r18,r31 + inc r16 + eor r20,r16 + mov r0,r23 + mov r23,r22 + mov r22,r0 + ldd r30,Y+27 + ldd r31,Y+28 + eor r30,r22 + eor r31,r23 + add r20,r30 + adc r21,r31 + lsl r20 + rol r21 + adc r20,r1 + inc r16 + eor r23,r16 + movw r30,r24 + lsl r30 + rol r31 + adc r30,r1 + ldd r0,Y+29 + eor r30,r0 + ldd r0,Y+30 + eor r31,r0 + add r23,r30 + adc r22,r31 + inc r16 + eor r24,r16 + mov r0,r19 + mov r19,r18 + mov r18,r0 + ldd r30,Y+31 + ldd r31,Y+32 + eor r30,r18 + eor r31,r19 + add r24,r30 + adc r25,r31 + lsl r24 + rol r25 + adc r24,r1 + inc r16 + ldi r17,80 + cpse r16,r17 + rjmp 201b + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r19 + st X+,r18 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r24 + st X+,r25 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r29 + pop r28 + ret + .size cham64_128_encrypt, .-cham64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.c b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.c new file mode 100644 index 0000000..23351a3 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.c @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-cham.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t x0, x1, x2, x3; + uint32_t k[8]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word32(key); + k[1] = le_load_word32(key + 4); + k[2] = le_load_word32(key + 8); + k[3] = le_load_word32(key + 12); + k[4] = k[1] ^ leftRotate1(k[1]) ^ leftRotate11(k[1]); + k[5] = k[0] ^ leftRotate1(k[0]) ^ leftRotate11(k[0]); + k[6] = k[3] ^ leftRotate1(k[3]) ^ leftRotate11(k[3]); + k[7] = k[2] ^ leftRotate1(k[2]) ^ leftRotate11(k[2]); + k[0] ^= leftRotate1(k[0]) ^ leftRotate8(k[0]); + k[1] ^= leftRotate1(k[1]) ^ leftRotate8(k[1]); + k[2] ^= leftRotate1(k[2]) ^ leftRotate8(k[2]); + k[3] ^= leftRotate1(k[3]) ^ leftRotate8(k[3]); + + /* Unpack the input block */ + x0 = le_load_word32(input); + x1 = le_load_word32(input + 4); + x2 = le_load_word32(input + 8); + x3 = le_load_word32(input + 12); + + /* Perform the 80 rounds eight at a time */ + for (round = 0; round < 80; round += 8) { + x0 = leftRotate8((x0 ^ round) + (leftRotate1(x1) ^ k[0])); + x1 = leftRotate1((x1 ^ (round + 1)) + (leftRotate8(x2) ^ k[1])); + x2 = leftRotate8((x2 ^ (round + 2)) + (leftRotate1(x3) ^ k[2])); + x3 = leftRotate1((x3 ^ (round + 3)) + (leftRotate8(x0) ^ k[3])); + x0 = leftRotate8((x0 ^ (round + 4)) + (leftRotate1(x1) ^ k[4])); + x1 = leftRotate1((x1 ^ (round + 5)) + (leftRotate8(x2) ^ k[5])); + x2 = leftRotate8((x2 ^ (round + 6)) + (leftRotate1(x3) ^ k[6])); + x3 = leftRotate1((x3 ^ (round + 7)) + (leftRotate8(x0) ^ k[7])); + } + + /* Pack the state into the output block */ + le_store_word32(output, x0); + le_store_word32(output + 4, x1); + le_store_word32(output + 8, x2); + le_store_word32(output + 12, x3); +} + +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint16_t x0, x1, x2, x3; + uint16_t k[16]; + uint8_t round; + + /* Unpack the key and generate the key schedule */ + k[0] = le_load_word16(key); + k[1] = le_load_word16(key + 2); + k[2] = le_load_word16(key + 4); + k[3] = le_load_word16(key + 6); + k[4] = le_load_word16(key + 8); + k[5] = le_load_word16(key + 10); + k[6] = le_load_word16(key + 12); + k[7] = le_load_word16(key + 14); + k[8] = k[1] ^ leftRotate1_16(k[1]) ^ leftRotate11_16(k[1]); + k[9] = k[0] ^ leftRotate1_16(k[0]) ^ leftRotate11_16(k[0]); + k[10] = k[3] ^ leftRotate1_16(k[3]) ^ leftRotate11_16(k[3]); + k[11] = k[2] ^ leftRotate1_16(k[2]) ^ leftRotate11_16(k[2]); + k[12] = k[5] ^ leftRotate1_16(k[5]) ^ leftRotate11_16(k[5]); + k[13] = k[4] ^ leftRotate1_16(k[4]) ^ leftRotate11_16(k[4]); + k[14] = k[7] ^ leftRotate1_16(k[7]) ^ leftRotate11_16(k[7]); + k[15] = k[6] ^ leftRotate1_16(k[6]) ^ leftRotate11_16(k[6]); + k[0] ^= leftRotate1_16(k[0]) ^ leftRotate8_16(k[0]); + k[1] ^= leftRotate1_16(k[1]) ^ leftRotate8_16(k[1]); + k[2] ^= leftRotate1_16(k[2]) ^ leftRotate8_16(k[2]); + k[3] ^= leftRotate1_16(k[3]) ^ leftRotate8_16(k[3]); + k[4] ^= leftRotate1_16(k[4]) ^ leftRotate8_16(k[4]); + k[5] ^= leftRotate1_16(k[5]) ^ leftRotate8_16(k[5]); + k[6] ^= leftRotate1_16(k[6]) ^ leftRotate8_16(k[6]); + k[7] ^= leftRotate1_16(k[7]) ^ leftRotate8_16(k[7]); + + /* Unpack the input block */ + x0 = le_load_word16(input); + x1 = le_load_word16(input + 2); + x2 = le_load_word16(input + 4); + x3 = le_load_word16(input + 6); + + /* Perform the 80 rounds four at a time */ + for (round = 0; round < 80; round += 4) { + x0 = leftRotate8_16 + ((x0 ^ round) + + (leftRotate1_16(x1) ^ k[round % 16])); + x1 = leftRotate1_16 + ((x1 ^ (round + 1)) + + (leftRotate8_16(x2) ^ k[(round + 1) % 16])); + x2 = leftRotate8_16 + ((x2 ^ (round + 2)) + + (leftRotate1_16(x3) ^ k[(round + 2) % 16])); + x3 = leftRotate1_16 + ((x3 ^ (round + 3)) + + (leftRotate8_16(x0) ^ k[(round + 3) % 16])); + } + + /* Pack the state into the output block */ + le_store_word16(output, x0); + le_store_word16(output + 2, x1); + le_store_word16(output + 4, x2); + le_store_word16(output + 6, x3); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.h new file mode 100644 index 0000000..29d5ccf --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-cham.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_CHAM_H +#define LW_INTERNAL_CHAM_H + +/** + * \file internal-cham.h + * \brief CHAM block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 128-bit block with CHAM-128-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham128_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 64-bit block with CHAM-64-128. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void cham64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64-avr.S b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64-avr.S new file mode 100644 index 0000000..d8d641e --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64-avr.S @@ -0,0 +1,272 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global speck64_128_encrypt + .type speck64_128_encrypt, @function +speck64_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ld r14,X+ + ld r15,X+ + ld r24,X+ + ld r25,X+ + ld r30,X+ + ld r31,X+ + ld r12,X+ + ld r13,X+ + mov r16,r1 +25: + add r31,r14 + adc r12,r15 + adc r13,r24 + adc r30,r25 + eor r31,r18 + eor r12,r19 + eor r13,r20 + eor r30,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r31 + eor r15,r12 + eor r24,r13 + eor r25,r30 + mov r0,r22 + mov r22,r23 + add r22,r18 + mov r23,r2 + adc r23,r19 + mov r2,r3 + adc r2,r20 + mov r3,r0 + adc r3,r21 + eor r22,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + inc r16 + add r12,r14 + adc r13,r15 + adc r30,r24 + adc r31,r25 + eor r12,r18 + eor r13,r19 + eor r30,r20 + eor r31,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r12 + eor r15,r13 + eor r24,r30 + eor r25,r31 + mov r0,r4 + mov r4,r5 + add r4,r18 + mov r5,r6 + adc r5,r19 + mov r6,r7 + adc r6,r20 + mov r7,r0 + adc r7,r21 + eor r4,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + inc r16 + add r13,r14 + adc r30,r15 + adc r31,r24 + adc r12,r25 + eor r13,r18 + eor r30,r19 + eor r31,r20 + eor r12,r21 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r13 + eor r15,r30 + eor r24,r31 + eor r25,r12 + mov r0,r12 + mov r12,r31 + mov r31,r30 + mov r30,r13 + mov r13,r0 + mov r0,r8 + mov r8,r9 + add r8,r18 + mov r9,r10 + adc r9,r19 + mov r10,r11 + adc r10,r20 + mov r11,r0 + adc r11,r21 + eor r8,r16 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + inc r16 + ldi r17,27 + cpse r16,r17 + rjmp 25b + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r30 + st X+,r31 + st X+,r12 + st X+,r13 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size speck64_128_encrypt, .-speck64_128_encrypt + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.c b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.c new file mode 100644 index 0000000..494c801 --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-speck64.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input) +{ + uint32_t l0, l1, l2, s; + uint32_t x, y; + uint8_t round; + + /* Unpack the key and the input block */ + s = le_load_word32(key); + l0 = le_load_word32(key + 4); + l1 = le_load_word32(key + 8); + l2 = le_load_word32(key + 12); + y = le_load_word32(input); + x = le_load_word32(input + 4); + + /* Perform all 27 encryption rounds, in groups of 3 */ + #define round_xy() \ + do { \ + x = (rightRotate8(x) + y) ^ s; \ + y = leftRotate3(y) ^ x; \ + } while (0) + #define schedule(l) \ + do { \ + l = (s + rightRotate8(l)) ^ round; \ + s = leftRotate3(s) ^ l; \ + ++round; \ + } while (0) + for (round = 0; round < 27; ) { + round_xy(); + schedule(l0); + round_xy(); + schedule(l1); + round_xy(); + schedule(l2); + } + + /* Write the result to the output */ + le_store_word32(output, y); + le_store_word32(output + 4, x); +} + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.h new file mode 100644 index 0000000..fdf840a --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-speck64.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPECK64_H +#define LW_INTERNAL_SPECK64_H + +/** + * \file internal-speck64.h + * \brief SPECK-64 block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a 64-bit block with SPECK-64-128 in COMET byte order. + * + * \param key Points to the 16 bytes of the key. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \note This version expects the key, input, and output to be in + * little-endian byte order, as expected by the COMET specification. + */ +void speck64_128_encrypt + (const unsigned char *key, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-util.h b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/comet/Implementations/crypto_aead/comet64speckv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/add_arm_cortex-m/drygascon128_arm_selector.h b/drygascon/Implementations/crypto_aead/drygascon128/add_arm_cortex-m/drygascon128_arm_selector.h index 9c86969..dd117e2 100644 --- a/drygascon/Implementations/crypto_aead/drygascon128/add_arm_cortex-m/drygascon128_arm_selector.h +++ b/drygascon/Implementations/crypto_aead/drygascon128/add_arm_cortex-m/drygascon128_arm_selector.h @@ -77,4 +77,8 @@ #define DRYGASCON_ALIGN_INPUT_32 #endif +#ifndef __DRYGASCON_ARM_SELECTOR_FOUND__ +#error "No ARM definition found" +#endif + #endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.c b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.h b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/api.h b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.c b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.c new file mode 100644 index 0000000..e963903 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.c @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "drygascon.h" +#include "internal-drysponge.h" +#include + +aead_cipher_t const drygascon128_cipher = { + "DryGASCON128", + DRYGASCON128_KEY_SIZE, + DRYGASCON128_NONCE_SIZE, + DRYGASCON128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_aead_encrypt, + drygascon128_aead_decrypt +}; + +aead_cipher_t const drygascon256_cipher = { + "DryGASCON256", + DRYGASCON256_KEY_SIZE, + DRYGASCON256_NONCE_SIZE, + DRYGASCON256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_aead_encrypt, + drygascon256_aead_decrypt +}; + +aead_hash_algorithm_t const drygascon128_hash_algorithm = { + "DryGASCON128-HASH", + sizeof(int), + DRYGASCON128_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const drygascon256_hash_algorithm = { + "DryGASCON256-HASH", + sizeof(int), + DRYGASCON256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Processes associated data for DryGASCON128. + * + * \param state DrySPONGE128 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon128_process_ad + (drysponge128_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(state, ad, DRYSPONGE128_RATE); + drysponge128_g_core(state); + ad += DRYSPONGE128_RATE; + adlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN128_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN128_FINAL; + if (adlen < DRYSPONGE128_RATE) + state->domain |= DRYDOMAIN128_PADDED; + drysponge128_f_absorb(state, ad, (unsigned)adlen); + drysponge128_g(state); +} + +/** + * \brief Processes associated data for DryGASCON256. + * + * \param state DrySPONGE256 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon256_process_ad + (drysponge256_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(state, ad, DRYSPONGE256_RATE); + drysponge256_g_core(state); + ad += DRYSPONGE256_RATE; + adlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN256_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN256_FINAL; + if (adlen < DRYSPONGE256_RATE) + state->domain |= DRYDOMAIN256_PADDED; + drysponge256_f_absorb(state, ad, (unsigned)adlen); + drysponge256_g(state); +} + +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge128_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + mlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (mlen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)mlen; + drysponge128_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge128_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, DRYGASCON128_TAG_SIZE); + return 0; +} + +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON128_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON128_TAG_SIZE; + drysponge128_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE128_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE128_RATE); + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + clen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (clen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge128_f_absorb(&state, m, temp); + drysponge128_g(&state); + c += temp; + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state.r.B, c, DRYGASCON128_TAG_SIZE); +} + +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge256_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + mlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (mlen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)mlen; + drysponge256_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge256_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, 16); + drysponge256_g(&state); + memcpy(c + 16, state.r.B, 16); + return 0; +} + +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned char *mtemp = m; + unsigned temp; + int result; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON256_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON256_TAG_SIZE; + drysponge256_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE256_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE256_RATE); + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + clen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (clen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge256_f_absorb(&state, m, temp); + drysponge256_g(&state); + c += temp; + } + + /* Check the authentication tag which is split into two pieces */ + result = aead_check_tag(0, 0, state.r.B, c, 16); + drysponge256_g(&state); + return aead_check_tag_precheck + (mtemp, *mlen, state.r.B, c + 16, 16, ~result); +} + +/** + * \brief Precomputed initialization vector for DryGASCON128-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE128. + */ +static unsigned char const drygascon128_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89 +}; + +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge128_state_t state; + memcpy(state.c.B, drygascon128_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon128_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE128_ROUNDS; + drygascon128_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge128_g(&state); + memcpy(out + 16, state.r.B, 16); + return 0; +} + +/** + * \brief Precomputed initialization vector for DryGASCON256-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE256. + */ +static unsigned char const drygascon256_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0x45, 0x28, 0x21, 0xe6, 0x38, 0xd0, 0x13, 0x77, + 0xbe, 0x54, 0x66, 0xcf, 0x34, 0xe9, 0x0c, 0x6c +}; + +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge256_state_t state; + memcpy(state.c.B, drygascon256_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon256_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE256_ROUNDS; + drygascon256_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 16, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 32, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 48, state.r.B, 16); + return 0; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.h b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.h new file mode 100644 index 0000000..12e18c3 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/drygascon.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_DRYGASCON_H +#define LWCRYPTO_DRYGASCON_H + +#include "aead-common.h" + +/** + * \file drygascon.h + * \brief DryGASCON authenticated encryption algorithm. + * + * DryGASCON is a family of authenticated encryption algorithms based + * around a generalised version of the ASCON permutation. DryGASCON + * is designed to provide some protection against power analysis. + * + * There are four algorithms in the DryGASCON family: + * + * \li DryGASCON128 is an authenticated encryption algorithm with a + * 128-bit key, a 128-bit nonce, and a 128-bit authentication tag. + * \li DryGASCON256 is an authenticated encryption algorithm with a + * 256-bit key, a 128-bit nonce, and a 128-256 authentication tag. + * \li DryGASCON128-HASH is a hash algorithm with a 256-bit output. + * \li DryGASCON256-HASH is a hash algorithm with a 512-bit output. + * + * DryGASCON128 and DryGASCON128-HASH are the primary members of the family. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for DryGASCON128. + */ +#define DRYGASCON128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for DryGASCON128. + */ +#define DRYGASCON128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for DryGASCON128. + */ +#define DRYGASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON128-HASH. + */ +#define DRYGASCON128_HASH_SIZE 32 + +/** + * \brief Size of the key for DryGASCON256. + */ +#define DRYGASCON256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for DryGASCON256. + */ +#define DRYGASCON256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for DryGASCON256. + */ +#define DRYGASCON256_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON256-HASH. + */ +#define DRYGASCON256_HASH_SIZE 64 + +/** + * \brief Meta-information block for the DryGASCON128 cipher. + */ +extern aead_cipher_t const drygascon128_cipher; + +/** + * \brief Meta-information block for the DryGASCON256 cipher. + */ +extern aead_cipher_t const drygascon256_cipher; + +/** + * \brief Meta-information block for DryGASCON128-HASH. + */ +extern aead_hash_algorithm_t const drygascon128_hash_algorithm; + +/** + * \brief Meta-information block for DryGASCON256-HASH. + */ +extern aead_hash_algorithm_t const drygascon256_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with DryGASCON128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon128_aead_decrypt() + */ +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon128_aead_encrypt() + */ +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with DryGASCON256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon256_aead_decrypt() + */ +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon256_aead_encrypt() + */ +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with DRYGASCON128. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON128_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with DRYGASCON256. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/encrypt.c b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/encrypt.c new file mode 100644 index 0000000..663de84 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "drygascon.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return drygascon128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return drygascon128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge-avr.S b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge-avr.S new file mode 100644 index 0000000..84d0ff8 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge-avr.S @@ -0,0 +1,5092 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gascon128_core_round + .type gascon128_core_round, @function +gascon128_core_round: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + eor r4,r22 + ldd r23,Z+8 + ldd r12,Z+24 + ldd r13,Z+32 + eor r18,r13 + eor r4,r23 + eor r13,r12 + mov r14,r23 + mov r0,r18 + com r0 + and r14,r0 + mov r15,r4 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r4 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r18 + mov r0,r13 + com r0 + and r16,r0 + eor r18,r15 + eor r23,r24 + eor r4,r25 + eor r12,r16 + eor r13,r14 + eor r23,r18 + eor r12,r4 + eor r18,r13 + com r4 + st Z,r18 + std Z+8,r23 + std Z+24,r12 + std Z+32,r13 + ldd r23,Z+9 + ldd r12,Z+25 + ldd r13,Z+33 + eor r19,r13 + eor r5,r23 + eor r13,r12 + mov r14,r23 + mov r0,r19 + com r0 + and r14,r0 + mov r15,r5 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r5 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r19 + mov r0,r13 + com r0 + and r16,r0 + eor r19,r15 + eor r23,r24 + eor r5,r25 + eor r12,r16 + eor r13,r14 + eor r23,r19 + eor r12,r5 + eor r19,r13 + com r5 + std Z+1,r19 + std Z+9,r23 + std Z+25,r12 + std Z+33,r13 + ldd r23,Z+10 + ldd r12,Z+26 + ldd r13,Z+34 + eor r20,r13 + eor r6,r23 + eor r13,r12 + mov r14,r23 + mov r0,r20 + com r0 + and r14,r0 + mov r15,r6 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r6 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r20 + mov r0,r13 + com r0 + and r16,r0 + eor r20,r15 + eor r23,r24 + eor r6,r25 + eor r12,r16 + eor r13,r14 + eor r23,r20 + eor r12,r6 + eor r20,r13 + com r6 + std Z+2,r20 + std Z+10,r23 + std Z+26,r12 + std Z+34,r13 + ldd r23,Z+11 + ldd r12,Z+27 + ldd r13,Z+35 + eor r21,r13 + eor r7,r23 + eor r13,r12 + mov r14,r23 + mov r0,r21 + com r0 + and r14,r0 + mov r15,r7 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r7 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r21 + mov r0,r13 + com r0 + and r16,r0 + eor r21,r15 + eor r23,r24 + eor r7,r25 + eor r12,r16 + eor r13,r14 + eor r23,r21 + eor r12,r7 + eor r21,r13 + com r7 + std Z+3,r21 + std Z+11,r23 + std Z+27,r12 + std Z+35,r13 + ldd r23,Z+12 + ldd r12,Z+28 + ldd r13,Z+36 + eor r26,r13 + eor r8,r23 + eor r13,r12 + mov r14,r23 + mov r0,r26 + com r0 + and r14,r0 + mov r15,r8 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r8 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r26 + mov r0,r13 + com r0 + and r16,r0 + eor r26,r15 + eor r23,r24 + eor r8,r25 + eor r12,r16 + eor r13,r14 + eor r23,r26 + eor r12,r8 + eor r26,r13 + com r8 + std Z+4,r26 + std Z+12,r23 + std Z+28,r12 + std Z+36,r13 + ldd r23,Z+13 + ldd r12,Z+29 + ldd r13,Z+37 + eor r27,r13 + eor r9,r23 + eor r13,r12 + mov r14,r23 + mov r0,r27 + com r0 + and r14,r0 + mov r15,r9 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r9 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r27 + mov r0,r13 + com r0 + and r16,r0 + eor r27,r15 + eor r23,r24 + eor r9,r25 + eor r12,r16 + eor r13,r14 + eor r23,r27 + eor r12,r9 + eor r27,r13 + com r9 + std Z+5,r27 + std Z+13,r23 + std Z+29,r12 + std Z+37,r13 + ldd r23,Z+14 + ldd r12,Z+30 + ldd r13,Z+38 + eor r2,r13 + eor r10,r23 + eor r13,r12 + mov r14,r23 + mov r0,r2 + com r0 + and r14,r0 + mov r15,r10 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r10 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r2 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r15 + eor r23,r24 + eor r10,r25 + eor r12,r16 + eor r13,r14 + eor r23,r2 + eor r12,r10 + eor r2,r13 + com r10 + std Z+6,r2 + std Z+14,r23 + std Z+30,r12 + std Z+38,r13 + ldd r23,Z+15 + ldd r12,Z+31 + ldd r13,Z+39 + eor r3,r13 + eor r11,r23 + eor r13,r12 + mov r14,r23 + mov r0,r3 + com r0 + and r14,r0 + mov r15,r11 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r11 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r3 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r15 + eor r23,r24 + eor r11,r25 + eor r12,r16 + eor r13,r14 + eor r23,r3 + eor r12,r11 + eor r3,r13 + com r11 + std Z+7,r3 + std Z+15,r23 + std Z+31,r12 + std Z+39,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gascon128_core_round, .-gascon128_core_round + + .text +.global drysponge128_g + .type drysponge128_g, @function +drysponge128_g: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + subi r30,180 + sbci r31,255 + ld r19,Z + subi r30,76 + sbc r31,r1 + ldi r18,240 + std Z+40,r1 + std Z+41,r1 + std Z+42,r1 + std Z+43,r1 + std Z+44,r1 + std Z+45,r1 + std Z+46,r1 + std Z+47,r1 + std Z+48,r1 + std Z+49,r1 + std Z+50,r1 + std Z+51,r1 + std Z+52,r1 + std Z+53,r1 + std Z+54,r1 + std Z+55,r1 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 +38: + eor r4,r18 + ldd r12,Z+8 + ldd r13,Z+24 + ldd r14,Z+32 + eor r20,r14 + eor r4,r12 + eor r14,r13 + mov r15,r12 + mov r0,r20 + com r0 + and r15,r0 + mov r24,r4 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r4 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r20 + mov r0,r14 + com r0 + and r17,r0 + eor r20,r24 + eor r12,r25 + eor r4,r16 + eor r13,r17 + eor r14,r15 + eor r12,r20 + eor r13,r4 + eor r20,r14 + com r4 + st Z,r20 + std Z+8,r12 + std Z+24,r13 + std Z+32,r14 + ldd r12,Z+9 + ldd r13,Z+25 + ldd r14,Z+33 + eor r21,r14 + eor r5,r12 + eor r14,r13 + mov r15,r12 + mov r0,r21 + com r0 + and r15,r0 + mov r24,r5 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r5 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r21 + mov r0,r14 + com r0 + and r17,r0 + eor r21,r24 + eor r12,r25 + eor r5,r16 + eor r13,r17 + eor r14,r15 + eor r12,r21 + eor r13,r5 + eor r21,r14 + com r5 + std Z+1,r21 + std Z+9,r12 + std Z+25,r13 + std Z+33,r14 + ldd r12,Z+10 + ldd r13,Z+26 + ldd r14,Z+34 + eor r22,r14 + eor r6,r12 + eor r14,r13 + mov r15,r12 + mov r0,r22 + com r0 + and r15,r0 + mov r24,r6 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r6 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r22 + mov r0,r14 + com r0 + and r17,r0 + eor r22,r24 + eor r12,r25 + eor r6,r16 + eor r13,r17 + eor r14,r15 + eor r12,r22 + eor r13,r6 + eor r22,r14 + com r6 + std Z+2,r22 + std Z+10,r12 + std Z+26,r13 + std Z+34,r14 + ldd r12,Z+11 + ldd r13,Z+27 + ldd r14,Z+35 + eor r23,r14 + eor r7,r12 + eor r14,r13 + mov r15,r12 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r7 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r7 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r23 + mov r0,r14 + com r0 + and r17,r0 + eor r23,r24 + eor r12,r25 + eor r7,r16 + eor r13,r17 + eor r14,r15 + eor r12,r23 + eor r13,r7 + eor r23,r14 + com r7 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r14 + ldd r12,Z+12 + ldd r13,Z+28 + ldd r14,Z+36 + eor r26,r14 + eor r8,r12 + eor r14,r13 + mov r15,r12 + mov r0,r26 + com r0 + and r15,r0 + mov r24,r8 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r8 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r26 + mov r0,r14 + com r0 + and r17,r0 + eor r26,r24 + eor r12,r25 + eor r8,r16 + eor r13,r17 + eor r14,r15 + eor r12,r26 + eor r13,r8 + eor r26,r14 + com r8 + std Z+4,r26 + std Z+12,r12 + std Z+28,r13 + std Z+36,r14 + ldd r12,Z+13 + ldd r13,Z+29 + ldd r14,Z+37 + eor r27,r14 + eor r9,r12 + eor r14,r13 + mov r15,r12 + mov r0,r27 + com r0 + and r15,r0 + mov r24,r9 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r9 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r27 + mov r0,r14 + com r0 + and r17,r0 + eor r27,r24 + eor r12,r25 + eor r9,r16 + eor r13,r17 + eor r14,r15 + eor r12,r27 + eor r13,r9 + eor r27,r14 + com r9 + std Z+5,r27 + std Z+13,r12 + std Z+29,r13 + std Z+37,r14 + ldd r12,Z+14 + ldd r13,Z+30 + ldd r14,Z+38 + eor r2,r14 + eor r10,r12 + eor r14,r13 + mov r15,r12 + mov r0,r2 + com r0 + and r15,r0 + mov r24,r10 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r10 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r2 + mov r0,r14 + com r0 + and r17,r0 + eor r2,r24 + eor r12,r25 + eor r10,r16 + eor r13,r17 + eor r14,r15 + eor r12,r2 + eor r13,r10 + eor r2,r14 + com r10 + std Z+6,r2 + std Z+14,r12 + std Z+30,r13 + std Z+38,r14 + ldd r12,Z+15 + ldd r13,Z+31 + ldd r14,Z+39 + eor r3,r14 + eor r11,r12 + eor r14,r13 + mov r15,r12 + mov r0,r3 + com r0 + and r15,r0 + mov r24,r11 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r11 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r3 + mov r0,r14 + com r0 + and r17,r0 + eor r3,r24 + eor r12,r25 + eor r11,r16 + eor r13,r17 + eor r14,r15 + eor r12,r3 + eor r13,r11 + eor r3,r14 + com r11 + std Z+7,r3 + std Z+15,r12 + std Z+31,r13 + std Z+39,r14 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r20,Z+24 + ldd r21,Z+25 + ldd r22,Z+26 + ldd r23,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r20 + std Z+25,r21 + std Z+26,r22 + std Z+27,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r22,Z+34 + ldd r23,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r20 + std Z+33,r21 + std Z+34,r22 + std Z+35,r23 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + ldd r12,Z+40 + ldd r13,Z+41 + ldd r14,Z+42 + ldd r15,Z+43 + eor r12,r20 + eor r13,r21 + eor r14,r22 + eor r15,r23 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + std Z+40,r12 + std Z+41,r13 + std Z+42,r14 + std Z+43,r15 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + ldd r0,Z+24 + eor r12,r0 + ldd r0,Z+25 + eor r13,r0 + ldd r0,Z+26 + eor r14,r0 + ldd r0,Z+27 + eor r15,r0 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + ldd r12,Z+48 + ldd r13,Z+49 + ldd r14,Z+50 + ldd r15,Z+51 + ldd r0,Z+8 + eor r12,r0 + ldd r0,Z+9 + eor r13,r0 + ldd r0,Z+10 + eor r14,r0 + ldd r0,Z+11 + eor r15,r0 + ldd r0,Z+28 + eor r12,r0 + ldd r0,Z+29 + eor r13,r0 + ldd r0,Z+30 + eor r14,r0 + ldd r0,Z+31 + eor r15,r0 + std Z+48,r12 + std Z+49,r13 + std Z+50,r14 + std Z+51,r15 + ldd r12,Z+52 + ldd r13,Z+53 + ldd r14,Z+54 + ldd r15,Z+55 + ldd r0,Z+12 + eor r12,r0 + ldd r0,Z+13 + eor r13,r0 + ldd r0,Z+14 + eor r14,r0 + ldd r0,Z+15 + eor r15,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + std Z+52,r12 + std Z+53,r13 + std Z+54,r14 + std Z+55,r15 + subi r18,15 + dec r19 + breq 5904f + rjmp 38b +5904: + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size drysponge128_g, .-drysponge128_g + + .text +.global gascon256_core_round + .type gascon256_core_round, @function +gascon256_core_round: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 26 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r26,Z+ + ld r27,Z+ + ld r2,Z+ + ld r3,Z+ + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + eor r4,r22 + ld r22,Z + ldd r23,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r23,r22 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r22 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r18 + eor r12,r23 + eor r13,r4 + eor r15,r14 + eor r18,r24 + com r4 + std Y+1,r18 + st Z,r22 + std Z+8,r23 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r22,Z+1 + ldd r23,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r23,r22 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r22 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r19 + eor r12,r23 + eor r13,r5 + eor r15,r14 + eor r19,r24 + com r5 + std Y+2,r19 + std Z+1,r22 + std Z+9,r23 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r22,Z+2 + ldd r23,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r23,r22 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r22 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r20 + eor r12,r23 + eor r13,r6 + eor r15,r14 + eor r20,r24 + com r6 + std Y+3,r20 + std Z+2,r22 + std Z+10,r23 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r22,Z+3 + ldd r23,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r23,r22 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r22 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r21 + eor r12,r23 + eor r13,r7 + eor r15,r14 + eor r21,r24 + com r7 + std Y+4,r21 + std Z+3,r22 + std Z+11,r23 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r22,Z+4 + ldd r23,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r26,r24 + eor r23,r22 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r22 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r26 + eor r12,r23 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+5,r26 + std Z+4,r22 + std Z+12,r23 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r22,Z+5 + ldd r23,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r27,r24 + eor r23,r22 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r22 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r27 + eor r12,r23 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+6,r27 + std Z+5,r22 + std Z+13,r23 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r22,Z+6 + ldd r23,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r2,r24 + eor r23,r22 + eor r10,r12 + eor r14,r13 + eor r24,r15 + mov r17,r2 + mov r25,r22 + mov r0,r2 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r10 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r10 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r2 + eor r12,r23 + eor r13,r10 + eor r15,r14 + eor r2,r24 + com r10 + std Y+7,r2 + std Z+6,r22 + std Z+14,r23 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r22,Z+7 + ldd r23,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r3,r24 + eor r23,r22 + eor r11,r12 + eor r14,r13 + eor r24,r15 + mov r17,r3 + mov r25,r22 + mov r0,r3 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r11 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r11 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r3 + eor r12,r23 + eor r13,r11 + eor r15,r14 + eor r3,r24 + com r11 + std Y+8,r3 + std Z+7,r22 + std Z+15,r23 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + bst r22,0 + lsr r13 + ror r12 + ror r23 + ror r22 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r2 + std Z+23,r3 + movw r22,r4 + movw r12,r6 + movw r14,r8 + movw r24,r10 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r4 + eor r15,r5 + eor r24,r6 + eor r25,r7 + eor r22,r8 + eor r23,r9 + eor r12,r10 + eor r13,r11 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r14 + eor r5,r15 + eor r6,r24 + eor r7,r25 + eor r8,r22 + eor r9,r23 + eor r10,r12 + eor r11,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r12 + mov r12,r0 + mov r0,r23 + mov r23,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r26 + std Z+45,r27 + std Z+46,r2 + std Z+47,r3 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r26,Z+52 + ldd r27,Z+53 + ldd r2,Z+54 + ldd r3,Z+55 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r26 + std Z+53,r27 + std Z+54,r2 + std Z+55,r3 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r26,Z+60 + ldd r27,Z+61 + ldd r2,Z+62 + ldd r3,Z+63 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r26 + std Z+61,r27 + std Z+62,r2 + std Z+63,r3 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r2,Y+7 + ldd r3,Y+8 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+24,r4 + std Z+25,r5 + std Z+26,r6 + std Z+27,r7 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + st -Z,r3 + st -Z,r2 + st -Z,r27 + st -Z,r26 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + adiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gascon256_core_round, .-gascon256_core_round + + .text +.global drysponge256_g + .type drysponge256_g, @function +drysponge256_g: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 44 + subi r30,148 + sbci r31,255 + ld r19,Z + subi r30,108 + sbc r31,r1 + ldi r18,240 + std Y+25,r19 + std Y+26,r18 + std Y+9,r1 + std Y+10,r1 + std Y+11,r1 + std Y+12,r1 + std Y+13,r1 + std Y+14,r1 + std Y+15,r1 + std Y+16,r1 + std Y+17,r1 + std Y+18,r1 + std Y+19,r1 + std Y+20,r1 + std Y+21,r1 + std Y+22,r1 + std Y+23,r1 + std Y+24,r1 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r22,Z+ + ld r23,Z+ + ld r26,Z+ + ld r27,Z+ + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 +40: + ldd r24,Y+26 + eor r2,r24 + subi r24,15 + std Y+26,r24 + ld r10,Z + ldd r11,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r11,r10 + eor r2,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r10 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r2 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r2 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r18 + eor r12,r11 + eor r13,r2 + eor r15,r14 + eor r18,r24 + com r2 + std Y+1,r18 + st Z,r10 + std Z+8,r11 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r10,Z+1 + ldd r11,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r11,r10 + eor r3,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r10 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r3 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r3 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r19 + eor r12,r11 + eor r13,r3 + eor r15,r14 + eor r19,r24 + com r3 + std Y+2,r19 + std Z+1,r10 + std Z+9,r11 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r10,Z+2 + ldd r11,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r11,r10 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r10 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r20 + eor r12,r11 + eor r13,r4 + eor r15,r14 + eor r20,r24 + com r4 + std Y+3,r20 + std Z+2,r10 + std Z+10,r11 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r10,Z+3 + ldd r11,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r11,r10 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r10 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r21 + eor r12,r11 + eor r13,r5 + eor r15,r14 + eor r21,r24 + com r5 + std Y+4,r21 + std Z+3,r10 + std Z+11,r11 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r10,Z+4 + ldd r11,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r22,r24 + eor r11,r10 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r22 + mov r25,r10 + mov r0,r22 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r22 + eor r12,r11 + eor r13,r6 + eor r15,r14 + eor r22,r24 + com r6 + std Y+5,r22 + std Z+4,r10 + std Z+12,r11 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r10,Z+5 + ldd r11,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r23,r24 + eor r11,r10 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r23 + mov r25,r10 + mov r0,r23 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r23 + eor r12,r11 + eor r13,r7 + eor r15,r14 + eor r23,r24 + com r7 + std Y+6,r23 + std Z+5,r10 + std Z+13,r11 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r10,Z+6 + ldd r11,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r26,r24 + eor r11,r10 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r10 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r26 + eor r12,r11 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+7,r26 + std Z+6,r10 + std Z+14,r11 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r10,Z+7 + ldd r11,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r27,r24 + eor r11,r10 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r10 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r27 + eor r12,r11 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+8,r27 + std Z+7,r10 + std Z+15,r11 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + bst r10,0 + lsr r13 + ror r12 + ror r11 + ror r10 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r23 + mov r23,r26 + mov r26,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r22 + std Z+21,r23 + std Z+22,r26 + std Z+23,r27 + movw r10,r2 + movw r12,r4 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + mov r0,r2 + mov r2,r4 + mov r4,r0 + mov r0,r3 + mov r3,r5 + mov r5,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + or r5,r0 + mov r0,r6 + mov r6,r8 + mov r8,r0 + mov r0,r7 + mov r7,r9 + mov r9,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r6,r10 + eor r7,r11 + eor r8,r12 + eor r9,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r26,Z+38 + ldd r27,Z+39 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r12 + mov r12,r0 + mov r0,r11 + mov r11,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r22 + std Z+37,r23 + std Z+38,r26 + std Z+39,r27 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r22,Z+44 + ldd r23,Z+45 + ldd r26,Z+46 + ldd r27,Z+47 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r22 + std Z+45,r23 + std Z+46,r26 + std Z+47,r27 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r22,Z+52 + ldd r23,Z+53 + ldd r26,Z+54 + ldd r27,Z+55 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r22 + std Z+53,r23 + std Z+54,r26 + std Z+55,r27 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r22,Z+60 + ldd r23,Z+61 + ldd r26,Z+62 + ldd r27,Z+63 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r22 + std Z+61,r23 + std Z+62,r26 + std Z+63,r27 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + ldd r10,Y+9 + ldd r11,Y+10 + ldd r12,Y+11 + ldd r13,Y+12 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + ldd r0,Z+12 + eor r10,r0 + ldd r0,Z+13 + eor r11,r0 + ldd r0,Z+14 + eor r12,r0 + ldd r0,Z+15 + eor r13,r0 + ldd r0,Z+32 + eor r10,r0 + ldd r0,Z+33 + eor r11,r0 + ldd r0,Z+34 + eor r12,r0 + ldd r0,Z+35 + eor r13,r0 + ldd r0,Z+52 + eor r10,r0 + ldd r0,Z+53 + eor r11,r0 + ldd r0,Z+54 + eor r12,r0 + ldd r0,Z+55 + eor r13,r0 + std Y+9,r10 + std Y+10,r11 + std Y+11,r12 + std Y+12,r13 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + ldd r0,Z+16 + eor r10,r0 + ldd r0,Z+17 + eor r11,r0 + ldd r0,Z+18 + eor r12,r0 + ldd r0,Z+19 + eor r13,r0 + ldd r0,Z+36 + eor r10,r0 + ldd r0,Z+37 + eor r11,r0 + ldd r0,Z+38 + eor r12,r0 + ldd r0,Z+39 + eor r13,r0 + ldd r0,Z+40 + eor r10,r0 + ldd r0,Z+41 + eor r11,r0 + ldd r0,Z+42 + eor r12,r0 + ldd r0,Z+43 + eor r13,r0 + std Y+13,r10 + std Y+14,r11 + std Y+15,r12 + std Y+16,r13 + ldd r10,Y+17 + ldd r11,Y+18 + ldd r12,Y+19 + ldd r13,Y+20 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + ld r0,Z + eor r10,r0 + ldd r0,Z+1 + eor r11,r0 + ldd r0,Z+2 + eor r12,r0 + ldd r0,Z+3 + eor r13,r0 + ldd r0,Z+20 + eor r10,r0 + ldd r0,Z+21 + eor r11,r0 + ldd r0,Z+22 + eor r12,r0 + ldd r0,Z+23 + eor r13,r0 + ldd r0,Z+44 + eor r10,r0 + ldd r0,Z+45 + eor r11,r0 + ldd r0,Z+46 + eor r12,r0 + ldd r0,Z+47 + eor r13,r0 + std Y+17,r10 + std Y+18,r11 + std Y+19,r12 + std Y+20,r13 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + ldd r0,Z+4 + eor r10,r0 + ldd r0,Z+5 + eor r11,r0 + ldd r0,Z+6 + eor r12,r0 + ldd r0,Z+7 + eor r13,r0 + ldd r0,Z+8 + eor r10,r0 + ldd r0,Z+9 + eor r11,r0 + ldd r0,Z+10 + eor r12,r0 + ldd r0,Z+11 + eor r13,r0 + ldd r0,Z+48 + eor r10,r0 + ldd r0,Z+49 + eor r11,r0 + ldd r0,Z+50 + eor r12,r0 + ldd r0,Z+51 + eor r13,r0 + std Y+21,r10 + std Y+22,r11 + std Y+23,r12 + std Y+24,r13 + ldd r10,Y+25 + dec r10 + std Y+25,r10 + breq 6623f + rjmp 40b +6623: + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + st -Z,r27 + st -Z,r26 + st -Z,r23 + st -Z,r22 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + ldi r25,72 + add r30,r25 + adc r31,r1 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + ldd r2,Y+17 + ldd r3,Y+18 + ldd r4,Y+19 + ldd r5,Y+20 + ldd r6,Y+21 + ldd r7,Y+22 + ldd r8,Y+23 + ldd r9,Y+24 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + adiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size drysponge256_g, .-drysponge256_g + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.c b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.c new file mode 100644 index 0000000..6dfe48c --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.c @@ -0,0 +1,611 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-drysponge.h" +#include + +#if !defined(__AVR__) + +/* Right rotations in bit-interleaved format */ +#define intRightRotateEven(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, (bits)); \ + _x1 = rightRotate(_x1, (bits)); \ + _x0 | (((uint64_t)_x1) << 32); \ + })) +#define intRightRotateOdd(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, ((bits) + 1) % 32); \ + _x1 = rightRotate(_x1, (bits)); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate1_64(x) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate1(_x0); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate2_64(x) (intRightRotateEven((x), 1)) +#define intRightRotate3_64(x) (intRightRotateOdd((x), 1)) +#define intRightRotate4_64(x) (intRightRotateEven((x), 2)) +#define intRightRotate5_64(x) (intRightRotateOdd((x), 2)) +#define intRightRotate6_64(x) (intRightRotateEven((x), 3)) +#define intRightRotate7_64(x) (intRightRotateOdd((x), 3)) +#define intRightRotate8_64(x) (intRightRotateEven((x), 4)) +#define intRightRotate9_64(x) (intRightRotateOdd((x), 4)) +#define intRightRotate10_64(x) (intRightRotateEven((x), 5)) +#define intRightRotate11_64(x) (intRightRotateOdd((x), 5)) +#define intRightRotate12_64(x) (intRightRotateEven((x), 6)) +#define intRightRotate13_64(x) (intRightRotateOdd((x), 6)) +#define intRightRotate14_64(x) (intRightRotateEven((x), 7)) +#define intRightRotate15_64(x) (intRightRotateOdd((x), 7)) +#define intRightRotate16_64(x) (intRightRotateEven((x), 8)) +#define intRightRotate17_64(x) (intRightRotateOdd((x), 8)) +#define intRightRotate18_64(x) (intRightRotateEven((x), 9)) +#define intRightRotate19_64(x) (intRightRotateOdd((x), 9)) +#define intRightRotate20_64(x) (intRightRotateEven((x), 10)) +#define intRightRotate21_64(x) (intRightRotateOdd((x), 10)) +#define intRightRotate22_64(x) (intRightRotateEven((x), 11)) +#define intRightRotate23_64(x) (intRightRotateOdd((x), 11)) +#define intRightRotate24_64(x) (intRightRotateEven((x), 12)) +#define intRightRotate25_64(x) (intRightRotateOdd((x), 12)) +#define intRightRotate26_64(x) (intRightRotateEven((x), 13)) +#define intRightRotate27_64(x) (intRightRotateOdd((x), 13)) +#define intRightRotate28_64(x) (intRightRotateEven((x), 14)) +#define intRightRotate29_64(x) (intRightRotateOdd((x), 14)) +#define intRightRotate30_64(x) (intRightRotateEven((x), 15)) +#define intRightRotate31_64(x) (intRightRotateOdd((x), 15)) +#define intRightRotate32_64(x) (intRightRotateEven((x), 16)) +#define intRightRotate33_64(x) (intRightRotateOdd((x), 16)) +#define intRightRotate34_64(x) (intRightRotateEven((x), 17)) +#define intRightRotate35_64(x) (intRightRotateOdd((x), 17)) +#define intRightRotate36_64(x) (intRightRotateEven((x), 18)) +#define intRightRotate37_64(x) (intRightRotateOdd((x), 18)) +#define intRightRotate38_64(x) (intRightRotateEven((x), 19)) +#define intRightRotate39_64(x) (intRightRotateOdd((x), 19)) +#define intRightRotate40_64(x) (intRightRotateEven((x), 20)) +#define intRightRotate41_64(x) (intRightRotateOdd((x), 20)) +#define intRightRotate42_64(x) (intRightRotateEven((x), 21)) +#define intRightRotate43_64(x) (intRightRotateOdd((x), 21)) +#define intRightRotate44_64(x) (intRightRotateEven((x), 22)) +#define intRightRotate45_64(x) (intRightRotateOdd((x), 22)) +#define intRightRotate46_64(x) (intRightRotateEven((x), 23)) +#define intRightRotate47_64(x) (intRightRotateOdd((x), 23)) +#define intRightRotate48_64(x) (intRightRotateEven((x), 24)) +#define intRightRotate49_64(x) (intRightRotateOdd((x), 24)) +#define intRightRotate50_64(x) (intRightRotateEven((x), 25)) +#define intRightRotate51_64(x) (intRightRotateOdd((x), 25)) +#define intRightRotate52_64(x) (intRightRotateEven((x), 26)) +#define intRightRotate53_64(x) (intRightRotateOdd((x), 26)) +#define intRightRotate54_64(x) (intRightRotateEven((x), 27)) +#define intRightRotate55_64(x) (intRightRotateOdd((x), 27)) +#define intRightRotate56_64(x) (intRightRotateEven((x), 28)) +#define intRightRotate57_64(x) (intRightRotateOdd((x), 28)) +#define intRightRotate58_64(x) (intRightRotateEven((x), 29)) +#define intRightRotate59_64(x) (intRightRotateOdd((x), 29)) +#define intRightRotate60_64(x) (intRightRotateEven((x), 30)) +#define intRightRotate61_64(x) (intRightRotateOdd((x), 30)) +#define intRightRotate62_64(x) (intRightRotateEven((x), 31)) +#define intRightRotate63_64(x) (intRightRotateOdd((x), 31)) + +void gascon128_core_round(gascon128_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); +#endif + + /* Add the round constant to the middle of the state */ + x2 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x4; x2 ^= x1; x4 ^= x3; t0 = (~x0) & x1; t1 = (~x1) & x2; + t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x0; x0 ^= t1; + x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; x1 ^= x0; x3 ^= x2; + x0 ^= x4; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); +#endif +} + +void gascon256_core_round(gascon256_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; + uint64_t x8 = state->S[8]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); + uint64_t x8 = le_load_word64(state->B + 64); +#endif + + /* Add the round constant to the middle of the state */ + x4 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x8; x2 ^= x1; x4 ^= x3; x6 ^= x5; x8 ^= x7; t0 = (~x0) & x1; + t1 = (~x1) & x2; t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x5; + t5 = (~x5) & x6; t6 = (~x6) & x7; t7 = (~x7) & x8; t8 = (~x8) & x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t5; x5 ^= t6; x6 ^= t7; + x7 ^= t8; x8 ^= t0; x1 ^= x0; x3 ^= x2; x5 ^= x4; x7 ^= x6; x0 ^= x8; + x4 = ~x4; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + x5 ^= intRightRotate31_64(x5) ^ intRightRotate26_64(x5); + x6 ^= intRightRotate53_64(x6) ^ intRightRotate58_64(x6); + x7 ^= intRightRotate9_64(x7) ^ intRightRotate46_64(x7); + x8 ^= intRightRotate43_64(x8) ^ intRightRotate50_64(x8); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; + state->S[8] = x8; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); + le_store_word64(state->B + 64, x8); +#endif +} + +void drysponge128_g(drysponge128_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes */ + gascon128_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon128_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4]; + } +} + +void drysponge256_g(drysponge256_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes. + * And so on for a total of 64 bytes XOR'ed into the output data. */ + gascon256_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon256_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + } +} + +#endif /* !__AVR__ */ + +void drysponge128_g_core(drysponge128_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon128_core_round(&(state->c), round); +} + +void drysponge256_g_core(drysponge256_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon256_core_round(&(state->c), round); +} + +/** + * \fn uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) + * \brief Selects an element of x in constant time. + * + * \param x Points to the four elements of x. + * \param index Index of which element to extract between 0 and 3. + * + * \return The selected element of x. + */ +#if !defined(__AVR__) +STATIC_INLINE uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) +{ + /* We need to be careful how we select each element of x because + * we are doing a data-dependent fetch here. Do the fetch in a way + * that should avoid cache timing issues by fetching every element + * of x and masking away the ones we don't want. + * + * There is a possible side channel here with respect to power analysis. + * The "mask" value will be all-ones for the selected index and all-zeroes + * for the other indexes. This may show up as different power consumption + * for the "result ^= x[i] & mask" statement when i is the selected index. + * Such a side channel could in theory allow reading the plaintext input + * to the cipher by analysing the CPU's power consumption. + * + * The DryGASCON specification acknowledges the possibility of plaintext + * recovery in section 7.4. For software mitigation the specification + * suggests randomization of the indexes into c and x and randomization + * of the order of processing words. We aren't doing that here yet. + * Patches welcome to fix this. + */ + uint32_t mask = -((uint32_t)((0x04 - index) >> 2)); + uint32_t result = x[0] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x01)) >> 2)); + result ^= x[1] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x02)) >> 2)); + result ^= x[2] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x03)) >> 2)); + return result ^ (x[3] & mask); +} +#else +/* AVR is more or less immune to cache timing issues because it doesn't + * have anything like an L1 or L2 cache. Select the word directly */ +#define drysponge_select_x(x, index) ((x)[(index)]) +#endif + +/** + * \brief Mixes a 32-bit value into the DrySPONGE128 state. + * + * \param state DrySPONGE128 state. + * \param data The data to be mixed in the bottom 10 bits. + */ +static void drysponge128_mix_phase_round + (drysponge128_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); +} + +/** + * \brief Mixes a 32-bit value into the DrySPONGE256 state. + * + * \param state DrySPONGE256 state. + * \param data The data to be mixed in the bottom 18 bits. + */ +static void drysponge256_mix_phase_round + (drysponge256_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); + state->c.W[10] ^= drysponge_select_x(state->x.W, (data >> 10) & 0x03); + state->c.W[12] ^= drysponge_select_x(state->x.W, (data >> 12) & 0x03); + state->c.W[14] ^= drysponge_select_x(state->x.W, (data >> 14) & 0x03); + state->c.W[16] ^= drysponge_select_x(state->x.W, (data >> 16) & 0x03); +} + +/** + * \brief Mixes an input block into a DrySPONGE128 state. + * + * \param state The DrySPONGE128 state. + * \param data Full rate block containing the input data. + */ +static void drysponge128_mix_phase + (drysponge128_state_t *state, const unsigned char data[DRYSPONGE128_RATE]) +{ + /* Mix 10-bit groups into the output, with the domain + * separator added to the last two groups */ + drysponge128_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[1] >> 2) | (((uint32_t)(data[2])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[2] >> 4) | (((uint32_t)(data[3])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[3] >> 6) | (((uint32_t)(data[4])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[5] | (((uint32_t)(data[6])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[6] >> 2) | (((uint32_t)(data[7])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[7] >> 4) | (((uint32_t)(data[8])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[8] >> 6) | (((uint32_t)(data[9])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[10] | (((uint32_t)(data[11])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[12] >> 4) | (((uint32_t)(data[13])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, ((data[13] >> 6) | (((uint32_t)(data[14])) << 2))); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, data[15] ^ state->domain); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, state->domain >> 10); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +/** + * \brief Mixes an input block into a DrySPONGE256 state. + * + * \param state The DrySPONGE256 state. + * \param data Full rate block containing the input data. + */ +static void drysponge256_mix_phase + (drysponge256_state_t *state, const unsigned char data[DRYSPONGE256_RATE]) +{ + /* Mix 18-bit groups into the output, with the domain in the last group */ + drysponge256_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[2] >> 2) | (((uint32_t)(data[3])) << 6) | + (((uint32_t)(data[4])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[4] >> 4) | (((uint32_t)(data[5])) << 4) | + (((uint32_t)(data[6])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[6] >> 6) | (((uint32_t)(data[7])) << 2) | + (((uint32_t)(data[8])) << 10)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, data[9] | (((uint32_t)(data[10])) << 8) | + (((uint32_t)(data[11])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6) | + (((uint32_t)(data[13])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[13] >> 4) | (((uint32_t)(data[14])) << 4) | + (((uint32_t)(data[15])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[15] >> 6) ^ state->domain); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE128_RATE) { + drysponge128_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE128_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE128_RATE - len - 1); + drysponge128_mix_phase(state, padded); + } +} + +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE256_RATE) { + drysponge256_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE256_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE256_RATE - len - 1); + drysponge256_mix_phase(state, padded); + } +} + +/** + * \brief Determine if some of the words of an "x" value are identical. + * + * \param x Points to the "x" buffer to check. + * + * \return Non-zero if some of the words are the same, zero if they are + * distinct from each other. + * + * We try to perform the check in constant time to avoid giving away + * any information about the value of the key. + */ +static int drysponge_x_words_are_same(const uint32_t x[4]) +{ + unsigned i, j; + int result = 0; + for (i = 0; i < 3; ++i) { + for (j = i + 1; j < 4; ++j) { + uint32_t check = x[i] ^ x[j]; + result |= (int)((0x100000000ULL - check) >> 32); + } + } + return result; +} + +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-128 state with repeated copies of the key */ + memcpy(state->c.B, key, 16); + memcpy(state->c.B + 16, key, 16); + memcpy(state->c.B + 32, key, 8); + + /* Generate the "x" value for the state. All four words of "x" + * must be unique because they will be used in drysponge_select_x() + * as stand-ins for the bit pairs 00, 01, 10, and 11. + * + * Run the core block operation over and over until "x" is unique. + * Technically the runtime here is key-dependent and not constant. + * If the input key is randomized, this should only take 1 round + * on average so it is "almost constant time". + */ + do { + gascon128_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE128_INIT_ROUNDS; + state->domain = DRYDOMAIN128_NONCE; + if (final_block) + state->domain |= DRYDOMAIN128_FINAL; + drysponge128_f_absorb(state, nonce, 16); + drysponge128_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE128_ROUNDS; +} + +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-256 state with repeated copies of the key */ + memcpy(state->c.B, key, 32); + memcpy(state->c.B + 32, key, 32); + memcpy(state->c.B + 64, key, 8); + + /* Generate the "x" value for the state */ + do { + gascon256_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE256_INIT_ROUNDS; + state->domain = DRYDOMAIN256_NONCE; + if (final_block) + state->domain |= DRYDOMAIN256_FINAL; + drysponge256_f_absorb(state, nonce, 16); + drysponge256_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE256_ROUNDS; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.h b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.h new file mode 100644 index 0000000..05b0c16 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-drysponge.h @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_DRYSPONGE_H +#define LW_INTERNAL_DRYSPONGE_H + +#include "internal-util.h" + +/** + * \file internal-drysponge.h + * \brief Internal implementation of DrySPONGE for the DryGASCON cipher. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the GASCON-128 permutation state in bytes. + */ +#define GASCON128_STATE_SIZE 40 + +/** + * \brief Size of the GASCON-256 permutation state in bytes. + */ +#define GASCON256_STATE_SIZE 72 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE128. + */ +#define DRYSPONGE128_RATE 16 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE256. + */ +#define DRYSPONGE256_RATE 16 + +/** + * \brief Size of the "x" value for DrySPONGE128. + */ +#define DRYSPONGE128_XSIZE 16 + +/** + * \brief Size of the "x" value for DrySPONGE256. + */ +#define DRYSPONGE256_XSIZE 16 + +/** + * \brief Normal number of rounds for DrySPONGE128 when absorbing + * and squeezing data. + */ +#define DRYSPONGE128_ROUNDS 7 + +/** + * \brief Number of rounds for DrySPONGE128 during initialization. + */ +#define DRYSPONGE128_INIT_ROUNDS 11 + +/** + * \brief Normal number of rounds for DrySPONGE256 when absorbing + * and squeezing data. + */ +#define DRYSPONGE256_ROUNDS 8 + +/** + * \brief Number of rounds for DrySPONGE256 during initialization. + */ +#define DRYSPONGE256_INIT_ROUNDS 12 + +/** + * \brief DrySPONGE128 domain bit for a padded block. + */ +#define DRYDOMAIN128_PADDED (1 << 8) + +/** + * \brief DrySPONGE128 domain bit for a final block. + */ +#define DRYDOMAIN128_FINAL (1 << 9) + +/** + * \brief DrySPONGE128 domain value for processing the nonce. + */ +#define DRYDOMAIN128_NONCE (1 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the associated data. + */ +#define DRYDOMAIN128_ASSOC_DATA (2 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the message. + */ +#define DRYDOMAIN128_MESSAGE (3 << 10) + +/** + * \brief DrySPONGE256 domain bit for a padded block. + */ +#define DRYDOMAIN256_PADDED (1 << 2) + +/** + * \brief DrySPONGE256 domain bit for a final block. + */ +#define DRYDOMAIN256_FINAL (1 << 3) + +/** + * \brief DrySPONGE256 domain value for processing the nonce. + */ +#define DRYDOMAIN256_NONCE (1 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the associated data. + */ +#define DRYDOMAIN256_ASSOC_DATA (2 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the message. + */ +#define DRYDOMAIN256_MESSAGE (3 << 4) + +/** + * \brief Internal state of the GASCON-128 permutation. + */ +typedef union +{ + uint64_t S[GASCON128_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON128_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON128_STATE_SIZE]; /**< Bytes of the state */ + +} gascon128_state_t; + +/** + * \brief Internal state of the GASCON-256 permutation. + */ +typedef union +{ + uint64_t S[GASCON256_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON256_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON256_STATE_SIZE]; /**< Bytes of the state */ + +} gascon256_state_t; + +/** + * \brief Structure of a rate block for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_RATE]; /**< Bytes of the rate */ + +} drysponge128_rate_t; + +/** + * \brief Structure of a rate block for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_RATE]; /**< Bytes of the rate */ + +} drysponge256_rate_t; + +/** + * \brief Structure of the "x" value for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_XSIZE]; /**< Bytes of the rate */ + +} drysponge128_x_t; + +/** + * \brief Structure of the "x" value for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_XSIZE]; /**< Bytes of the rate */ + +} drysponge256_x_t; + +/** + * \brief Structure of the rolling DrySPONGE128 state. + */ +typedef struct +{ + gascon128_state_t c; /**< GASCON-128 state for the capacity */ + drysponge128_rate_t r; /**< Buffer for a rate block of data */ + drysponge128_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge128_state_t; + +/** + * \brief Structure of the rolling DrySPONGE256 state. + */ +typedef struct +{ + gascon256_state_t c; /**< GASCON-256 state for the capacity */ + drysponge256_rate_t r; /**< Buffer for a rate block of data */ + drysponge256_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge256_state_t; + +/** + * \brief Permutes the GASCON-128 state using one iteration of CoreRound. + * + * \param state The GASCON-128 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon128_core_round(gascon128_state_t *state, uint8_t round); + +/** + * \brief Permutes the GASCON-256 state using one iteration of CoreRound. + * + * \param state The GASCON-256 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon256_core_round(gascon256_state_t *state, uint8_t round); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds and squeezes data out of the GASGON-128 state. + * + * \param state The DrySPONGE128 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge128_g(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds and squeezes data out of the GASGON-256 state. + * + * \param state The DrySPONGE256 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge256_g(drysponge256_state_t *state); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE128 state. + */ +void drysponge128_g_core(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE256 state. + */ +void drysponge256_g_core(drysponge256_state_t *state); + +/** + * \brief Performs the absorption phase of the DrySPONGE128 F function. + * + * \param state The DrySPONGE128 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE128_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge128_g() or + * drysponge128_g_core() to perform the full F operation. + */ +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Performs the absorption phase of the DrySPONGE256 F function. + * + * \param state The DrySPONGE256 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE256_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge256_g() or + * drysponge256_g_core() to perform the full F operation. + */ +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Set up a DrySPONGE128 state to begin encryption or decryption. + * + * \param state The DrySPONGE128 state. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +/** + * \brief Set up a DrySPONGE256 state to begin encryption or decryption. + * + * \param state The DrySPONGE256 state. + * \param key Points to the 32 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-util.h b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon128/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.c b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.h b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/api.h b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/api.h new file mode 100644 index 0000000..75fabd7 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 32 +#define CRYPTO_NOOVERLAP 1 diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.c b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.c new file mode 100644 index 0000000..e963903 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.c @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "drygascon.h" +#include "internal-drysponge.h" +#include + +aead_cipher_t const drygascon128_cipher = { + "DryGASCON128", + DRYGASCON128_KEY_SIZE, + DRYGASCON128_NONCE_SIZE, + DRYGASCON128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_aead_encrypt, + drygascon128_aead_decrypt +}; + +aead_cipher_t const drygascon256_cipher = { + "DryGASCON256", + DRYGASCON256_KEY_SIZE, + DRYGASCON256_NONCE_SIZE, + DRYGASCON256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_aead_encrypt, + drygascon256_aead_decrypt +}; + +aead_hash_algorithm_t const drygascon128_hash_algorithm = { + "DryGASCON128-HASH", + sizeof(int), + DRYGASCON128_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const drygascon256_hash_algorithm = { + "DryGASCON256-HASH", + sizeof(int), + DRYGASCON256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Processes associated data for DryGASCON128. + * + * \param state DrySPONGE128 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon128_process_ad + (drysponge128_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(state, ad, DRYSPONGE128_RATE); + drysponge128_g_core(state); + ad += DRYSPONGE128_RATE; + adlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN128_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN128_FINAL; + if (adlen < DRYSPONGE128_RATE) + state->domain |= DRYDOMAIN128_PADDED; + drysponge128_f_absorb(state, ad, (unsigned)adlen); + drysponge128_g(state); +} + +/** + * \brief Processes associated data for DryGASCON256. + * + * \param state DrySPONGE256 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon256_process_ad + (drysponge256_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(state, ad, DRYSPONGE256_RATE); + drysponge256_g_core(state); + ad += DRYSPONGE256_RATE; + adlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN256_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN256_FINAL; + if (adlen < DRYSPONGE256_RATE) + state->domain |= DRYDOMAIN256_PADDED; + drysponge256_f_absorb(state, ad, (unsigned)adlen); + drysponge256_g(state); +} + +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge128_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + mlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (mlen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)mlen; + drysponge128_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge128_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, DRYGASCON128_TAG_SIZE); + return 0; +} + +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON128_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON128_TAG_SIZE; + drysponge128_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE128_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE128_RATE); + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + clen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (clen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge128_f_absorb(&state, m, temp); + drysponge128_g(&state); + c += temp; + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state.r.B, c, DRYGASCON128_TAG_SIZE); +} + +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge256_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + mlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (mlen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)mlen; + drysponge256_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge256_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, 16); + drysponge256_g(&state); + memcpy(c + 16, state.r.B, 16); + return 0; +} + +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned char *mtemp = m; + unsigned temp; + int result; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON256_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON256_TAG_SIZE; + drysponge256_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE256_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE256_RATE); + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + clen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (clen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge256_f_absorb(&state, m, temp); + drysponge256_g(&state); + c += temp; + } + + /* Check the authentication tag which is split into two pieces */ + result = aead_check_tag(0, 0, state.r.B, c, 16); + drysponge256_g(&state); + return aead_check_tag_precheck + (mtemp, *mlen, state.r.B, c + 16, 16, ~result); +} + +/** + * \brief Precomputed initialization vector for DryGASCON128-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE128. + */ +static unsigned char const drygascon128_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89 +}; + +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge128_state_t state; + memcpy(state.c.B, drygascon128_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon128_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE128_ROUNDS; + drygascon128_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge128_g(&state); + memcpy(out + 16, state.r.B, 16); + return 0; +} + +/** + * \brief Precomputed initialization vector for DryGASCON256-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE256. + */ +static unsigned char const drygascon256_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0x45, 0x28, 0x21, 0xe6, 0x38, 0xd0, 0x13, 0x77, + 0xbe, 0x54, 0x66, 0xcf, 0x34, 0xe9, 0x0c, 0x6c +}; + +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge256_state_t state; + memcpy(state.c.B, drygascon256_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon256_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE256_ROUNDS; + drygascon256_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 16, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 32, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 48, state.r.B, 16); + return 0; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.h b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.h new file mode 100644 index 0000000..12e18c3 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/drygascon.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_DRYGASCON_H +#define LWCRYPTO_DRYGASCON_H + +#include "aead-common.h" + +/** + * \file drygascon.h + * \brief DryGASCON authenticated encryption algorithm. + * + * DryGASCON is a family of authenticated encryption algorithms based + * around a generalised version of the ASCON permutation. DryGASCON + * is designed to provide some protection against power analysis. + * + * There are four algorithms in the DryGASCON family: + * + * \li DryGASCON128 is an authenticated encryption algorithm with a + * 128-bit key, a 128-bit nonce, and a 128-bit authentication tag. + * \li DryGASCON256 is an authenticated encryption algorithm with a + * 256-bit key, a 128-bit nonce, and a 128-256 authentication tag. + * \li DryGASCON128-HASH is a hash algorithm with a 256-bit output. + * \li DryGASCON256-HASH is a hash algorithm with a 512-bit output. + * + * DryGASCON128 and DryGASCON128-HASH are the primary members of the family. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for DryGASCON128. + */ +#define DRYGASCON128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for DryGASCON128. + */ +#define DRYGASCON128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for DryGASCON128. + */ +#define DRYGASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON128-HASH. + */ +#define DRYGASCON128_HASH_SIZE 32 + +/** + * \brief Size of the key for DryGASCON256. + */ +#define DRYGASCON256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for DryGASCON256. + */ +#define DRYGASCON256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for DryGASCON256. + */ +#define DRYGASCON256_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON256-HASH. + */ +#define DRYGASCON256_HASH_SIZE 64 + +/** + * \brief Meta-information block for the DryGASCON128 cipher. + */ +extern aead_cipher_t const drygascon128_cipher; + +/** + * \brief Meta-information block for the DryGASCON256 cipher. + */ +extern aead_cipher_t const drygascon256_cipher; + +/** + * \brief Meta-information block for DryGASCON128-HASH. + */ +extern aead_hash_algorithm_t const drygascon128_hash_algorithm; + +/** + * \brief Meta-information block for DryGASCON256-HASH. + */ +extern aead_hash_algorithm_t const drygascon256_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with DryGASCON128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon128_aead_decrypt() + */ +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon128_aead_encrypt() + */ +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with DryGASCON256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon256_aead_decrypt() + */ +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon256_aead_encrypt() + */ +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with DRYGASCON128. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON128_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with DRYGASCON256. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/encrypt.c b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/encrypt.c new file mode 100644 index 0000000..9f3c373 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "drygascon.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return drygascon256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return drygascon256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge-avr.S b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge-avr.S new file mode 100644 index 0000000..84d0ff8 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge-avr.S @@ -0,0 +1,5092 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gascon128_core_round + .type gascon128_core_round, @function +gascon128_core_round: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + eor r4,r22 + ldd r23,Z+8 + ldd r12,Z+24 + ldd r13,Z+32 + eor r18,r13 + eor r4,r23 + eor r13,r12 + mov r14,r23 + mov r0,r18 + com r0 + and r14,r0 + mov r15,r4 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r4 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r18 + mov r0,r13 + com r0 + and r16,r0 + eor r18,r15 + eor r23,r24 + eor r4,r25 + eor r12,r16 + eor r13,r14 + eor r23,r18 + eor r12,r4 + eor r18,r13 + com r4 + st Z,r18 + std Z+8,r23 + std Z+24,r12 + std Z+32,r13 + ldd r23,Z+9 + ldd r12,Z+25 + ldd r13,Z+33 + eor r19,r13 + eor r5,r23 + eor r13,r12 + mov r14,r23 + mov r0,r19 + com r0 + and r14,r0 + mov r15,r5 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r5 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r19 + mov r0,r13 + com r0 + and r16,r0 + eor r19,r15 + eor r23,r24 + eor r5,r25 + eor r12,r16 + eor r13,r14 + eor r23,r19 + eor r12,r5 + eor r19,r13 + com r5 + std Z+1,r19 + std Z+9,r23 + std Z+25,r12 + std Z+33,r13 + ldd r23,Z+10 + ldd r12,Z+26 + ldd r13,Z+34 + eor r20,r13 + eor r6,r23 + eor r13,r12 + mov r14,r23 + mov r0,r20 + com r0 + and r14,r0 + mov r15,r6 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r6 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r20 + mov r0,r13 + com r0 + and r16,r0 + eor r20,r15 + eor r23,r24 + eor r6,r25 + eor r12,r16 + eor r13,r14 + eor r23,r20 + eor r12,r6 + eor r20,r13 + com r6 + std Z+2,r20 + std Z+10,r23 + std Z+26,r12 + std Z+34,r13 + ldd r23,Z+11 + ldd r12,Z+27 + ldd r13,Z+35 + eor r21,r13 + eor r7,r23 + eor r13,r12 + mov r14,r23 + mov r0,r21 + com r0 + and r14,r0 + mov r15,r7 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r7 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r21 + mov r0,r13 + com r0 + and r16,r0 + eor r21,r15 + eor r23,r24 + eor r7,r25 + eor r12,r16 + eor r13,r14 + eor r23,r21 + eor r12,r7 + eor r21,r13 + com r7 + std Z+3,r21 + std Z+11,r23 + std Z+27,r12 + std Z+35,r13 + ldd r23,Z+12 + ldd r12,Z+28 + ldd r13,Z+36 + eor r26,r13 + eor r8,r23 + eor r13,r12 + mov r14,r23 + mov r0,r26 + com r0 + and r14,r0 + mov r15,r8 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r8 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r26 + mov r0,r13 + com r0 + and r16,r0 + eor r26,r15 + eor r23,r24 + eor r8,r25 + eor r12,r16 + eor r13,r14 + eor r23,r26 + eor r12,r8 + eor r26,r13 + com r8 + std Z+4,r26 + std Z+12,r23 + std Z+28,r12 + std Z+36,r13 + ldd r23,Z+13 + ldd r12,Z+29 + ldd r13,Z+37 + eor r27,r13 + eor r9,r23 + eor r13,r12 + mov r14,r23 + mov r0,r27 + com r0 + and r14,r0 + mov r15,r9 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r9 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r27 + mov r0,r13 + com r0 + and r16,r0 + eor r27,r15 + eor r23,r24 + eor r9,r25 + eor r12,r16 + eor r13,r14 + eor r23,r27 + eor r12,r9 + eor r27,r13 + com r9 + std Z+5,r27 + std Z+13,r23 + std Z+29,r12 + std Z+37,r13 + ldd r23,Z+14 + ldd r12,Z+30 + ldd r13,Z+38 + eor r2,r13 + eor r10,r23 + eor r13,r12 + mov r14,r23 + mov r0,r2 + com r0 + and r14,r0 + mov r15,r10 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r10 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r2 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r15 + eor r23,r24 + eor r10,r25 + eor r12,r16 + eor r13,r14 + eor r23,r2 + eor r12,r10 + eor r2,r13 + com r10 + std Z+6,r2 + std Z+14,r23 + std Z+30,r12 + std Z+38,r13 + ldd r23,Z+15 + ldd r12,Z+31 + ldd r13,Z+39 + eor r3,r13 + eor r11,r23 + eor r13,r12 + mov r14,r23 + mov r0,r3 + com r0 + and r14,r0 + mov r15,r11 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r11 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r3 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r15 + eor r23,r24 + eor r11,r25 + eor r12,r16 + eor r13,r14 + eor r23,r3 + eor r12,r11 + eor r3,r13 + com r11 + std Z+7,r3 + std Z+15,r23 + std Z+31,r12 + std Z+39,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gascon128_core_round, .-gascon128_core_round + + .text +.global drysponge128_g + .type drysponge128_g, @function +drysponge128_g: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + subi r30,180 + sbci r31,255 + ld r19,Z + subi r30,76 + sbc r31,r1 + ldi r18,240 + std Z+40,r1 + std Z+41,r1 + std Z+42,r1 + std Z+43,r1 + std Z+44,r1 + std Z+45,r1 + std Z+46,r1 + std Z+47,r1 + std Z+48,r1 + std Z+49,r1 + std Z+50,r1 + std Z+51,r1 + std Z+52,r1 + std Z+53,r1 + std Z+54,r1 + std Z+55,r1 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 +38: + eor r4,r18 + ldd r12,Z+8 + ldd r13,Z+24 + ldd r14,Z+32 + eor r20,r14 + eor r4,r12 + eor r14,r13 + mov r15,r12 + mov r0,r20 + com r0 + and r15,r0 + mov r24,r4 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r4 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r20 + mov r0,r14 + com r0 + and r17,r0 + eor r20,r24 + eor r12,r25 + eor r4,r16 + eor r13,r17 + eor r14,r15 + eor r12,r20 + eor r13,r4 + eor r20,r14 + com r4 + st Z,r20 + std Z+8,r12 + std Z+24,r13 + std Z+32,r14 + ldd r12,Z+9 + ldd r13,Z+25 + ldd r14,Z+33 + eor r21,r14 + eor r5,r12 + eor r14,r13 + mov r15,r12 + mov r0,r21 + com r0 + and r15,r0 + mov r24,r5 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r5 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r21 + mov r0,r14 + com r0 + and r17,r0 + eor r21,r24 + eor r12,r25 + eor r5,r16 + eor r13,r17 + eor r14,r15 + eor r12,r21 + eor r13,r5 + eor r21,r14 + com r5 + std Z+1,r21 + std Z+9,r12 + std Z+25,r13 + std Z+33,r14 + ldd r12,Z+10 + ldd r13,Z+26 + ldd r14,Z+34 + eor r22,r14 + eor r6,r12 + eor r14,r13 + mov r15,r12 + mov r0,r22 + com r0 + and r15,r0 + mov r24,r6 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r6 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r22 + mov r0,r14 + com r0 + and r17,r0 + eor r22,r24 + eor r12,r25 + eor r6,r16 + eor r13,r17 + eor r14,r15 + eor r12,r22 + eor r13,r6 + eor r22,r14 + com r6 + std Z+2,r22 + std Z+10,r12 + std Z+26,r13 + std Z+34,r14 + ldd r12,Z+11 + ldd r13,Z+27 + ldd r14,Z+35 + eor r23,r14 + eor r7,r12 + eor r14,r13 + mov r15,r12 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r7 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r7 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r23 + mov r0,r14 + com r0 + and r17,r0 + eor r23,r24 + eor r12,r25 + eor r7,r16 + eor r13,r17 + eor r14,r15 + eor r12,r23 + eor r13,r7 + eor r23,r14 + com r7 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r14 + ldd r12,Z+12 + ldd r13,Z+28 + ldd r14,Z+36 + eor r26,r14 + eor r8,r12 + eor r14,r13 + mov r15,r12 + mov r0,r26 + com r0 + and r15,r0 + mov r24,r8 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r8 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r26 + mov r0,r14 + com r0 + and r17,r0 + eor r26,r24 + eor r12,r25 + eor r8,r16 + eor r13,r17 + eor r14,r15 + eor r12,r26 + eor r13,r8 + eor r26,r14 + com r8 + std Z+4,r26 + std Z+12,r12 + std Z+28,r13 + std Z+36,r14 + ldd r12,Z+13 + ldd r13,Z+29 + ldd r14,Z+37 + eor r27,r14 + eor r9,r12 + eor r14,r13 + mov r15,r12 + mov r0,r27 + com r0 + and r15,r0 + mov r24,r9 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r9 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r27 + mov r0,r14 + com r0 + and r17,r0 + eor r27,r24 + eor r12,r25 + eor r9,r16 + eor r13,r17 + eor r14,r15 + eor r12,r27 + eor r13,r9 + eor r27,r14 + com r9 + std Z+5,r27 + std Z+13,r12 + std Z+29,r13 + std Z+37,r14 + ldd r12,Z+14 + ldd r13,Z+30 + ldd r14,Z+38 + eor r2,r14 + eor r10,r12 + eor r14,r13 + mov r15,r12 + mov r0,r2 + com r0 + and r15,r0 + mov r24,r10 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r10 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r2 + mov r0,r14 + com r0 + and r17,r0 + eor r2,r24 + eor r12,r25 + eor r10,r16 + eor r13,r17 + eor r14,r15 + eor r12,r2 + eor r13,r10 + eor r2,r14 + com r10 + std Z+6,r2 + std Z+14,r12 + std Z+30,r13 + std Z+38,r14 + ldd r12,Z+15 + ldd r13,Z+31 + ldd r14,Z+39 + eor r3,r14 + eor r11,r12 + eor r14,r13 + mov r15,r12 + mov r0,r3 + com r0 + and r15,r0 + mov r24,r11 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r11 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r3 + mov r0,r14 + com r0 + and r17,r0 + eor r3,r24 + eor r12,r25 + eor r11,r16 + eor r13,r17 + eor r14,r15 + eor r12,r3 + eor r13,r11 + eor r3,r14 + com r11 + std Z+7,r3 + std Z+15,r12 + std Z+31,r13 + std Z+39,r14 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r20,Z+24 + ldd r21,Z+25 + ldd r22,Z+26 + ldd r23,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r20 + std Z+25,r21 + std Z+26,r22 + std Z+27,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r22,Z+34 + ldd r23,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r20 + std Z+33,r21 + std Z+34,r22 + std Z+35,r23 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + ldd r12,Z+40 + ldd r13,Z+41 + ldd r14,Z+42 + ldd r15,Z+43 + eor r12,r20 + eor r13,r21 + eor r14,r22 + eor r15,r23 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + std Z+40,r12 + std Z+41,r13 + std Z+42,r14 + std Z+43,r15 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + ldd r0,Z+24 + eor r12,r0 + ldd r0,Z+25 + eor r13,r0 + ldd r0,Z+26 + eor r14,r0 + ldd r0,Z+27 + eor r15,r0 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + ldd r12,Z+48 + ldd r13,Z+49 + ldd r14,Z+50 + ldd r15,Z+51 + ldd r0,Z+8 + eor r12,r0 + ldd r0,Z+9 + eor r13,r0 + ldd r0,Z+10 + eor r14,r0 + ldd r0,Z+11 + eor r15,r0 + ldd r0,Z+28 + eor r12,r0 + ldd r0,Z+29 + eor r13,r0 + ldd r0,Z+30 + eor r14,r0 + ldd r0,Z+31 + eor r15,r0 + std Z+48,r12 + std Z+49,r13 + std Z+50,r14 + std Z+51,r15 + ldd r12,Z+52 + ldd r13,Z+53 + ldd r14,Z+54 + ldd r15,Z+55 + ldd r0,Z+12 + eor r12,r0 + ldd r0,Z+13 + eor r13,r0 + ldd r0,Z+14 + eor r14,r0 + ldd r0,Z+15 + eor r15,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + std Z+52,r12 + std Z+53,r13 + std Z+54,r14 + std Z+55,r15 + subi r18,15 + dec r19 + breq 5904f + rjmp 38b +5904: + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size drysponge128_g, .-drysponge128_g + + .text +.global gascon256_core_round + .type gascon256_core_round, @function +gascon256_core_round: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 26 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r26,Z+ + ld r27,Z+ + ld r2,Z+ + ld r3,Z+ + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + eor r4,r22 + ld r22,Z + ldd r23,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r23,r22 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r22 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r18 + eor r12,r23 + eor r13,r4 + eor r15,r14 + eor r18,r24 + com r4 + std Y+1,r18 + st Z,r22 + std Z+8,r23 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r22,Z+1 + ldd r23,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r23,r22 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r22 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r19 + eor r12,r23 + eor r13,r5 + eor r15,r14 + eor r19,r24 + com r5 + std Y+2,r19 + std Z+1,r22 + std Z+9,r23 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r22,Z+2 + ldd r23,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r23,r22 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r22 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r20 + eor r12,r23 + eor r13,r6 + eor r15,r14 + eor r20,r24 + com r6 + std Y+3,r20 + std Z+2,r22 + std Z+10,r23 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r22,Z+3 + ldd r23,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r23,r22 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r22 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r21 + eor r12,r23 + eor r13,r7 + eor r15,r14 + eor r21,r24 + com r7 + std Y+4,r21 + std Z+3,r22 + std Z+11,r23 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r22,Z+4 + ldd r23,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r26,r24 + eor r23,r22 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r22 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r26 + eor r12,r23 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+5,r26 + std Z+4,r22 + std Z+12,r23 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r22,Z+5 + ldd r23,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r27,r24 + eor r23,r22 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r22 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r27 + eor r12,r23 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+6,r27 + std Z+5,r22 + std Z+13,r23 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r22,Z+6 + ldd r23,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r2,r24 + eor r23,r22 + eor r10,r12 + eor r14,r13 + eor r24,r15 + mov r17,r2 + mov r25,r22 + mov r0,r2 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r10 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r10 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r2 + eor r12,r23 + eor r13,r10 + eor r15,r14 + eor r2,r24 + com r10 + std Y+7,r2 + std Z+6,r22 + std Z+14,r23 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r22,Z+7 + ldd r23,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r3,r24 + eor r23,r22 + eor r11,r12 + eor r14,r13 + eor r24,r15 + mov r17,r3 + mov r25,r22 + mov r0,r3 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r11 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r11 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r3 + eor r12,r23 + eor r13,r11 + eor r15,r14 + eor r3,r24 + com r11 + std Y+8,r3 + std Z+7,r22 + std Z+15,r23 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + bst r22,0 + lsr r13 + ror r12 + ror r23 + ror r22 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r2 + std Z+23,r3 + movw r22,r4 + movw r12,r6 + movw r14,r8 + movw r24,r10 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r4 + eor r15,r5 + eor r24,r6 + eor r25,r7 + eor r22,r8 + eor r23,r9 + eor r12,r10 + eor r13,r11 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r14 + eor r5,r15 + eor r6,r24 + eor r7,r25 + eor r8,r22 + eor r9,r23 + eor r10,r12 + eor r11,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r12 + mov r12,r0 + mov r0,r23 + mov r23,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r26 + std Z+45,r27 + std Z+46,r2 + std Z+47,r3 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r26,Z+52 + ldd r27,Z+53 + ldd r2,Z+54 + ldd r3,Z+55 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r26 + std Z+53,r27 + std Z+54,r2 + std Z+55,r3 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r26,Z+60 + ldd r27,Z+61 + ldd r2,Z+62 + ldd r3,Z+63 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r26 + std Z+61,r27 + std Z+62,r2 + std Z+63,r3 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r2,Y+7 + ldd r3,Y+8 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+24,r4 + std Z+25,r5 + std Z+26,r6 + std Z+27,r7 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + st -Z,r3 + st -Z,r2 + st -Z,r27 + st -Z,r26 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + adiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gascon256_core_round, .-gascon256_core_round + + .text +.global drysponge256_g + .type drysponge256_g, @function +drysponge256_g: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 44 + subi r30,148 + sbci r31,255 + ld r19,Z + subi r30,108 + sbc r31,r1 + ldi r18,240 + std Y+25,r19 + std Y+26,r18 + std Y+9,r1 + std Y+10,r1 + std Y+11,r1 + std Y+12,r1 + std Y+13,r1 + std Y+14,r1 + std Y+15,r1 + std Y+16,r1 + std Y+17,r1 + std Y+18,r1 + std Y+19,r1 + std Y+20,r1 + std Y+21,r1 + std Y+22,r1 + std Y+23,r1 + std Y+24,r1 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r22,Z+ + ld r23,Z+ + ld r26,Z+ + ld r27,Z+ + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 +40: + ldd r24,Y+26 + eor r2,r24 + subi r24,15 + std Y+26,r24 + ld r10,Z + ldd r11,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r11,r10 + eor r2,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r10 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r2 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r2 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r18 + eor r12,r11 + eor r13,r2 + eor r15,r14 + eor r18,r24 + com r2 + std Y+1,r18 + st Z,r10 + std Z+8,r11 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r10,Z+1 + ldd r11,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r11,r10 + eor r3,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r10 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r3 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r3 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r19 + eor r12,r11 + eor r13,r3 + eor r15,r14 + eor r19,r24 + com r3 + std Y+2,r19 + std Z+1,r10 + std Z+9,r11 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r10,Z+2 + ldd r11,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r11,r10 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r10 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r20 + eor r12,r11 + eor r13,r4 + eor r15,r14 + eor r20,r24 + com r4 + std Y+3,r20 + std Z+2,r10 + std Z+10,r11 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r10,Z+3 + ldd r11,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r11,r10 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r10 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r21 + eor r12,r11 + eor r13,r5 + eor r15,r14 + eor r21,r24 + com r5 + std Y+4,r21 + std Z+3,r10 + std Z+11,r11 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r10,Z+4 + ldd r11,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r22,r24 + eor r11,r10 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r22 + mov r25,r10 + mov r0,r22 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r22 + eor r12,r11 + eor r13,r6 + eor r15,r14 + eor r22,r24 + com r6 + std Y+5,r22 + std Z+4,r10 + std Z+12,r11 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r10,Z+5 + ldd r11,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r23,r24 + eor r11,r10 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r23 + mov r25,r10 + mov r0,r23 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r23 + eor r12,r11 + eor r13,r7 + eor r15,r14 + eor r23,r24 + com r7 + std Y+6,r23 + std Z+5,r10 + std Z+13,r11 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r10,Z+6 + ldd r11,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r26,r24 + eor r11,r10 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r10 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r26 + eor r12,r11 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+7,r26 + std Z+6,r10 + std Z+14,r11 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r10,Z+7 + ldd r11,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r27,r24 + eor r11,r10 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r10 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r27 + eor r12,r11 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+8,r27 + std Z+7,r10 + std Z+15,r11 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + bst r10,0 + lsr r13 + ror r12 + ror r11 + ror r10 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r23 + mov r23,r26 + mov r26,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r22 + std Z+21,r23 + std Z+22,r26 + std Z+23,r27 + movw r10,r2 + movw r12,r4 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + mov r0,r2 + mov r2,r4 + mov r4,r0 + mov r0,r3 + mov r3,r5 + mov r5,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + or r5,r0 + mov r0,r6 + mov r6,r8 + mov r8,r0 + mov r0,r7 + mov r7,r9 + mov r9,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r6,r10 + eor r7,r11 + eor r8,r12 + eor r9,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r26,Z+38 + ldd r27,Z+39 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r12 + mov r12,r0 + mov r0,r11 + mov r11,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r22 + std Z+37,r23 + std Z+38,r26 + std Z+39,r27 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r22,Z+44 + ldd r23,Z+45 + ldd r26,Z+46 + ldd r27,Z+47 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r22 + std Z+45,r23 + std Z+46,r26 + std Z+47,r27 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r22,Z+52 + ldd r23,Z+53 + ldd r26,Z+54 + ldd r27,Z+55 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r22 + std Z+53,r23 + std Z+54,r26 + std Z+55,r27 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r22,Z+60 + ldd r23,Z+61 + ldd r26,Z+62 + ldd r27,Z+63 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r22 + std Z+61,r23 + std Z+62,r26 + std Z+63,r27 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + ldd r10,Y+9 + ldd r11,Y+10 + ldd r12,Y+11 + ldd r13,Y+12 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + ldd r0,Z+12 + eor r10,r0 + ldd r0,Z+13 + eor r11,r0 + ldd r0,Z+14 + eor r12,r0 + ldd r0,Z+15 + eor r13,r0 + ldd r0,Z+32 + eor r10,r0 + ldd r0,Z+33 + eor r11,r0 + ldd r0,Z+34 + eor r12,r0 + ldd r0,Z+35 + eor r13,r0 + ldd r0,Z+52 + eor r10,r0 + ldd r0,Z+53 + eor r11,r0 + ldd r0,Z+54 + eor r12,r0 + ldd r0,Z+55 + eor r13,r0 + std Y+9,r10 + std Y+10,r11 + std Y+11,r12 + std Y+12,r13 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + ldd r0,Z+16 + eor r10,r0 + ldd r0,Z+17 + eor r11,r0 + ldd r0,Z+18 + eor r12,r0 + ldd r0,Z+19 + eor r13,r0 + ldd r0,Z+36 + eor r10,r0 + ldd r0,Z+37 + eor r11,r0 + ldd r0,Z+38 + eor r12,r0 + ldd r0,Z+39 + eor r13,r0 + ldd r0,Z+40 + eor r10,r0 + ldd r0,Z+41 + eor r11,r0 + ldd r0,Z+42 + eor r12,r0 + ldd r0,Z+43 + eor r13,r0 + std Y+13,r10 + std Y+14,r11 + std Y+15,r12 + std Y+16,r13 + ldd r10,Y+17 + ldd r11,Y+18 + ldd r12,Y+19 + ldd r13,Y+20 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + ld r0,Z + eor r10,r0 + ldd r0,Z+1 + eor r11,r0 + ldd r0,Z+2 + eor r12,r0 + ldd r0,Z+3 + eor r13,r0 + ldd r0,Z+20 + eor r10,r0 + ldd r0,Z+21 + eor r11,r0 + ldd r0,Z+22 + eor r12,r0 + ldd r0,Z+23 + eor r13,r0 + ldd r0,Z+44 + eor r10,r0 + ldd r0,Z+45 + eor r11,r0 + ldd r0,Z+46 + eor r12,r0 + ldd r0,Z+47 + eor r13,r0 + std Y+17,r10 + std Y+18,r11 + std Y+19,r12 + std Y+20,r13 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + ldd r0,Z+4 + eor r10,r0 + ldd r0,Z+5 + eor r11,r0 + ldd r0,Z+6 + eor r12,r0 + ldd r0,Z+7 + eor r13,r0 + ldd r0,Z+8 + eor r10,r0 + ldd r0,Z+9 + eor r11,r0 + ldd r0,Z+10 + eor r12,r0 + ldd r0,Z+11 + eor r13,r0 + ldd r0,Z+48 + eor r10,r0 + ldd r0,Z+49 + eor r11,r0 + ldd r0,Z+50 + eor r12,r0 + ldd r0,Z+51 + eor r13,r0 + std Y+21,r10 + std Y+22,r11 + std Y+23,r12 + std Y+24,r13 + ldd r10,Y+25 + dec r10 + std Y+25,r10 + breq 6623f + rjmp 40b +6623: + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + st -Z,r27 + st -Z,r26 + st -Z,r23 + st -Z,r22 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + ldi r25,72 + add r30,r25 + adc r31,r1 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + ldd r2,Y+17 + ldd r3,Y+18 + ldd r4,Y+19 + ldd r5,Y+20 + ldd r6,Y+21 + ldd r7,Y+22 + ldd r8,Y+23 + ldd r9,Y+24 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + adiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size drysponge256_g, .-drysponge256_g + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.c b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.c new file mode 100644 index 0000000..6dfe48c --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.c @@ -0,0 +1,611 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-drysponge.h" +#include + +#if !defined(__AVR__) + +/* Right rotations in bit-interleaved format */ +#define intRightRotateEven(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, (bits)); \ + _x1 = rightRotate(_x1, (bits)); \ + _x0 | (((uint64_t)_x1) << 32); \ + })) +#define intRightRotateOdd(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, ((bits) + 1) % 32); \ + _x1 = rightRotate(_x1, (bits)); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate1_64(x) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate1(_x0); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate2_64(x) (intRightRotateEven((x), 1)) +#define intRightRotate3_64(x) (intRightRotateOdd((x), 1)) +#define intRightRotate4_64(x) (intRightRotateEven((x), 2)) +#define intRightRotate5_64(x) (intRightRotateOdd((x), 2)) +#define intRightRotate6_64(x) (intRightRotateEven((x), 3)) +#define intRightRotate7_64(x) (intRightRotateOdd((x), 3)) +#define intRightRotate8_64(x) (intRightRotateEven((x), 4)) +#define intRightRotate9_64(x) (intRightRotateOdd((x), 4)) +#define intRightRotate10_64(x) (intRightRotateEven((x), 5)) +#define intRightRotate11_64(x) (intRightRotateOdd((x), 5)) +#define intRightRotate12_64(x) (intRightRotateEven((x), 6)) +#define intRightRotate13_64(x) (intRightRotateOdd((x), 6)) +#define intRightRotate14_64(x) (intRightRotateEven((x), 7)) +#define intRightRotate15_64(x) (intRightRotateOdd((x), 7)) +#define intRightRotate16_64(x) (intRightRotateEven((x), 8)) +#define intRightRotate17_64(x) (intRightRotateOdd((x), 8)) +#define intRightRotate18_64(x) (intRightRotateEven((x), 9)) +#define intRightRotate19_64(x) (intRightRotateOdd((x), 9)) +#define intRightRotate20_64(x) (intRightRotateEven((x), 10)) +#define intRightRotate21_64(x) (intRightRotateOdd((x), 10)) +#define intRightRotate22_64(x) (intRightRotateEven((x), 11)) +#define intRightRotate23_64(x) (intRightRotateOdd((x), 11)) +#define intRightRotate24_64(x) (intRightRotateEven((x), 12)) +#define intRightRotate25_64(x) (intRightRotateOdd((x), 12)) +#define intRightRotate26_64(x) (intRightRotateEven((x), 13)) +#define intRightRotate27_64(x) (intRightRotateOdd((x), 13)) +#define intRightRotate28_64(x) (intRightRotateEven((x), 14)) +#define intRightRotate29_64(x) (intRightRotateOdd((x), 14)) +#define intRightRotate30_64(x) (intRightRotateEven((x), 15)) +#define intRightRotate31_64(x) (intRightRotateOdd((x), 15)) +#define intRightRotate32_64(x) (intRightRotateEven((x), 16)) +#define intRightRotate33_64(x) (intRightRotateOdd((x), 16)) +#define intRightRotate34_64(x) (intRightRotateEven((x), 17)) +#define intRightRotate35_64(x) (intRightRotateOdd((x), 17)) +#define intRightRotate36_64(x) (intRightRotateEven((x), 18)) +#define intRightRotate37_64(x) (intRightRotateOdd((x), 18)) +#define intRightRotate38_64(x) (intRightRotateEven((x), 19)) +#define intRightRotate39_64(x) (intRightRotateOdd((x), 19)) +#define intRightRotate40_64(x) (intRightRotateEven((x), 20)) +#define intRightRotate41_64(x) (intRightRotateOdd((x), 20)) +#define intRightRotate42_64(x) (intRightRotateEven((x), 21)) +#define intRightRotate43_64(x) (intRightRotateOdd((x), 21)) +#define intRightRotate44_64(x) (intRightRotateEven((x), 22)) +#define intRightRotate45_64(x) (intRightRotateOdd((x), 22)) +#define intRightRotate46_64(x) (intRightRotateEven((x), 23)) +#define intRightRotate47_64(x) (intRightRotateOdd((x), 23)) +#define intRightRotate48_64(x) (intRightRotateEven((x), 24)) +#define intRightRotate49_64(x) (intRightRotateOdd((x), 24)) +#define intRightRotate50_64(x) (intRightRotateEven((x), 25)) +#define intRightRotate51_64(x) (intRightRotateOdd((x), 25)) +#define intRightRotate52_64(x) (intRightRotateEven((x), 26)) +#define intRightRotate53_64(x) (intRightRotateOdd((x), 26)) +#define intRightRotate54_64(x) (intRightRotateEven((x), 27)) +#define intRightRotate55_64(x) (intRightRotateOdd((x), 27)) +#define intRightRotate56_64(x) (intRightRotateEven((x), 28)) +#define intRightRotate57_64(x) (intRightRotateOdd((x), 28)) +#define intRightRotate58_64(x) (intRightRotateEven((x), 29)) +#define intRightRotate59_64(x) (intRightRotateOdd((x), 29)) +#define intRightRotate60_64(x) (intRightRotateEven((x), 30)) +#define intRightRotate61_64(x) (intRightRotateOdd((x), 30)) +#define intRightRotate62_64(x) (intRightRotateEven((x), 31)) +#define intRightRotate63_64(x) (intRightRotateOdd((x), 31)) + +void gascon128_core_round(gascon128_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); +#endif + + /* Add the round constant to the middle of the state */ + x2 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x4; x2 ^= x1; x4 ^= x3; t0 = (~x0) & x1; t1 = (~x1) & x2; + t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x0; x0 ^= t1; + x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; x1 ^= x0; x3 ^= x2; + x0 ^= x4; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); +#endif +} + +void gascon256_core_round(gascon256_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; + uint64_t x8 = state->S[8]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); + uint64_t x8 = le_load_word64(state->B + 64); +#endif + + /* Add the round constant to the middle of the state */ + x4 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x8; x2 ^= x1; x4 ^= x3; x6 ^= x5; x8 ^= x7; t0 = (~x0) & x1; + t1 = (~x1) & x2; t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x5; + t5 = (~x5) & x6; t6 = (~x6) & x7; t7 = (~x7) & x8; t8 = (~x8) & x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t5; x5 ^= t6; x6 ^= t7; + x7 ^= t8; x8 ^= t0; x1 ^= x0; x3 ^= x2; x5 ^= x4; x7 ^= x6; x0 ^= x8; + x4 = ~x4; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + x5 ^= intRightRotate31_64(x5) ^ intRightRotate26_64(x5); + x6 ^= intRightRotate53_64(x6) ^ intRightRotate58_64(x6); + x7 ^= intRightRotate9_64(x7) ^ intRightRotate46_64(x7); + x8 ^= intRightRotate43_64(x8) ^ intRightRotate50_64(x8); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; + state->S[8] = x8; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); + le_store_word64(state->B + 64, x8); +#endif +} + +void drysponge128_g(drysponge128_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes */ + gascon128_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon128_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4]; + } +} + +void drysponge256_g(drysponge256_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes. + * And so on for a total of 64 bytes XOR'ed into the output data. */ + gascon256_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon256_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + } +} + +#endif /* !__AVR__ */ + +void drysponge128_g_core(drysponge128_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon128_core_round(&(state->c), round); +} + +void drysponge256_g_core(drysponge256_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon256_core_round(&(state->c), round); +} + +/** + * \fn uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) + * \brief Selects an element of x in constant time. + * + * \param x Points to the four elements of x. + * \param index Index of which element to extract between 0 and 3. + * + * \return The selected element of x. + */ +#if !defined(__AVR__) +STATIC_INLINE uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) +{ + /* We need to be careful how we select each element of x because + * we are doing a data-dependent fetch here. Do the fetch in a way + * that should avoid cache timing issues by fetching every element + * of x and masking away the ones we don't want. + * + * There is a possible side channel here with respect to power analysis. + * The "mask" value will be all-ones for the selected index and all-zeroes + * for the other indexes. This may show up as different power consumption + * for the "result ^= x[i] & mask" statement when i is the selected index. + * Such a side channel could in theory allow reading the plaintext input + * to the cipher by analysing the CPU's power consumption. + * + * The DryGASCON specification acknowledges the possibility of plaintext + * recovery in section 7.4. For software mitigation the specification + * suggests randomization of the indexes into c and x and randomization + * of the order of processing words. We aren't doing that here yet. + * Patches welcome to fix this. + */ + uint32_t mask = -((uint32_t)((0x04 - index) >> 2)); + uint32_t result = x[0] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x01)) >> 2)); + result ^= x[1] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x02)) >> 2)); + result ^= x[2] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x03)) >> 2)); + return result ^ (x[3] & mask); +} +#else +/* AVR is more or less immune to cache timing issues because it doesn't + * have anything like an L1 or L2 cache. Select the word directly */ +#define drysponge_select_x(x, index) ((x)[(index)]) +#endif + +/** + * \brief Mixes a 32-bit value into the DrySPONGE128 state. + * + * \param state DrySPONGE128 state. + * \param data The data to be mixed in the bottom 10 bits. + */ +static void drysponge128_mix_phase_round + (drysponge128_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); +} + +/** + * \brief Mixes a 32-bit value into the DrySPONGE256 state. + * + * \param state DrySPONGE256 state. + * \param data The data to be mixed in the bottom 18 bits. + */ +static void drysponge256_mix_phase_round + (drysponge256_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); + state->c.W[10] ^= drysponge_select_x(state->x.W, (data >> 10) & 0x03); + state->c.W[12] ^= drysponge_select_x(state->x.W, (data >> 12) & 0x03); + state->c.W[14] ^= drysponge_select_x(state->x.W, (data >> 14) & 0x03); + state->c.W[16] ^= drysponge_select_x(state->x.W, (data >> 16) & 0x03); +} + +/** + * \brief Mixes an input block into a DrySPONGE128 state. + * + * \param state The DrySPONGE128 state. + * \param data Full rate block containing the input data. + */ +static void drysponge128_mix_phase + (drysponge128_state_t *state, const unsigned char data[DRYSPONGE128_RATE]) +{ + /* Mix 10-bit groups into the output, with the domain + * separator added to the last two groups */ + drysponge128_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[1] >> 2) | (((uint32_t)(data[2])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[2] >> 4) | (((uint32_t)(data[3])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[3] >> 6) | (((uint32_t)(data[4])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[5] | (((uint32_t)(data[6])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[6] >> 2) | (((uint32_t)(data[7])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[7] >> 4) | (((uint32_t)(data[8])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[8] >> 6) | (((uint32_t)(data[9])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[10] | (((uint32_t)(data[11])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[12] >> 4) | (((uint32_t)(data[13])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, ((data[13] >> 6) | (((uint32_t)(data[14])) << 2))); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, data[15] ^ state->domain); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, state->domain >> 10); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +/** + * \brief Mixes an input block into a DrySPONGE256 state. + * + * \param state The DrySPONGE256 state. + * \param data Full rate block containing the input data. + */ +static void drysponge256_mix_phase + (drysponge256_state_t *state, const unsigned char data[DRYSPONGE256_RATE]) +{ + /* Mix 18-bit groups into the output, with the domain in the last group */ + drysponge256_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[2] >> 2) | (((uint32_t)(data[3])) << 6) | + (((uint32_t)(data[4])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[4] >> 4) | (((uint32_t)(data[5])) << 4) | + (((uint32_t)(data[6])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[6] >> 6) | (((uint32_t)(data[7])) << 2) | + (((uint32_t)(data[8])) << 10)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, data[9] | (((uint32_t)(data[10])) << 8) | + (((uint32_t)(data[11])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6) | + (((uint32_t)(data[13])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[13] >> 4) | (((uint32_t)(data[14])) << 4) | + (((uint32_t)(data[15])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[15] >> 6) ^ state->domain); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE128_RATE) { + drysponge128_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE128_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE128_RATE - len - 1); + drysponge128_mix_phase(state, padded); + } +} + +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE256_RATE) { + drysponge256_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE256_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE256_RATE - len - 1); + drysponge256_mix_phase(state, padded); + } +} + +/** + * \brief Determine if some of the words of an "x" value are identical. + * + * \param x Points to the "x" buffer to check. + * + * \return Non-zero if some of the words are the same, zero if they are + * distinct from each other. + * + * We try to perform the check in constant time to avoid giving away + * any information about the value of the key. + */ +static int drysponge_x_words_are_same(const uint32_t x[4]) +{ + unsigned i, j; + int result = 0; + for (i = 0; i < 3; ++i) { + for (j = i + 1; j < 4; ++j) { + uint32_t check = x[i] ^ x[j]; + result |= (int)((0x100000000ULL - check) >> 32); + } + } + return result; +} + +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-128 state with repeated copies of the key */ + memcpy(state->c.B, key, 16); + memcpy(state->c.B + 16, key, 16); + memcpy(state->c.B + 32, key, 8); + + /* Generate the "x" value for the state. All four words of "x" + * must be unique because they will be used in drysponge_select_x() + * as stand-ins for the bit pairs 00, 01, 10, and 11. + * + * Run the core block operation over and over until "x" is unique. + * Technically the runtime here is key-dependent and not constant. + * If the input key is randomized, this should only take 1 round + * on average so it is "almost constant time". + */ + do { + gascon128_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE128_INIT_ROUNDS; + state->domain = DRYDOMAIN128_NONCE; + if (final_block) + state->domain |= DRYDOMAIN128_FINAL; + drysponge128_f_absorb(state, nonce, 16); + drysponge128_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE128_ROUNDS; +} + +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-256 state with repeated copies of the key */ + memcpy(state->c.B, key, 32); + memcpy(state->c.B + 32, key, 32); + memcpy(state->c.B + 64, key, 8); + + /* Generate the "x" value for the state */ + do { + gascon256_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE256_INIT_ROUNDS; + state->domain = DRYDOMAIN256_NONCE; + if (final_block) + state->domain |= DRYDOMAIN256_FINAL; + drysponge256_f_absorb(state, nonce, 16); + drysponge256_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE256_ROUNDS; +} diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.h b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.h new file mode 100644 index 0000000..05b0c16 --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-drysponge.h @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_DRYSPONGE_H +#define LW_INTERNAL_DRYSPONGE_H + +#include "internal-util.h" + +/** + * \file internal-drysponge.h + * \brief Internal implementation of DrySPONGE for the DryGASCON cipher. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the GASCON-128 permutation state in bytes. + */ +#define GASCON128_STATE_SIZE 40 + +/** + * \brief Size of the GASCON-256 permutation state in bytes. + */ +#define GASCON256_STATE_SIZE 72 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE128. + */ +#define DRYSPONGE128_RATE 16 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE256. + */ +#define DRYSPONGE256_RATE 16 + +/** + * \brief Size of the "x" value for DrySPONGE128. + */ +#define DRYSPONGE128_XSIZE 16 + +/** + * \brief Size of the "x" value for DrySPONGE256. + */ +#define DRYSPONGE256_XSIZE 16 + +/** + * \brief Normal number of rounds for DrySPONGE128 when absorbing + * and squeezing data. + */ +#define DRYSPONGE128_ROUNDS 7 + +/** + * \brief Number of rounds for DrySPONGE128 during initialization. + */ +#define DRYSPONGE128_INIT_ROUNDS 11 + +/** + * \brief Normal number of rounds for DrySPONGE256 when absorbing + * and squeezing data. + */ +#define DRYSPONGE256_ROUNDS 8 + +/** + * \brief Number of rounds for DrySPONGE256 during initialization. + */ +#define DRYSPONGE256_INIT_ROUNDS 12 + +/** + * \brief DrySPONGE128 domain bit for a padded block. + */ +#define DRYDOMAIN128_PADDED (1 << 8) + +/** + * \brief DrySPONGE128 domain bit for a final block. + */ +#define DRYDOMAIN128_FINAL (1 << 9) + +/** + * \brief DrySPONGE128 domain value for processing the nonce. + */ +#define DRYDOMAIN128_NONCE (1 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the associated data. + */ +#define DRYDOMAIN128_ASSOC_DATA (2 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the message. + */ +#define DRYDOMAIN128_MESSAGE (3 << 10) + +/** + * \brief DrySPONGE256 domain bit for a padded block. + */ +#define DRYDOMAIN256_PADDED (1 << 2) + +/** + * \brief DrySPONGE256 domain bit for a final block. + */ +#define DRYDOMAIN256_FINAL (1 << 3) + +/** + * \brief DrySPONGE256 domain value for processing the nonce. + */ +#define DRYDOMAIN256_NONCE (1 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the associated data. + */ +#define DRYDOMAIN256_ASSOC_DATA (2 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the message. + */ +#define DRYDOMAIN256_MESSAGE (3 << 4) + +/** + * \brief Internal state of the GASCON-128 permutation. + */ +typedef union +{ + uint64_t S[GASCON128_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON128_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON128_STATE_SIZE]; /**< Bytes of the state */ + +} gascon128_state_t; + +/** + * \brief Internal state of the GASCON-256 permutation. + */ +typedef union +{ + uint64_t S[GASCON256_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON256_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON256_STATE_SIZE]; /**< Bytes of the state */ + +} gascon256_state_t; + +/** + * \brief Structure of a rate block for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_RATE]; /**< Bytes of the rate */ + +} drysponge128_rate_t; + +/** + * \brief Structure of a rate block for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_RATE]; /**< Bytes of the rate */ + +} drysponge256_rate_t; + +/** + * \brief Structure of the "x" value for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_XSIZE]; /**< Bytes of the rate */ + +} drysponge128_x_t; + +/** + * \brief Structure of the "x" value for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_XSIZE]; /**< Bytes of the rate */ + +} drysponge256_x_t; + +/** + * \brief Structure of the rolling DrySPONGE128 state. + */ +typedef struct +{ + gascon128_state_t c; /**< GASCON-128 state for the capacity */ + drysponge128_rate_t r; /**< Buffer for a rate block of data */ + drysponge128_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge128_state_t; + +/** + * \brief Structure of the rolling DrySPONGE256 state. + */ +typedef struct +{ + gascon256_state_t c; /**< GASCON-256 state for the capacity */ + drysponge256_rate_t r; /**< Buffer for a rate block of data */ + drysponge256_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge256_state_t; + +/** + * \brief Permutes the GASCON-128 state using one iteration of CoreRound. + * + * \param state The GASCON-128 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon128_core_round(gascon128_state_t *state, uint8_t round); + +/** + * \brief Permutes the GASCON-256 state using one iteration of CoreRound. + * + * \param state The GASCON-256 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon256_core_round(gascon256_state_t *state, uint8_t round); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds and squeezes data out of the GASGON-128 state. + * + * \param state The DrySPONGE128 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge128_g(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds and squeezes data out of the GASGON-256 state. + * + * \param state The DrySPONGE256 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge256_g(drysponge256_state_t *state); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE128 state. + */ +void drysponge128_g_core(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE256 state. + */ +void drysponge256_g_core(drysponge256_state_t *state); + +/** + * \brief Performs the absorption phase of the DrySPONGE128 F function. + * + * \param state The DrySPONGE128 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE128_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge128_g() or + * drysponge128_g_core() to perform the full F operation. + */ +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Performs the absorption phase of the DrySPONGE256 F function. + * + * \param state The DrySPONGE256 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE256_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge256_g() or + * drysponge256_g_core() to perform the full F operation. + */ +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Set up a DrySPONGE128 state to begin encryption or decryption. + * + * \param state The DrySPONGE128 state. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +/** + * \brief Set up a DrySPONGE256 state to begin encryption or decryption. + * + * \param state The DrySPONGE256 state. + * \param key Points to the 32 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-util.h b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/drygascon/Implementations/crypto_aead/drygascon256/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.c b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.h b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/api.h b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.c b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.c new file mode 100644 index 0000000..e963903 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.c @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "drygascon.h" +#include "internal-drysponge.h" +#include + +aead_cipher_t const drygascon128_cipher = { + "DryGASCON128", + DRYGASCON128_KEY_SIZE, + DRYGASCON128_NONCE_SIZE, + DRYGASCON128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_aead_encrypt, + drygascon128_aead_decrypt +}; + +aead_cipher_t const drygascon256_cipher = { + "DryGASCON256", + DRYGASCON256_KEY_SIZE, + DRYGASCON256_NONCE_SIZE, + DRYGASCON256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_aead_encrypt, + drygascon256_aead_decrypt +}; + +aead_hash_algorithm_t const drygascon128_hash_algorithm = { + "DryGASCON128-HASH", + sizeof(int), + DRYGASCON128_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const drygascon256_hash_algorithm = { + "DryGASCON256-HASH", + sizeof(int), + DRYGASCON256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Processes associated data for DryGASCON128. + * + * \param state DrySPONGE128 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon128_process_ad + (drysponge128_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(state, ad, DRYSPONGE128_RATE); + drysponge128_g_core(state); + ad += DRYSPONGE128_RATE; + adlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN128_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN128_FINAL; + if (adlen < DRYSPONGE128_RATE) + state->domain |= DRYDOMAIN128_PADDED; + drysponge128_f_absorb(state, ad, (unsigned)adlen); + drysponge128_g(state); +} + +/** + * \brief Processes associated data for DryGASCON256. + * + * \param state DrySPONGE256 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon256_process_ad + (drysponge256_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(state, ad, DRYSPONGE256_RATE); + drysponge256_g_core(state); + ad += DRYSPONGE256_RATE; + adlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN256_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN256_FINAL; + if (adlen < DRYSPONGE256_RATE) + state->domain |= DRYDOMAIN256_PADDED; + drysponge256_f_absorb(state, ad, (unsigned)adlen); + drysponge256_g(state); +} + +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge128_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + mlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (mlen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)mlen; + drysponge128_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge128_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, DRYGASCON128_TAG_SIZE); + return 0; +} + +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON128_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON128_TAG_SIZE; + drysponge128_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE128_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE128_RATE); + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + clen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (clen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge128_f_absorb(&state, m, temp); + drysponge128_g(&state); + c += temp; + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state.r.B, c, DRYGASCON128_TAG_SIZE); +} + +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge256_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + mlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (mlen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)mlen; + drysponge256_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge256_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, 16); + drysponge256_g(&state); + memcpy(c + 16, state.r.B, 16); + return 0; +} + +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned char *mtemp = m; + unsigned temp; + int result; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON256_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON256_TAG_SIZE; + drysponge256_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE256_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE256_RATE); + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + clen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (clen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge256_f_absorb(&state, m, temp); + drysponge256_g(&state); + c += temp; + } + + /* Check the authentication tag which is split into two pieces */ + result = aead_check_tag(0, 0, state.r.B, c, 16); + drysponge256_g(&state); + return aead_check_tag_precheck + (mtemp, *mlen, state.r.B, c + 16, 16, ~result); +} + +/** + * \brief Precomputed initialization vector for DryGASCON128-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE128. + */ +static unsigned char const drygascon128_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89 +}; + +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge128_state_t state; + memcpy(state.c.B, drygascon128_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon128_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE128_ROUNDS; + drygascon128_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge128_g(&state); + memcpy(out + 16, state.r.B, 16); + return 0; +} + +/** + * \brief Precomputed initialization vector for DryGASCON256-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE256. + */ +static unsigned char const drygascon256_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0x45, 0x28, 0x21, 0xe6, 0x38, 0xd0, 0x13, 0x77, + 0xbe, 0x54, 0x66, 0xcf, 0x34, 0xe9, 0x0c, 0x6c +}; + +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge256_state_t state; + memcpy(state.c.B, drygascon256_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon256_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE256_ROUNDS; + drygascon256_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 16, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 32, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 48, state.r.B, 16); + return 0; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.h b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.h new file mode 100644 index 0000000..12e18c3 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/drygascon.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_DRYGASCON_H +#define LWCRYPTO_DRYGASCON_H + +#include "aead-common.h" + +/** + * \file drygascon.h + * \brief DryGASCON authenticated encryption algorithm. + * + * DryGASCON is a family of authenticated encryption algorithms based + * around a generalised version of the ASCON permutation. DryGASCON + * is designed to provide some protection against power analysis. + * + * There are four algorithms in the DryGASCON family: + * + * \li DryGASCON128 is an authenticated encryption algorithm with a + * 128-bit key, a 128-bit nonce, and a 128-bit authentication tag. + * \li DryGASCON256 is an authenticated encryption algorithm with a + * 256-bit key, a 128-bit nonce, and a 128-256 authentication tag. + * \li DryGASCON128-HASH is a hash algorithm with a 256-bit output. + * \li DryGASCON256-HASH is a hash algorithm with a 512-bit output. + * + * DryGASCON128 and DryGASCON128-HASH are the primary members of the family. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for DryGASCON128. + */ +#define DRYGASCON128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for DryGASCON128. + */ +#define DRYGASCON128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for DryGASCON128. + */ +#define DRYGASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON128-HASH. + */ +#define DRYGASCON128_HASH_SIZE 32 + +/** + * \brief Size of the key for DryGASCON256. + */ +#define DRYGASCON256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for DryGASCON256. + */ +#define DRYGASCON256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for DryGASCON256. + */ +#define DRYGASCON256_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON256-HASH. + */ +#define DRYGASCON256_HASH_SIZE 64 + +/** + * \brief Meta-information block for the DryGASCON128 cipher. + */ +extern aead_cipher_t const drygascon128_cipher; + +/** + * \brief Meta-information block for the DryGASCON256 cipher. + */ +extern aead_cipher_t const drygascon256_cipher; + +/** + * \brief Meta-information block for DryGASCON128-HASH. + */ +extern aead_hash_algorithm_t const drygascon128_hash_algorithm; + +/** + * \brief Meta-information block for DryGASCON256-HASH. + */ +extern aead_hash_algorithm_t const drygascon256_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with DryGASCON128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon128_aead_decrypt() + */ +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon128_aead_encrypt() + */ +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with DryGASCON256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon256_aead_decrypt() + */ +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon256_aead_encrypt() + */ +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with DRYGASCON128. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON128_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with DRYGASCON256. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/hash.c b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/hash.c new file mode 100644 index 0000000..34464d6 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "drygascon.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return drygascon128_hash(out, in, inlen); +} diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge-avr.S b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge-avr.S new file mode 100644 index 0000000..84d0ff8 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge-avr.S @@ -0,0 +1,5092 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gascon128_core_round + .type gascon128_core_round, @function +gascon128_core_round: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + eor r4,r22 + ldd r23,Z+8 + ldd r12,Z+24 + ldd r13,Z+32 + eor r18,r13 + eor r4,r23 + eor r13,r12 + mov r14,r23 + mov r0,r18 + com r0 + and r14,r0 + mov r15,r4 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r4 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r18 + mov r0,r13 + com r0 + and r16,r0 + eor r18,r15 + eor r23,r24 + eor r4,r25 + eor r12,r16 + eor r13,r14 + eor r23,r18 + eor r12,r4 + eor r18,r13 + com r4 + st Z,r18 + std Z+8,r23 + std Z+24,r12 + std Z+32,r13 + ldd r23,Z+9 + ldd r12,Z+25 + ldd r13,Z+33 + eor r19,r13 + eor r5,r23 + eor r13,r12 + mov r14,r23 + mov r0,r19 + com r0 + and r14,r0 + mov r15,r5 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r5 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r19 + mov r0,r13 + com r0 + and r16,r0 + eor r19,r15 + eor r23,r24 + eor r5,r25 + eor r12,r16 + eor r13,r14 + eor r23,r19 + eor r12,r5 + eor r19,r13 + com r5 + std Z+1,r19 + std Z+9,r23 + std Z+25,r12 + std Z+33,r13 + ldd r23,Z+10 + ldd r12,Z+26 + ldd r13,Z+34 + eor r20,r13 + eor r6,r23 + eor r13,r12 + mov r14,r23 + mov r0,r20 + com r0 + and r14,r0 + mov r15,r6 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r6 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r20 + mov r0,r13 + com r0 + and r16,r0 + eor r20,r15 + eor r23,r24 + eor r6,r25 + eor r12,r16 + eor r13,r14 + eor r23,r20 + eor r12,r6 + eor r20,r13 + com r6 + std Z+2,r20 + std Z+10,r23 + std Z+26,r12 + std Z+34,r13 + ldd r23,Z+11 + ldd r12,Z+27 + ldd r13,Z+35 + eor r21,r13 + eor r7,r23 + eor r13,r12 + mov r14,r23 + mov r0,r21 + com r0 + and r14,r0 + mov r15,r7 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r7 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r21 + mov r0,r13 + com r0 + and r16,r0 + eor r21,r15 + eor r23,r24 + eor r7,r25 + eor r12,r16 + eor r13,r14 + eor r23,r21 + eor r12,r7 + eor r21,r13 + com r7 + std Z+3,r21 + std Z+11,r23 + std Z+27,r12 + std Z+35,r13 + ldd r23,Z+12 + ldd r12,Z+28 + ldd r13,Z+36 + eor r26,r13 + eor r8,r23 + eor r13,r12 + mov r14,r23 + mov r0,r26 + com r0 + and r14,r0 + mov r15,r8 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r8 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r26 + mov r0,r13 + com r0 + and r16,r0 + eor r26,r15 + eor r23,r24 + eor r8,r25 + eor r12,r16 + eor r13,r14 + eor r23,r26 + eor r12,r8 + eor r26,r13 + com r8 + std Z+4,r26 + std Z+12,r23 + std Z+28,r12 + std Z+36,r13 + ldd r23,Z+13 + ldd r12,Z+29 + ldd r13,Z+37 + eor r27,r13 + eor r9,r23 + eor r13,r12 + mov r14,r23 + mov r0,r27 + com r0 + and r14,r0 + mov r15,r9 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r9 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r27 + mov r0,r13 + com r0 + and r16,r0 + eor r27,r15 + eor r23,r24 + eor r9,r25 + eor r12,r16 + eor r13,r14 + eor r23,r27 + eor r12,r9 + eor r27,r13 + com r9 + std Z+5,r27 + std Z+13,r23 + std Z+29,r12 + std Z+37,r13 + ldd r23,Z+14 + ldd r12,Z+30 + ldd r13,Z+38 + eor r2,r13 + eor r10,r23 + eor r13,r12 + mov r14,r23 + mov r0,r2 + com r0 + and r14,r0 + mov r15,r10 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r10 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r2 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r15 + eor r23,r24 + eor r10,r25 + eor r12,r16 + eor r13,r14 + eor r23,r2 + eor r12,r10 + eor r2,r13 + com r10 + std Z+6,r2 + std Z+14,r23 + std Z+30,r12 + std Z+38,r13 + ldd r23,Z+15 + ldd r12,Z+31 + ldd r13,Z+39 + eor r3,r13 + eor r11,r23 + eor r13,r12 + mov r14,r23 + mov r0,r3 + com r0 + and r14,r0 + mov r15,r11 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r11 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r3 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r15 + eor r23,r24 + eor r11,r25 + eor r12,r16 + eor r13,r14 + eor r23,r3 + eor r12,r11 + eor r3,r13 + com r11 + std Z+7,r3 + std Z+15,r23 + std Z+31,r12 + std Z+39,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gascon128_core_round, .-gascon128_core_round + + .text +.global drysponge128_g + .type drysponge128_g, @function +drysponge128_g: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + subi r30,180 + sbci r31,255 + ld r19,Z + subi r30,76 + sbc r31,r1 + ldi r18,240 + std Z+40,r1 + std Z+41,r1 + std Z+42,r1 + std Z+43,r1 + std Z+44,r1 + std Z+45,r1 + std Z+46,r1 + std Z+47,r1 + std Z+48,r1 + std Z+49,r1 + std Z+50,r1 + std Z+51,r1 + std Z+52,r1 + std Z+53,r1 + std Z+54,r1 + std Z+55,r1 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 +38: + eor r4,r18 + ldd r12,Z+8 + ldd r13,Z+24 + ldd r14,Z+32 + eor r20,r14 + eor r4,r12 + eor r14,r13 + mov r15,r12 + mov r0,r20 + com r0 + and r15,r0 + mov r24,r4 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r4 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r20 + mov r0,r14 + com r0 + and r17,r0 + eor r20,r24 + eor r12,r25 + eor r4,r16 + eor r13,r17 + eor r14,r15 + eor r12,r20 + eor r13,r4 + eor r20,r14 + com r4 + st Z,r20 + std Z+8,r12 + std Z+24,r13 + std Z+32,r14 + ldd r12,Z+9 + ldd r13,Z+25 + ldd r14,Z+33 + eor r21,r14 + eor r5,r12 + eor r14,r13 + mov r15,r12 + mov r0,r21 + com r0 + and r15,r0 + mov r24,r5 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r5 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r21 + mov r0,r14 + com r0 + and r17,r0 + eor r21,r24 + eor r12,r25 + eor r5,r16 + eor r13,r17 + eor r14,r15 + eor r12,r21 + eor r13,r5 + eor r21,r14 + com r5 + std Z+1,r21 + std Z+9,r12 + std Z+25,r13 + std Z+33,r14 + ldd r12,Z+10 + ldd r13,Z+26 + ldd r14,Z+34 + eor r22,r14 + eor r6,r12 + eor r14,r13 + mov r15,r12 + mov r0,r22 + com r0 + and r15,r0 + mov r24,r6 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r6 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r22 + mov r0,r14 + com r0 + and r17,r0 + eor r22,r24 + eor r12,r25 + eor r6,r16 + eor r13,r17 + eor r14,r15 + eor r12,r22 + eor r13,r6 + eor r22,r14 + com r6 + std Z+2,r22 + std Z+10,r12 + std Z+26,r13 + std Z+34,r14 + ldd r12,Z+11 + ldd r13,Z+27 + ldd r14,Z+35 + eor r23,r14 + eor r7,r12 + eor r14,r13 + mov r15,r12 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r7 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r7 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r23 + mov r0,r14 + com r0 + and r17,r0 + eor r23,r24 + eor r12,r25 + eor r7,r16 + eor r13,r17 + eor r14,r15 + eor r12,r23 + eor r13,r7 + eor r23,r14 + com r7 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r14 + ldd r12,Z+12 + ldd r13,Z+28 + ldd r14,Z+36 + eor r26,r14 + eor r8,r12 + eor r14,r13 + mov r15,r12 + mov r0,r26 + com r0 + and r15,r0 + mov r24,r8 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r8 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r26 + mov r0,r14 + com r0 + and r17,r0 + eor r26,r24 + eor r12,r25 + eor r8,r16 + eor r13,r17 + eor r14,r15 + eor r12,r26 + eor r13,r8 + eor r26,r14 + com r8 + std Z+4,r26 + std Z+12,r12 + std Z+28,r13 + std Z+36,r14 + ldd r12,Z+13 + ldd r13,Z+29 + ldd r14,Z+37 + eor r27,r14 + eor r9,r12 + eor r14,r13 + mov r15,r12 + mov r0,r27 + com r0 + and r15,r0 + mov r24,r9 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r9 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r27 + mov r0,r14 + com r0 + and r17,r0 + eor r27,r24 + eor r12,r25 + eor r9,r16 + eor r13,r17 + eor r14,r15 + eor r12,r27 + eor r13,r9 + eor r27,r14 + com r9 + std Z+5,r27 + std Z+13,r12 + std Z+29,r13 + std Z+37,r14 + ldd r12,Z+14 + ldd r13,Z+30 + ldd r14,Z+38 + eor r2,r14 + eor r10,r12 + eor r14,r13 + mov r15,r12 + mov r0,r2 + com r0 + and r15,r0 + mov r24,r10 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r10 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r2 + mov r0,r14 + com r0 + and r17,r0 + eor r2,r24 + eor r12,r25 + eor r10,r16 + eor r13,r17 + eor r14,r15 + eor r12,r2 + eor r13,r10 + eor r2,r14 + com r10 + std Z+6,r2 + std Z+14,r12 + std Z+30,r13 + std Z+38,r14 + ldd r12,Z+15 + ldd r13,Z+31 + ldd r14,Z+39 + eor r3,r14 + eor r11,r12 + eor r14,r13 + mov r15,r12 + mov r0,r3 + com r0 + and r15,r0 + mov r24,r11 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r11 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r3 + mov r0,r14 + com r0 + and r17,r0 + eor r3,r24 + eor r12,r25 + eor r11,r16 + eor r13,r17 + eor r14,r15 + eor r12,r3 + eor r13,r11 + eor r3,r14 + com r11 + std Z+7,r3 + std Z+15,r12 + std Z+31,r13 + std Z+39,r14 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r20,Z+24 + ldd r21,Z+25 + ldd r22,Z+26 + ldd r23,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r20 + std Z+25,r21 + std Z+26,r22 + std Z+27,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r22,Z+34 + ldd r23,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r20 + std Z+33,r21 + std Z+34,r22 + std Z+35,r23 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + ldd r12,Z+40 + ldd r13,Z+41 + ldd r14,Z+42 + ldd r15,Z+43 + eor r12,r20 + eor r13,r21 + eor r14,r22 + eor r15,r23 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + std Z+40,r12 + std Z+41,r13 + std Z+42,r14 + std Z+43,r15 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + ldd r0,Z+24 + eor r12,r0 + ldd r0,Z+25 + eor r13,r0 + ldd r0,Z+26 + eor r14,r0 + ldd r0,Z+27 + eor r15,r0 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + ldd r12,Z+48 + ldd r13,Z+49 + ldd r14,Z+50 + ldd r15,Z+51 + ldd r0,Z+8 + eor r12,r0 + ldd r0,Z+9 + eor r13,r0 + ldd r0,Z+10 + eor r14,r0 + ldd r0,Z+11 + eor r15,r0 + ldd r0,Z+28 + eor r12,r0 + ldd r0,Z+29 + eor r13,r0 + ldd r0,Z+30 + eor r14,r0 + ldd r0,Z+31 + eor r15,r0 + std Z+48,r12 + std Z+49,r13 + std Z+50,r14 + std Z+51,r15 + ldd r12,Z+52 + ldd r13,Z+53 + ldd r14,Z+54 + ldd r15,Z+55 + ldd r0,Z+12 + eor r12,r0 + ldd r0,Z+13 + eor r13,r0 + ldd r0,Z+14 + eor r14,r0 + ldd r0,Z+15 + eor r15,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + std Z+52,r12 + std Z+53,r13 + std Z+54,r14 + std Z+55,r15 + subi r18,15 + dec r19 + breq 5904f + rjmp 38b +5904: + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size drysponge128_g, .-drysponge128_g + + .text +.global gascon256_core_round + .type gascon256_core_round, @function +gascon256_core_round: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 26 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r26,Z+ + ld r27,Z+ + ld r2,Z+ + ld r3,Z+ + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + eor r4,r22 + ld r22,Z + ldd r23,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r23,r22 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r22 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r18 + eor r12,r23 + eor r13,r4 + eor r15,r14 + eor r18,r24 + com r4 + std Y+1,r18 + st Z,r22 + std Z+8,r23 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r22,Z+1 + ldd r23,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r23,r22 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r22 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r19 + eor r12,r23 + eor r13,r5 + eor r15,r14 + eor r19,r24 + com r5 + std Y+2,r19 + std Z+1,r22 + std Z+9,r23 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r22,Z+2 + ldd r23,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r23,r22 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r22 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r20 + eor r12,r23 + eor r13,r6 + eor r15,r14 + eor r20,r24 + com r6 + std Y+3,r20 + std Z+2,r22 + std Z+10,r23 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r22,Z+3 + ldd r23,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r23,r22 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r22 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r21 + eor r12,r23 + eor r13,r7 + eor r15,r14 + eor r21,r24 + com r7 + std Y+4,r21 + std Z+3,r22 + std Z+11,r23 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r22,Z+4 + ldd r23,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r26,r24 + eor r23,r22 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r22 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r26 + eor r12,r23 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+5,r26 + std Z+4,r22 + std Z+12,r23 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r22,Z+5 + ldd r23,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r27,r24 + eor r23,r22 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r22 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r27 + eor r12,r23 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+6,r27 + std Z+5,r22 + std Z+13,r23 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r22,Z+6 + ldd r23,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r2,r24 + eor r23,r22 + eor r10,r12 + eor r14,r13 + eor r24,r15 + mov r17,r2 + mov r25,r22 + mov r0,r2 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r10 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r10 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r2 + eor r12,r23 + eor r13,r10 + eor r15,r14 + eor r2,r24 + com r10 + std Y+7,r2 + std Z+6,r22 + std Z+14,r23 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r22,Z+7 + ldd r23,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r3,r24 + eor r23,r22 + eor r11,r12 + eor r14,r13 + eor r24,r15 + mov r17,r3 + mov r25,r22 + mov r0,r3 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r11 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r11 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r3 + eor r12,r23 + eor r13,r11 + eor r15,r14 + eor r3,r24 + com r11 + std Y+8,r3 + std Z+7,r22 + std Z+15,r23 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + bst r22,0 + lsr r13 + ror r12 + ror r23 + ror r22 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r2 + std Z+23,r3 + movw r22,r4 + movw r12,r6 + movw r14,r8 + movw r24,r10 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r4 + eor r15,r5 + eor r24,r6 + eor r25,r7 + eor r22,r8 + eor r23,r9 + eor r12,r10 + eor r13,r11 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r14 + eor r5,r15 + eor r6,r24 + eor r7,r25 + eor r8,r22 + eor r9,r23 + eor r10,r12 + eor r11,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r12 + mov r12,r0 + mov r0,r23 + mov r23,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r26 + std Z+45,r27 + std Z+46,r2 + std Z+47,r3 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r26,Z+52 + ldd r27,Z+53 + ldd r2,Z+54 + ldd r3,Z+55 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r26 + std Z+53,r27 + std Z+54,r2 + std Z+55,r3 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r26,Z+60 + ldd r27,Z+61 + ldd r2,Z+62 + ldd r3,Z+63 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r26 + std Z+61,r27 + std Z+62,r2 + std Z+63,r3 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r2,Y+7 + ldd r3,Y+8 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+24,r4 + std Z+25,r5 + std Z+26,r6 + std Z+27,r7 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + st -Z,r3 + st -Z,r2 + st -Z,r27 + st -Z,r26 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + adiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gascon256_core_round, .-gascon256_core_round + + .text +.global drysponge256_g + .type drysponge256_g, @function +drysponge256_g: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 44 + subi r30,148 + sbci r31,255 + ld r19,Z + subi r30,108 + sbc r31,r1 + ldi r18,240 + std Y+25,r19 + std Y+26,r18 + std Y+9,r1 + std Y+10,r1 + std Y+11,r1 + std Y+12,r1 + std Y+13,r1 + std Y+14,r1 + std Y+15,r1 + std Y+16,r1 + std Y+17,r1 + std Y+18,r1 + std Y+19,r1 + std Y+20,r1 + std Y+21,r1 + std Y+22,r1 + std Y+23,r1 + std Y+24,r1 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r22,Z+ + ld r23,Z+ + ld r26,Z+ + ld r27,Z+ + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 +40: + ldd r24,Y+26 + eor r2,r24 + subi r24,15 + std Y+26,r24 + ld r10,Z + ldd r11,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r11,r10 + eor r2,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r10 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r2 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r2 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r18 + eor r12,r11 + eor r13,r2 + eor r15,r14 + eor r18,r24 + com r2 + std Y+1,r18 + st Z,r10 + std Z+8,r11 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r10,Z+1 + ldd r11,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r11,r10 + eor r3,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r10 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r3 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r3 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r19 + eor r12,r11 + eor r13,r3 + eor r15,r14 + eor r19,r24 + com r3 + std Y+2,r19 + std Z+1,r10 + std Z+9,r11 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r10,Z+2 + ldd r11,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r11,r10 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r10 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r20 + eor r12,r11 + eor r13,r4 + eor r15,r14 + eor r20,r24 + com r4 + std Y+3,r20 + std Z+2,r10 + std Z+10,r11 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r10,Z+3 + ldd r11,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r11,r10 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r10 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r21 + eor r12,r11 + eor r13,r5 + eor r15,r14 + eor r21,r24 + com r5 + std Y+4,r21 + std Z+3,r10 + std Z+11,r11 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r10,Z+4 + ldd r11,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r22,r24 + eor r11,r10 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r22 + mov r25,r10 + mov r0,r22 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r22 + eor r12,r11 + eor r13,r6 + eor r15,r14 + eor r22,r24 + com r6 + std Y+5,r22 + std Z+4,r10 + std Z+12,r11 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r10,Z+5 + ldd r11,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r23,r24 + eor r11,r10 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r23 + mov r25,r10 + mov r0,r23 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r23 + eor r12,r11 + eor r13,r7 + eor r15,r14 + eor r23,r24 + com r7 + std Y+6,r23 + std Z+5,r10 + std Z+13,r11 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r10,Z+6 + ldd r11,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r26,r24 + eor r11,r10 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r10 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r26 + eor r12,r11 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+7,r26 + std Z+6,r10 + std Z+14,r11 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r10,Z+7 + ldd r11,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r27,r24 + eor r11,r10 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r10 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r27 + eor r12,r11 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+8,r27 + std Z+7,r10 + std Z+15,r11 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + bst r10,0 + lsr r13 + ror r12 + ror r11 + ror r10 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r23 + mov r23,r26 + mov r26,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r22 + std Z+21,r23 + std Z+22,r26 + std Z+23,r27 + movw r10,r2 + movw r12,r4 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + mov r0,r2 + mov r2,r4 + mov r4,r0 + mov r0,r3 + mov r3,r5 + mov r5,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + or r5,r0 + mov r0,r6 + mov r6,r8 + mov r8,r0 + mov r0,r7 + mov r7,r9 + mov r9,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r6,r10 + eor r7,r11 + eor r8,r12 + eor r9,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r26,Z+38 + ldd r27,Z+39 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r12 + mov r12,r0 + mov r0,r11 + mov r11,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r22 + std Z+37,r23 + std Z+38,r26 + std Z+39,r27 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r22,Z+44 + ldd r23,Z+45 + ldd r26,Z+46 + ldd r27,Z+47 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r22 + std Z+45,r23 + std Z+46,r26 + std Z+47,r27 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r22,Z+52 + ldd r23,Z+53 + ldd r26,Z+54 + ldd r27,Z+55 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r22 + std Z+53,r23 + std Z+54,r26 + std Z+55,r27 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r22,Z+60 + ldd r23,Z+61 + ldd r26,Z+62 + ldd r27,Z+63 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r22 + std Z+61,r23 + std Z+62,r26 + std Z+63,r27 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + ldd r10,Y+9 + ldd r11,Y+10 + ldd r12,Y+11 + ldd r13,Y+12 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + ldd r0,Z+12 + eor r10,r0 + ldd r0,Z+13 + eor r11,r0 + ldd r0,Z+14 + eor r12,r0 + ldd r0,Z+15 + eor r13,r0 + ldd r0,Z+32 + eor r10,r0 + ldd r0,Z+33 + eor r11,r0 + ldd r0,Z+34 + eor r12,r0 + ldd r0,Z+35 + eor r13,r0 + ldd r0,Z+52 + eor r10,r0 + ldd r0,Z+53 + eor r11,r0 + ldd r0,Z+54 + eor r12,r0 + ldd r0,Z+55 + eor r13,r0 + std Y+9,r10 + std Y+10,r11 + std Y+11,r12 + std Y+12,r13 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + ldd r0,Z+16 + eor r10,r0 + ldd r0,Z+17 + eor r11,r0 + ldd r0,Z+18 + eor r12,r0 + ldd r0,Z+19 + eor r13,r0 + ldd r0,Z+36 + eor r10,r0 + ldd r0,Z+37 + eor r11,r0 + ldd r0,Z+38 + eor r12,r0 + ldd r0,Z+39 + eor r13,r0 + ldd r0,Z+40 + eor r10,r0 + ldd r0,Z+41 + eor r11,r0 + ldd r0,Z+42 + eor r12,r0 + ldd r0,Z+43 + eor r13,r0 + std Y+13,r10 + std Y+14,r11 + std Y+15,r12 + std Y+16,r13 + ldd r10,Y+17 + ldd r11,Y+18 + ldd r12,Y+19 + ldd r13,Y+20 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + ld r0,Z + eor r10,r0 + ldd r0,Z+1 + eor r11,r0 + ldd r0,Z+2 + eor r12,r0 + ldd r0,Z+3 + eor r13,r0 + ldd r0,Z+20 + eor r10,r0 + ldd r0,Z+21 + eor r11,r0 + ldd r0,Z+22 + eor r12,r0 + ldd r0,Z+23 + eor r13,r0 + ldd r0,Z+44 + eor r10,r0 + ldd r0,Z+45 + eor r11,r0 + ldd r0,Z+46 + eor r12,r0 + ldd r0,Z+47 + eor r13,r0 + std Y+17,r10 + std Y+18,r11 + std Y+19,r12 + std Y+20,r13 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + ldd r0,Z+4 + eor r10,r0 + ldd r0,Z+5 + eor r11,r0 + ldd r0,Z+6 + eor r12,r0 + ldd r0,Z+7 + eor r13,r0 + ldd r0,Z+8 + eor r10,r0 + ldd r0,Z+9 + eor r11,r0 + ldd r0,Z+10 + eor r12,r0 + ldd r0,Z+11 + eor r13,r0 + ldd r0,Z+48 + eor r10,r0 + ldd r0,Z+49 + eor r11,r0 + ldd r0,Z+50 + eor r12,r0 + ldd r0,Z+51 + eor r13,r0 + std Y+21,r10 + std Y+22,r11 + std Y+23,r12 + std Y+24,r13 + ldd r10,Y+25 + dec r10 + std Y+25,r10 + breq 6623f + rjmp 40b +6623: + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + st -Z,r27 + st -Z,r26 + st -Z,r23 + st -Z,r22 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + ldi r25,72 + add r30,r25 + adc r31,r1 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + ldd r2,Y+17 + ldd r3,Y+18 + ldd r4,Y+19 + ldd r5,Y+20 + ldd r6,Y+21 + ldd r7,Y+22 + ldd r8,Y+23 + ldd r9,Y+24 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + adiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size drysponge256_g, .-drysponge256_g + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.c b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.c new file mode 100644 index 0000000..6dfe48c --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.c @@ -0,0 +1,611 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-drysponge.h" +#include + +#if !defined(__AVR__) + +/* Right rotations in bit-interleaved format */ +#define intRightRotateEven(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, (bits)); \ + _x1 = rightRotate(_x1, (bits)); \ + _x0 | (((uint64_t)_x1) << 32); \ + })) +#define intRightRotateOdd(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, ((bits) + 1) % 32); \ + _x1 = rightRotate(_x1, (bits)); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate1_64(x) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate1(_x0); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate2_64(x) (intRightRotateEven((x), 1)) +#define intRightRotate3_64(x) (intRightRotateOdd((x), 1)) +#define intRightRotate4_64(x) (intRightRotateEven((x), 2)) +#define intRightRotate5_64(x) (intRightRotateOdd((x), 2)) +#define intRightRotate6_64(x) (intRightRotateEven((x), 3)) +#define intRightRotate7_64(x) (intRightRotateOdd((x), 3)) +#define intRightRotate8_64(x) (intRightRotateEven((x), 4)) +#define intRightRotate9_64(x) (intRightRotateOdd((x), 4)) +#define intRightRotate10_64(x) (intRightRotateEven((x), 5)) +#define intRightRotate11_64(x) (intRightRotateOdd((x), 5)) +#define intRightRotate12_64(x) (intRightRotateEven((x), 6)) +#define intRightRotate13_64(x) (intRightRotateOdd((x), 6)) +#define intRightRotate14_64(x) (intRightRotateEven((x), 7)) +#define intRightRotate15_64(x) (intRightRotateOdd((x), 7)) +#define intRightRotate16_64(x) (intRightRotateEven((x), 8)) +#define intRightRotate17_64(x) (intRightRotateOdd((x), 8)) +#define intRightRotate18_64(x) (intRightRotateEven((x), 9)) +#define intRightRotate19_64(x) (intRightRotateOdd((x), 9)) +#define intRightRotate20_64(x) (intRightRotateEven((x), 10)) +#define intRightRotate21_64(x) (intRightRotateOdd((x), 10)) +#define intRightRotate22_64(x) (intRightRotateEven((x), 11)) +#define intRightRotate23_64(x) (intRightRotateOdd((x), 11)) +#define intRightRotate24_64(x) (intRightRotateEven((x), 12)) +#define intRightRotate25_64(x) (intRightRotateOdd((x), 12)) +#define intRightRotate26_64(x) (intRightRotateEven((x), 13)) +#define intRightRotate27_64(x) (intRightRotateOdd((x), 13)) +#define intRightRotate28_64(x) (intRightRotateEven((x), 14)) +#define intRightRotate29_64(x) (intRightRotateOdd((x), 14)) +#define intRightRotate30_64(x) (intRightRotateEven((x), 15)) +#define intRightRotate31_64(x) (intRightRotateOdd((x), 15)) +#define intRightRotate32_64(x) (intRightRotateEven((x), 16)) +#define intRightRotate33_64(x) (intRightRotateOdd((x), 16)) +#define intRightRotate34_64(x) (intRightRotateEven((x), 17)) +#define intRightRotate35_64(x) (intRightRotateOdd((x), 17)) +#define intRightRotate36_64(x) (intRightRotateEven((x), 18)) +#define intRightRotate37_64(x) (intRightRotateOdd((x), 18)) +#define intRightRotate38_64(x) (intRightRotateEven((x), 19)) +#define intRightRotate39_64(x) (intRightRotateOdd((x), 19)) +#define intRightRotate40_64(x) (intRightRotateEven((x), 20)) +#define intRightRotate41_64(x) (intRightRotateOdd((x), 20)) +#define intRightRotate42_64(x) (intRightRotateEven((x), 21)) +#define intRightRotate43_64(x) (intRightRotateOdd((x), 21)) +#define intRightRotate44_64(x) (intRightRotateEven((x), 22)) +#define intRightRotate45_64(x) (intRightRotateOdd((x), 22)) +#define intRightRotate46_64(x) (intRightRotateEven((x), 23)) +#define intRightRotate47_64(x) (intRightRotateOdd((x), 23)) +#define intRightRotate48_64(x) (intRightRotateEven((x), 24)) +#define intRightRotate49_64(x) (intRightRotateOdd((x), 24)) +#define intRightRotate50_64(x) (intRightRotateEven((x), 25)) +#define intRightRotate51_64(x) (intRightRotateOdd((x), 25)) +#define intRightRotate52_64(x) (intRightRotateEven((x), 26)) +#define intRightRotate53_64(x) (intRightRotateOdd((x), 26)) +#define intRightRotate54_64(x) (intRightRotateEven((x), 27)) +#define intRightRotate55_64(x) (intRightRotateOdd((x), 27)) +#define intRightRotate56_64(x) (intRightRotateEven((x), 28)) +#define intRightRotate57_64(x) (intRightRotateOdd((x), 28)) +#define intRightRotate58_64(x) (intRightRotateEven((x), 29)) +#define intRightRotate59_64(x) (intRightRotateOdd((x), 29)) +#define intRightRotate60_64(x) (intRightRotateEven((x), 30)) +#define intRightRotate61_64(x) (intRightRotateOdd((x), 30)) +#define intRightRotate62_64(x) (intRightRotateEven((x), 31)) +#define intRightRotate63_64(x) (intRightRotateOdd((x), 31)) + +void gascon128_core_round(gascon128_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); +#endif + + /* Add the round constant to the middle of the state */ + x2 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x4; x2 ^= x1; x4 ^= x3; t0 = (~x0) & x1; t1 = (~x1) & x2; + t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x0; x0 ^= t1; + x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; x1 ^= x0; x3 ^= x2; + x0 ^= x4; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); +#endif +} + +void gascon256_core_round(gascon256_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; + uint64_t x8 = state->S[8]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); + uint64_t x8 = le_load_word64(state->B + 64); +#endif + + /* Add the round constant to the middle of the state */ + x4 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x8; x2 ^= x1; x4 ^= x3; x6 ^= x5; x8 ^= x7; t0 = (~x0) & x1; + t1 = (~x1) & x2; t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x5; + t5 = (~x5) & x6; t6 = (~x6) & x7; t7 = (~x7) & x8; t8 = (~x8) & x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t5; x5 ^= t6; x6 ^= t7; + x7 ^= t8; x8 ^= t0; x1 ^= x0; x3 ^= x2; x5 ^= x4; x7 ^= x6; x0 ^= x8; + x4 = ~x4; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + x5 ^= intRightRotate31_64(x5) ^ intRightRotate26_64(x5); + x6 ^= intRightRotate53_64(x6) ^ intRightRotate58_64(x6); + x7 ^= intRightRotate9_64(x7) ^ intRightRotate46_64(x7); + x8 ^= intRightRotate43_64(x8) ^ intRightRotate50_64(x8); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; + state->S[8] = x8; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); + le_store_word64(state->B + 64, x8); +#endif +} + +void drysponge128_g(drysponge128_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes */ + gascon128_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon128_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4]; + } +} + +void drysponge256_g(drysponge256_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes. + * And so on for a total of 64 bytes XOR'ed into the output data. */ + gascon256_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon256_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + } +} + +#endif /* !__AVR__ */ + +void drysponge128_g_core(drysponge128_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon128_core_round(&(state->c), round); +} + +void drysponge256_g_core(drysponge256_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon256_core_round(&(state->c), round); +} + +/** + * \fn uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) + * \brief Selects an element of x in constant time. + * + * \param x Points to the four elements of x. + * \param index Index of which element to extract between 0 and 3. + * + * \return The selected element of x. + */ +#if !defined(__AVR__) +STATIC_INLINE uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) +{ + /* We need to be careful how we select each element of x because + * we are doing a data-dependent fetch here. Do the fetch in a way + * that should avoid cache timing issues by fetching every element + * of x and masking away the ones we don't want. + * + * There is a possible side channel here with respect to power analysis. + * The "mask" value will be all-ones for the selected index and all-zeroes + * for the other indexes. This may show up as different power consumption + * for the "result ^= x[i] & mask" statement when i is the selected index. + * Such a side channel could in theory allow reading the plaintext input + * to the cipher by analysing the CPU's power consumption. + * + * The DryGASCON specification acknowledges the possibility of plaintext + * recovery in section 7.4. For software mitigation the specification + * suggests randomization of the indexes into c and x and randomization + * of the order of processing words. We aren't doing that here yet. + * Patches welcome to fix this. + */ + uint32_t mask = -((uint32_t)((0x04 - index) >> 2)); + uint32_t result = x[0] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x01)) >> 2)); + result ^= x[1] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x02)) >> 2)); + result ^= x[2] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x03)) >> 2)); + return result ^ (x[3] & mask); +} +#else +/* AVR is more or less immune to cache timing issues because it doesn't + * have anything like an L1 or L2 cache. Select the word directly */ +#define drysponge_select_x(x, index) ((x)[(index)]) +#endif + +/** + * \brief Mixes a 32-bit value into the DrySPONGE128 state. + * + * \param state DrySPONGE128 state. + * \param data The data to be mixed in the bottom 10 bits. + */ +static void drysponge128_mix_phase_round + (drysponge128_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); +} + +/** + * \brief Mixes a 32-bit value into the DrySPONGE256 state. + * + * \param state DrySPONGE256 state. + * \param data The data to be mixed in the bottom 18 bits. + */ +static void drysponge256_mix_phase_round + (drysponge256_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); + state->c.W[10] ^= drysponge_select_x(state->x.W, (data >> 10) & 0x03); + state->c.W[12] ^= drysponge_select_x(state->x.W, (data >> 12) & 0x03); + state->c.W[14] ^= drysponge_select_x(state->x.W, (data >> 14) & 0x03); + state->c.W[16] ^= drysponge_select_x(state->x.W, (data >> 16) & 0x03); +} + +/** + * \brief Mixes an input block into a DrySPONGE128 state. + * + * \param state The DrySPONGE128 state. + * \param data Full rate block containing the input data. + */ +static void drysponge128_mix_phase + (drysponge128_state_t *state, const unsigned char data[DRYSPONGE128_RATE]) +{ + /* Mix 10-bit groups into the output, with the domain + * separator added to the last two groups */ + drysponge128_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[1] >> 2) | (((uint32_t)(data[2])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[2] >> 4) | (((uint32_t)(data[3])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[3] >> 6) | (((uint32_t)(data[4])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[5] | (((uint32_t)(data[6])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[6] >> 2) | (((uint32_t)(data[7])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[7] >> 4) | (((uint32_t)(data[8])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[8] >> 6) | (((uint32_t)(data[9])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[10] | (((uint32_t)(data[11])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[12] >> 4) | (((uint32_t)(data[13])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, ((data[13] >> 6) | (((uint32_t)(data[14])) << 2))); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, data[15] ^ state->domain); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, state->domain >> 10); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +/** + * \brief Mixes an input block into a DrySPONGE256 state. + * + * \param state The DrySPONGE256 state. + * \param data Full rate block containing the input data. + */ +static void drysponge256_mix_phase + (drysponge256_state_t *state, const unsigned char data[DRYSPONGE256_RATE]) +{ + /* Mix 18-bit groups into the output, with the domain in the last group */ + drysponge256_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[2] >> 2) | (((uint32_t)(data[3])) << 6) | + (((uint32_t)(data[4])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[4] >> 4) | (((uint32_t)(data[5])) << 4) | + (((uint32_t)(data[6])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[6] >> 6) | (((uint32_t)(data[7])) << 2) | + (((uint32_t)(data[8])) << 10)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, data[9] | (((uint32_t)(data[10])) << 8) | + (((uint32_t)(data[11])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6) | + (((uint32_t)(data[13])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[13] >> 4) | (((uint32_t)(data[14])) << 4) | + (((uint32_t)(data[15])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[15] >> 6) ^ state->domain); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE128_RATE) { + drysponge128_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE128_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE128_RATE - len - 1); + drysponge128_mix_phase(state, padded); + } +} + +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE256_RATE) { + drysponge256_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE256_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE256_RATE - len - 1); + drysponge256_mix_phase(state, padded); + } +} + +/** + * \brief Determine if some of the words of an "x" value are identical. + * + * \param x Points to the "x" buffer to check. + * + * \return Non-zero if some of the words are the same, zero if they are + * distinct from each other. + * + * We try to perform the check in constant time to avoid giving away + * any information about the value of the key. + */ +static int drysponge_x_words_are_same(const uint32_t x[4]) +{ + unsigned i, j; + int result = 0; + for (i = 0; i < 3; ++i) { + for (j = i + 1; j < 4; ++j) { + uint32_t check = x[i] ^ x[j]; + result |= (int)((0x100000000ULL - check) >> 32); + } + } + return result; +} + +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-128 state with repeated copies of the key */ + memcpy(state->c.B, key, 16); + memcpy(state->c.B + 16, key, 16); + memcpy(state->c.B + 32, key, 8); + + /* Generate the "x" value for the state. All four words of "x" + * must be unique because they will be used in drysponge_select_x() + * as stand-ins for the bit pairs 00, 01, 10, and 11. + * + * Run the core block operation over and over until "x" is unique. + * Technically the runtime here is key-dependent and not constant. + * If the input key is randomized, this should only take 1 round + * on average so it is "almost constant time". + */ + do { + gascon128_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE128_INIT_ROUNDS; + state->domain = DRYDOMAIN128_NONCE; + if (final_block) + state->domain |= DRYDOMAIN128_FINAL; + drysponge128_f_absorb(state, nonce, 16); + drysponge128_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE128_ROUNDS; +} + +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-256 state with repeated copies of the key */ + memcpy(state->c.B, key, 32); + memcpy(state->c.B + 32, key, 32); + memcpy(state->c.B + 64, key, 8); + + /* Generate the "x" value for the state */ + do { + gascon256_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE256_INIT_ROUNDS; + state->domain = DRYDOMAIN256_NONCE; + if (final_block) + state->domain |= DRYDOMAIN256_FINAL; + drysponge256_f_absorb(state, nonce, 16); + drysponge256_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE256_ROUNDS; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.h b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.h new file mode 100644 index 0000000..05b0c16 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-drysponge.h @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_DRYSPONGE_H +#define LW_INTERNAL_DRYSPONGE_H + +#include "internal-util.h" + +/** + * \file internal-drysponge.h + * \brief Internal implementation of DrySPONGE for the DryGASCON cipher. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the GASCON-128 permutation state in bytes. + */ +#define GASCON128_STATE_SIZE 40 + +/** + * \brief Size of the GASCON-256 permutation state in bytes. + */ +#define GASCON256_STATE_SIZE 72 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE128. + */ +#define DRYSPONGE128_RATE 16 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE256. + */ +#define DRYSPONGE256_RATE 16 + +/** + * \brief Size of the "x" value for DrySPONGE128. + */ +#define DRYSPONGE128_XSIZE 16 + +/** + * \brief Size of the "x" value for DrySPONGE256. + */ +#define DRYSPONGE256_XSIZE 16 + +/** + * \brief Normal number of rounds for DrySPONGE128 when absorbing + * and squeezing data. + */ +#define DRYSPONGE128_ROUNDS 7 + +/** + * \brief Number of rounds for DrySPONGE128 during initialization. + */ +#define DRYSPONGE128_INIT_ROUNDS 11 + +/** + * \brief Normal number of rounds for DrySPONGE256 when absorbing + * and squeezing data. + */ +#define DRYSPONGE256_ROUNDS 8 + +/** + * \brief Number of rounds for DrySPONGE256 during initialization. + */ +#define DRYSPONGE256_INIT_ROUNDS 12 + +/** + * \brief DrySPONGE128 domain bit for a padded block. + */ +#define DRYDOMAIN128_PADDED (1 << 8) + +/** + * \brief DrySPONGE128 domain bit for a final block. + */ +#define DRYDOMAIN128_FINAL (1 << 9) + +/** + * \brief DrySPONGE128 domain value for processing the nonce. + */ +#define DRYDOMAIN128_NONCE (1 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the associated data. + */ +#define DRYDOMAIN128_ASSOC_DATA (2 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the message. + */ +#define DRYDOMAIN128_MESSAGE (3 << 10) + +/** + * \brief DrySPONGE256 domain bit for a padded block. + */ +#define DRYDOMAIN256_PADDED (1 << 2) + +/** + * \brief DrySPONGE256 domain bit for a final block. + */ +#define DRYDOMAIN256_FINAL (1 << 3) + +/** + * \brief DrySPONGE256 domain value for processing the nonce. + */ +#define DRYDOMAIN256_NONCE (1 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the associated data. + */ +#define DRYDOMAIN256_ASSOC_DATA (2 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the message. + */ +#define DRYDOMAIN256_MESSAGE (3 << 4) + +/** + * \brief Internal state of the GASCON-128 permutation. + */ +typedef union +{ + uint64_t S[GASCON128_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON128_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON128_STATE_SIZE]; /**< Bytes of the state */ + +} gascon128_state_t; + +/** + * \brief Internal state of the GASCON-256 permutation. + */ +typedef union +{ + uint64_t S[GASCON256_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON256_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON256_STATE_SIZE]; /**< Bytes of the state */ + +} gascon256_state_t; + +/** + * \brief Structure of a rate block for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_RATE]; /**< Bytes of the rate */ + +} drysponge128_rate_t; + +/** + * \brief Structure of a rate block for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_RATE]; /**< Bytes of the rate */ + +} drysponge256_rate_t; + +/** + * \brief Structure of the "x" value for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_XSIZE]; /**< Bytes of the rate */ + +} drysponge128_x_t; + +/** + * \brief Structure of the "x" value for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_XSIZE]; /**< Bytes of the rate */ + +} drysponge256_x_t; + +/** + * \brief Structure of the rolling DrySPONGE128 state. + */ +typedef struct +{ + gascon128_state_t c; /**< GASCON-128 state for the capacity */ + drysponge128_rate_t r; /**< Buffer for a rate block of data */ + drysponge128_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge128_state_t; + +/** + * \brief Structure of the rolling DrySPONGE256 state. + */ +typedef struct +{ + gascon256_state_t c; /**< GASCON-256 state for the capacity */ + drysponge256_rate_t r; /**< Buffer for a rate block of data */ + drysponge256_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge256_state_t; + +/** + * \brief Permutes the GASCON-128 state using one iteration of CoreRound. + * + * \param state The GASCON-128 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon128_core_round(gascon128_state_t *state, uint8_t round); + +/** + * \brief Permutes the GASCON-256 state using one iteration of CoreRound. + * + * \param state The GASCON-256 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon256_core_round(gascon256_state_t *state, uint8_t round); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds and squeezes data out of the GASGON-128 state. + * + * \param state The DrySPONGE128 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge128_g(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds and squeezes data out of the GASGON-256 state. + * + * \param state The DrySPONGE256 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge256_g(drysponge256_state_t *state); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE128 state. + */ +void drysponge128_g_core(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE256 state. + */ +void drysponge256_g_core(drysponge256_state_t *state); + +/** + * \brief Performs the absorption phase of the DrySPONGE128 F function. + * + * \param state The DrySPONGE128 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE128_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge128_g() or + * drysponge128_g_core() to perform the full F operation. + */ +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Performs the absorption phase of the DrySPONGE256 F function. + * + * \param state The DrySPONGE256 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE256_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge256_g() or + * drysponge256_g_core() to perform the full F operation. + */ +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Set up a DrySPONGE128 state to begin encryption or decryption. + * + * \param state The DrySPONGE128 state. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +/** + * \brief Set up a DrySPONGE256 state to begin encryption or decryption. + * + * \param state The DrySPONGE256 state. + * \param key Points to the 32 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-util.h b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon128/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.c b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.h b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/api.h b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/api.h new file mode 100644 index 0000000..de9380d --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 64 diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.c b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.c new file mode 100644 index 0000000..e963903 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.c @@ -0,0 +1,421 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "drygascon.h" +#include "internal-drysponge.h" +#include + +aead_cipher_t const drygascon128_cipher = { + "DryGASCON128", + DRYGASCON128_KEY_SIZE, + DRYGASCON128_NONCE_SIZE, + DRYGASCON128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_aead_encrypt, + drygascon128_aead_decrypt +}; + +aead_cipher_t const drygascon256_cipher = { + "DryGASCON256", + DRYGASCON256_KEY_SIZE, + DRYGASCON256_NONCE_SIZE, + DRYGASCON256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_aead_encrypt, + drygascon256_aead_decrypt +}; + +aead_hash_algorithm_t const drygascon128_hash_algorithm = { + "DryGASCON128-HASH", + sizeof(int), + DRYGASCON128_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon128_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const drygascon256_hash_algorithm = { + "DryGASCON256-HASH", + sizeof(int), + DRYGASCON256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + drygascon256_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Processes associated data for DryGASCON128. + * + * \param state DrySPONGE128 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon128_process_ad + (drysponge128_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(state, ad, DRYSPONGE128_RATE); + drysponge128_g_core(state); + ad += DRYSPONGE128_RATE; + adlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN128_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN128_FINAL; + if (adlen < DRYSPONGE128_RATE) + state->domain |= DRYDOMAIN128_PADDED; + drysponge128_f_absorb(state, ad, (unsigned)adlen); + drysponge128_g(state); +} + +/** + * \brief Processes associated data for DryGASCON256. + * + * \param state DrySPONGE256 sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must not be zero. + * \param finalize Non-zero to finalize packet processing because + * the message is zero-length. + */ +static void drygascon256_process_ad + (drysponge256_state_t *state, const unsigned char *ad, + unsigned long long adlen, int finalize) +{ + /* Process all blocks except the last one */ + while (adlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(state, ad, DRYSPONGE256_RATE); + drysponge256_g_core(state); + ad += DRYSPONGE256_RATE; + adlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state->domain = DRYDOMAIN256_ASSOC_DATA; + if (finalize) + state->domain |= DRYDOMAIN256_FINAL; + if (adlen < DRYSPONGE256_RATE) + state->domain |= DRYDOMAIN256_PADDED; + drysponge256_f_absorb(state, ad, (unsigned)adlen); + drysponge256_g(state); +} + +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge128_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE128_RATE) { + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + mlen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (mlen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)mlen; + drysponge128_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge128_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, DRYGASCON128_TAG_SIZE); + return 0; +} + +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge128_state_t state; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON128_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON128_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON128_TAG_SIZE; + drysponge128_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon128_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE128_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE128_RATE); + drysponge128_f_absorb(&state, m, DRYSPONGE128_RATE); + drysponge128_g(&state); + c += DRYSPONGE128_RATE; + m += DRYSPONGE128_RATE; + clen -= DRYSPONGE128_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN128_MESSAGE | DRYDOMAIN128_FINAL; + if (clen < DRYSPONGE128_RATE) + state.domain |= DRYDOMAIN128_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge128_f_absorb(&state, m, temp); + drysponge128_g(&state); + c += temp; + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state.r.B, c, DRYGASCON128_TAG_SIZE); +} + +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + drysponge256_setup(&state, k, npub, adlen == 0 && mlen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, mlen == 0); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Processs all blocks except the last one */ + while (mlen > DRYSPONGE256_RATE) { + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + lw_xor_block_2_src(c, m, state.r.B, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + mlen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (mlen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)mlen; + drysponge256_f_absorb(&state, m, temp); + lw_xor_block_2_src(c, m, state.r.B, temp); + drysponge256_g(&state); + c += temp; + } + + /* Generate the authentication tag */ + memcpy(c, state.r.B, 16); + drysponge256_g(&state); + memcpy(c + 16, state.r.B, 16); + return 0; +} + +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + drysponge256_state_t state; + unsigned char *mtemp = m; + unsigned temp; + int result; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DRYGASCON256_TAG_SIZE) + return -1; + *mlen = clen - DRYGASCON256_TAG_SIZE; + + /* Initialize the sponge state with the key and nonce */ + clen -= DRYGASCON256_TAG_SIZE; + drysponge256_setup(&state, k, npub, adlen == 0 && clen == 0); + + /* Process the associated data */ + if (adlen > 0) + drygascon256_process_ad(&state, ad, adlen, clen == 0); + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + /* Processs all blocks except the last one */ + while (clen > DRYSPONGE256_RATE) { + lw_xor_block_2_src(m, c, state.r.B, DRYSPONGE256_RATE); + drysponge256_f_absorb(&state, m, DRYSPONGE256_RATE); + drysponge256_g(&state); + c += DRYSPONGE256_RATE; + m += DRYSPONGE256_RATE; + clen -= DRYSPONGE256_RATE; + } + + /* Process the last block with domain separation and padding */ + state.domain = DRYDOMAIN256_MESSAGE | DRYDOMAIN256_FINAL; + if (clen < DRYSPONGE256_RATE) + state.domain |= DRYDOMAIN256_PADDED; + temp = (unsigned)clen; + lw_xor_block_2_src(m, c, state.r.B, temp); + drysponge256_f_absorb(&state, m, temp); + drysponge256_g(&state); + c += temp; + } + + /* Check the authentication tag which is split into two pieces */ + result = aead_check_tag(0, 0, state.r.B, c, 16); + drysponge256_g(&state); + return aead_check_tag_precheck + (mtemp, *mlen, state.r.B, c + 16, 16, ~result); +} + +/** + * \brief Precomputed initialization vector for DryGASCON128-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE128. + */ +static unsigned char const drygascon128_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89 +}; + +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge128_state_t state; + memcpy(state.c.B, drygascon128_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon128_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE128_ROUNDS; + drygascon128_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge128_g(&state); + memcpy(out + 16, state.r.B, 16); + return 0; +} + +/** + * \brief Precomputed initialization vector for DryGASCON256-HASH. + * + * This is the CST_H value from the DryGASCON specification after it + * has been processed by the key setup function for DrySPONGE256. + */ +static unsigned char const drygascon256_hash_init[] = { + /* c */ + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, + 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, + 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89, + 0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, + /* x */ + 0x45, 0x28, 0x21, 0xe6, 0x38, 0xd0, 0x13, 0x77, + 0xbe, 0x54, 0x66, 0xcf, 0x34, 0xe9, 0x0c, 0x6c +}; + +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + drysponge256_state_t state; + memcpy(state.c.B, drygascon256_hash_init, sizeof(state.c.B)); + memcpy(state.x.B, drygascon256_hash_init + sizeof(state.c.B), + sizeof(state.x.B)); + state.domain = 0; + state.rounds = DRYSPONGE256_ROUNDS; + drygascon256_process_ad(&state, in, inlen, 1); + memcpy(out, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 16, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 32, state.r.B, 16); + drysponge256_g(&state); + memcpy(out + 48, state.r.B, 16); + return 0; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.h b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.h new file mode 100644 index 0000000..12e18c3 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/drygascon.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_DRYGASCON_H +#define LWCRYPTO_DRYGASCON_H + +#include "aead-common.h" + +/** + * \file drygascon.h + * \brief DryGASCON authenticated encryption algorithm. + * + * DryGASCON is a family of authenticated encryption algorithms based + * around a generalised version of the ASCON permutation. DryGASCON + * is designed to provide some protection against power analysis. + * + * There are four algorithms in the DryGASCON family: + * + * \li DryGASCON128 is an authenticated encryption algorithm with a + * 128-bit key, a 128-bit nonce, and a 128-bit authentication tag. + * \li DryGASCON256 is an authenticated encryption algorithm with a + * 256-bit key, a 128-bit nonce, and a 128-256 authentication tag. + * \li DryGASCON128-HASH is a hash algorithm with a 256-bit output. + * \li DryGASCON256-HASH is a hash algorithm with a 512-bit output. + * + * DryGASCON128 and DryGASCON128-HASH are the primary members of the family. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for DryGASCON128. + */ +#define DRYGASCON128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for DryGASCON128. + */ +#define DRYGASCON128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for DryGASCON128. + */ +#define DRYGASCON128_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON128-HASH. + */ +#define DRYGASCON128_HASH_SIZE 32 + +/** + * \brief Size of the key for DryGASCON256. + */ +#define DRYGASCON256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for DryGASCON256. + */ +#define DRYGASCON256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for DryGASCON256. + */ +#define DRYGASCON256_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for DryGASCON256-HASH. + */ +#define DRYGASCON256_HASH_SIZE 64 + +/** + * \brief Meta-information block for the DryGASCON128 cipher. + */ +extern aead_cipher_t const drygascon128_cipher; + +/** + * \brief Meta-information block for the DryGASCON256 cipher. + */ +extern aead_cipher_t const drygascon256_cipher; + +/** + * \brief Meta-information block for DryGASCON128-HASH. + */ +extern aead_hash_algorithm_t const drygascon128_hash_algorithm; + +/** + * \brief Meta-information block for DryGASCON256-HASH. + */ +extern aead_hash_algorithm_t const drygascon256_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with DryGASCON128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon128_aead_decrypt() + */ +int drygascon128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon128_aead_encrypt() + */ +int drygascon128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with DryGASCON256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa drygascon256_aead_decrypt() + */ +int drygascon256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with DryGASCON256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa drygascon256_aead_encrypt() + */ +int drygascon256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with DRYGASCON128. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON128_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon128_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with DRYGASCON256. + * + * \param out Buffer to receive the hash output which must be at least + * DRYGASCON256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int drygascon256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/hash.c b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/hash.c new file mode 100644 index 0000000..6383146 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "drygascon.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return drygascon256_hash(out, in, inlen); +} diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge-avr.S b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge-avr.S new file mode 100644 index 0000000..84d0ff8 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge-avr.S @@ -0,0 +1,5092 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gascon128_core_round + .type gascon128_core_round, @function +gascon128_core_round: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + eor r4,r22 + ldd r23,Z+8 + ldd r12,Z+24 + ldd r13,Z+32 + eor r18,r13 + eor r4,r23 + eor r13,r12 + mov r14,r23 + mov r0,r18 + com r0 + and r14,r0 + mov r15,r4 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r4 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r18 + mov r0,r13 + com r0 + and r16,r0 + eor r18,r15 + eor r23,r24 + eor r4,r25 + eor r12,r16 + eor r13,r14 + eor r23,r18 + eor r12,r4 + eor r18,r13 + com r4 + st Z,r18 + std Z+8,r23 + std Z+24,r12 + std Z+32,r13 + ldd r23,Z+9 + ldd r12,Z+25 + ldd r13,Z+33 + eor r19,r13 + eor r5,r23 + eor r13,r12 + mov r14,r23 + mov r0,r19 + com r0 + and r14,r0 + mov r15,r5 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r5 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r19 + mov r0,r13 + com r0 + and r16,r0 + eor r19,r15 + eor r23,r24 + eor r5,r25 + eor r12,r16 + eor r13,r14 + eor r23,r19 + eor r12,r5 + eor r19,r13 + com r5 + std Z+1,r19 + std Z+9,r23 + std Z+25,r12 + std Z+33,r13 + ldd r23,Z+10 + ldd r12,Z+26 + ldd r13,Z+34 + eor r20,r13 + eor r6,r23 + eor r13,r12 + mov r14,r23 + mov r0,r20 + com r0 + and r14,r0 + mov r15,r6 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r6 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r20 + mov r0,r13 + com r0 + and r16,r0 + eor r20,r15 + eor r23,r24 + eor r6,r25 + eor r12,r16 + eor r13,r14 + eor r23,r20 + eor r12,r6 + eor r20,r13 + com r6 + std Z+2,r20 + std Z+10,r23 + std Z+26,r12 + std Z+34,r13 + ldd r23,Z+11 + ldd r12,Z+27 + ldd r13,Z+35 + eor r21,r13 + eor r7,r23 + eor r13,r12 + mov r14,r23 + mov r0,r21 + com r0 + and r14,r0 + mov r15,r7 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r7 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r21 + mov r0,r13 + com r0 + and r16,r0 + eor r21,r15 + eor r23,r24 + eor r7,r25 + eor r12,r16 + eor r13,r14 + eor r23,r21 + eor r12,r7 + eor r21,r13 + com r7 + std Z+3,r21 + std Z+11,r23 + std Z+27,r12 + std Z+35,r13 + ldd r23,Z+12 + ldd r12,Z+28 + ldd r13,Z+36 + eor r26,r13 + eor r8,r23 + eor r13,r12 + mov r14,r23 + mov r0,r26 + com r0 + and r14,r0 + mov r15,r8 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r8 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r26 + mov r0,r13 + com r0 + and r16,r0 + eor r26,r15 + eor r23,r24 + eor r8,r25 + eor r12,r16 + eor r13,r14 + eor r23,r26 + eor r12,r8 + eor r26,r13 + com r8 + std Z+4,r26 + std Z+12,r23 + std Z+28,r12 + std Z+36,r13 + ldd r23,Z+13 + ldd r12,Z+29 + ldd r13,Z+37 + eor r27,r13 + eor r9,r23 + eor r13,r12 + mov r14,r23 + mov r0,r27 + com r0 + and r14,r0 + mov r15,r9 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r9 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r27 + mov r0,r13 + com r0 + and r16,r0 + eor r27,r15 + eor r23,r24 + eor r9,r25 + eor r12,r16 + eor r13,r14 + eor r23,r27 + eor r12,r9 + eor r27,r13 + com r9 + std Z+5,r27 + std Z+13,r23 + std Z+29,r12 + std Z+37,r13 + ldd r23,Z+14 + ldd r12,Z+30 + ldd r13,Z+38 + eor r2,r13 + eor r10,r23 + eor r13,r12 + mov r14,r23 + mov r0,r2 + com r0 + and r14,r0 + mov r15,r10 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r10 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r2 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r15 + eor r23,r24 + eor r10,r25 + eor r12,r16 + eor r13,r14 + eor r23,r2 + eor r12,r10 + eor r2,r13 + com r10 + std Z+6,r2 + std Z+14,r23 + std Z+30,r12 + std Z+38,r13 + ldd r23,Z+15 + ldd r12,Z+31 + ldd r13,Z+39 + eor r3,r13 + eor r11,r23 + eor r13,r12 + mov r14,r23 + mov r0,r3 + com r0 + and r14,r0 + mov r15,r11 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r12 + mov r0,r11 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r12 + com r0 + and r25,r0 + mov r16,r3 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r15 + eor r23,r24 + eor r11,r25 + eor r12,r16 + eor r13,r14 + eor r23,r3 + eor r12,r11 + eor r3,r13 + com r11 + std Z+7,r3 + std Z+15,r23 + std Z+31,r12 + std Z+39,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r18 + eor r25,r19 + eor r16,r20 + eor r17,r21 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r24 + eor r19,r25 + eor r20,r16 + eor r21,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gascon128_core_round, .-gascon128_core_round + + .text +.global drysponge128_g + .type drysponge128_g, @function +drysponge128_g: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + subi r30,180 + sbci r31,255 + ld r19,Z + subi r30,76 + sbc r31,r1 + ldi r18,240 + std Z+40,r1 + std Z+41,r1 + std Z+42,r1 + std Z+43,r1 + std Z+44,r1 + std Z+45,r1 + std Z+46,r1 + std Z+47,r1 + std Z+48,r1 + std Z+49,r1 + std Z+50,r1 + std Z+51,r1 + std Z+52,r1 + std Z+53,r1 + std Z+54,r1 + std Z+55,r1 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 +38: + eor r4,r18 + ldd r12,Z+8 + ldd r13,Z+24 + ldd r14,Z+32 + eor r20,r14 + eor r4,r12 + eor r14,r13 + mov r15,r12 + mov r0,r20 + com r0 + and r15,r0 + mov r24,r4 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r4 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r20 + mov r0,r14 + com r0 + and r17,r0 + eor r20,r24 + eor r12,r25 + eor r4,r16 + eor r13,r17 + eor r14,r15 + eor r12,r20 + eor r13,r4 + eor r20,r14 + com r4 + st Z,r20 + std Z+8,r12 + std Z+24,r13 + std Z+32,r14 + ldd r12,Z+9 + ldd r13,Z+25 + ldd r14,Z+33 + eor r21,r14 + eor r5,r12 + eor r14,r13 + mov r15,r12 + mov r0,r21 + com r0 + and r15,r0 + mov r24,r5 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r5 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r21 + mov r0,r14 + com r0 + and r17,r0 + eor r21,r24 + eor r12,r25 + eor r5,r16 + eor r13,r17 + eor r14,r15 + eor r12,r21 + eor r13,r5 + eor r21,r14 + com r5 + std Z+1,r21 + std Z+9,r12 + std Z+25,r13 + std Z+33,r14 + ldd r12,Z+10 + ldd r13,Z+26 + ldd r14,Z+34 + eor r22,r14 + eor r6,r12 + eor r14,r13 + mov r15,r12 + mov r0,r22 + com r0 + and r15,r0 + mov r24,r6 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r6 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r22 + mov r0,r14 + com r0 + and r17,r0 + eor r22,r24 + eor r12,r25 + eor r6,r16 + eor r13,r17 + eor r14,r15 + eor r12,r22 + eor r13,r6 + eor r22,r14 + com r6 + std Z+2,r22 + std Z+10,r12 + std Z+26,r13 + std Z+34,r14 + ldd r12,Z+11 + ldd r13,Z+27 + ldd r14,Z+35 + eor r23,r14 + eor r7,r12 + eor r14,r13 + mov r15,r12 + mov r0,r23 + com r0 + and r15,r0 + mov r24,r7 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r7 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r23 + mov r0,r14 + com r0 + and r17,r0 + eor r23,r24 + eor r12,r25 + eor r7,r16 + eor r13,r17 + eor r14,r15 + eor r12,r23 + eor r13,r7 + eor r23,r14 + com r7 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r14 + ldd r12,Z+12 + ldd r13,Z+28 + ldd r14,Z+36 + eor r26,r14 + eor r8,r12 + eor r14,r13 + mov r15,r12 + mov r0,r26 + com r0 + and r15,r0 + mov r24,r8 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r8 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r26 + mov r0,r14 + com r0 + and r17,r0 + eor r26,r24 + eor r12,r25 + eor r8,r16 + eor r13,r17 + eor r14,r15 + eor r12,r26 + eor r13,r8 + eor r26,r14 + com r8 + std Z+4,r26 + std Z+12,r12 + std Z+28,r13 + std Z+36,r14 + ldd r12,Z+13 + ldd r13,Z+29 + ldd r14,Z+37 + eor r27,r14 + eor r9,r12 + eor r14,r13 + mov r15,r12 + mov r0,r27 + com r0 + and r15,r0 + mov r24,r9 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r9 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r27 + mov r0,r14 + com r0 + and r17,r0 + eor r27,r24 + eor r12,r25 + eor r9,r16 + eor r13,r17 + eor r14,r15 + eor r12,r27 + eor r13,r9 + eor r27,r14 + com r9 + std Z+5,r27 + std Z+13,r12 + std Z+29,r13 + std Z+37,r14 + ldd r12,Z+14 + ldd r13,Z+30 + ldd r14,Z+38 + eor r2,r14 + eor r10,r12 + eor r14,r13 + mov r15,r12 + mov r0,r2 + com r0 + and r15,r0 + mov r24,r10 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r10 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r2 + mov r0,r14 + com r0 + and r17,r0 + eor r2,r24 + eor r12,r25 + eor r10,r16 + eor r13,r17 + eor r14,r15 + eor r12,r2 + eor r13,r10 + eor r2,r14 + com r10 + std Z+6,r2 + std Z+14,r12 + std Z+30,r13 + std Z+38,r14 + ldd r12,Z+15 + ldd r13,Z+31 + ldd r14,Z+39 + eor r3,r14 + eor r11,r12 + eor r14,r13 + mov r15,r12 + mov r0,r3 + com r0 + and r15,r0 + mov r24,r11 + mov r0,r12 + com r0 + and r24,r0 + mov r25,r13 + mov r0,r11 + com r0 + and r25,r0 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + mov r17,r3 + mov r0,r14 + com r0 + and r17,r0 + eor r3,r24 + eor r12,r25 + eor r11,r16 + eor r13,r17 + eor r14,r15 + eor r12,r3 + eor r13,r11 + eor r3,r14 + com r11 + std Z+7,r3 + std Z+15,r12 + std Z+31,r13 + std Z+39,r14 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + lsl r24 + rol r25 + rol r16 + rol r17 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + bst r12,0 + lsr r15 + ror r14 + ror r13 + ror r12 + bld r15,7 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r24 + eor r5,r25 + eor r6,r16 + eor r7,r17 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r20,Z+24 + ldd r21,Z+25 + ldd r22,Z+26 + ldd r23,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+24,r20 + std Z+25,r21 + std Z+26,r22 + std Z+27,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r2 + std Z+31,r3 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r22,Z+34 + ldd r23,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + or r23,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + std Z+32,r20 + std Z+33,r21 + std Z+34,r22 + std Z+35,r23 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r12,r20 + movw r14,r22 + movw r24,r26 + movw r16,r2 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r1 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r15,r0 + mov r0,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r0 + or r17,r0 + eor r24,r20 + eor r25,r21 + eor r16,r22 + eor r17,r23 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + mov r0,r20 + mov r20,r22 + mov r22,r0 + mov r0,r21 + mov r21,r23 + mov r23,r0 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + adc r20,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + ldd r12,Z+40 + ldd r13,Z+41 + ldd r14,Z+42 + ldd r15,Z+43 + eor r12,r20 + eor r13,r21 + eor r14,r22 + eor r15,r23 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + std Z+40,r12 + std Z+41,r13 + std Z+42,r14 + std Z+43,r15 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + ldd r0,Z+24 + eor r12,r0 + ldd r0,Z+25 + eor r13,r0 + ldd r0,Z+26 + eor r14,r0 + ldd r0,Z+27 + eor r15,r0 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + ldd r12,Z+48 + ldd r13,Z+49 + ldd r14,Z+50 + ldd r15,Z+51 + ldd r0,Z+8 + eor r12,r0 + ldd r0,Z+9 + eor r13,r0 + ldd r0,Z+10 + eor r14,r0 + ldd r0,Z+11 + eor r15,r0 + ldd r0,Z+28 + eor r12,r0 + ldd r0,Z+29 + eor r13,r0 + ldd r0,Z+30 + eor r14,r0 + ldd r0,Z+31 + eor r15,r0 + std Z+48,r12 + std Z+49,r13 + std Z+50,r14 + std Z+51,r15 + ldd r12,Z+52 + ldd r13,Z+53 + ldd r14,Z+54 + ldd r15,Z+55 + ldd r0,Z+12 + eor r12,r0 + ldd r0,Z+13 + eor r13,r0 + ldd r0,Z+14 + eor r14,r0 + ldd r0,Z+15 + eor r15,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + std Z+52,r12 + std Z+53,r13 + std Z+54,r14 + std Z+55,r15 + subi r18,15 + dec r19 + breq 5904f + rjmp 38b +5904: + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size drysponge128_g, .-drysponge128_g + + .text +.global gascon256_core_round + .type gascon256_core_round, @function +gascon256_core_round: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 26 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r26,Z+ + ld r27,Z+ + ld r2,Z+ + ld r3,Z+ + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + eor r4,r22 + ld r22,Z + ldd r23,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r23,r22 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r22 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r18 + eor r12,r23 + eor r13,r4 + eor r15,r14 + eor r18,r24 + com r4 + std Y+1,r18 + st Z,r22 + std Z+8,r23 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r22,Z+1 + ldd r23,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r23,r22 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r22 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r19 + eor r12,r23 + eor r13,r5 + eor r15,r14 + eor r19,r24 + com r5 + std Y+2,r19 + std Z+1,r22 + std Z+9,r23 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r22,Z+2 + ldd r23,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r23,r22 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r22 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r20 + eor r12,r23 + eor r13,r6 + eor r15,r14 + eor r20,r24 + com r6 + std Y+3,r20 + std Z+2,r22 + std Z+10,r23 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r22,Z+3 + ldd r23,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r23,r22 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r22 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r21 + eor r12,r23 + eor r13,r7 + eor r15,r14 + eor r21,r24 + com r7 + std Y+4,r21 + std Z+3,r22 + std Z+11,r23 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r22,Z+4 + ldd r23,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r26,r24 + eor r23,r22 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r22 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r26 + eor r12,r23 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+5,r26 + std Z+4,r22 + std Z+12,r23 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r22,Z+5 + ldd r23,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r27,r24 + eor r23,r22 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r22 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r27 + eor r12,r23 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+6,r27 + std Z+5,r22 + std Z+13,r23 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r22,Z+6 + ldd r23,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r2,r24 + eor r23,r22 + eor r10,r12 + eor r14,r13 + eor r24,r15 + mov r17,r2 + mov r25,r22 + mov r0,r2 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r10 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r10 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r2 + eor r12,r23 + eor r13,r10 + eor r15,r14 + eor r2,r24 + com r10 + std Y+7,r2 + std Z+6,r22 + std Z+14,r23 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r22,Z+7 + ldd r23,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r3,r24 + eor r23,r22 + eor r11,r12 + eor r14,r13 + eor r24,r15 + mov r17,r3 + mov r25,r22 + mov r0,r3 + com r0 + and r25,r0 + mov r16,r23 + mov r0,r22 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r12 + mov r0,r23 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r11 + mov r0,r12 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r13 + mov r0,r11 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r22,r3 + eor r12,r23 + eor r13,r11 + eor r15,r14 + eor r3,r24 + com r11 + std Y+8,r3 + std Z+7,r22 + std Z+15,r23 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + bst r22,0 + lsr r13 + ror r12 + ror r23 + ror r22 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r2 + std Z+23,r3 + movw r22,r4 + movw r12,r6 + movw r14,r8 + movw r24,r10 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r4 + eor r15,r5 + eor r24,r6 + eor r25,r7 + eor r22,r8 + eor r23,r9 + eor r12,r10 + eor r13,r11 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r1 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + eor r4,r14 + eor r5,r15 + eor r6,r24 + eor r7,r25 + eor r8,r22 + eor r9,r23 + eor r10,r12 + eor r11,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r12 + mov r12,r0 + mov r0,r23 + mov r23,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r26 + std Z+45,r27 + std Z+46,r2 + std Z+47,r3 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r26,Z+52 + ldd r27,Z+53 + ldd r2,Z+54 + ldd r3,Z+55 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r26 + std Z+53,r27 + std Z+54,r2 + std Z+55,r3 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r26,Z+60 + ldd r27,Z+61 + ldd r2,Z+62 + ldd r3,Z+63 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r13 + mov r13,r12 + mov r12,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + lsl r22 + rol r23 + rol r12 + rol r13 + adc r22,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r27 + ror r26 + ror r0 + or r3,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r26 + std Z+61,r27 + std Z+62,r2 + std Z+63,r3 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r2,Y+7 + ldd r3,Y+8 + movw r22,r18 + movw r12,r20 + movw r14,r26 + movw r24,r2 + mov r0,r22 + mov r22,r23 + mov r23,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + lsr r13 + ror r12 + ror r23 + ror r22 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r22,r26 + eor r23,r27 + eor r12,r2 + eor r13,r3 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r26 + mov r26,r2 + mov r2,r0 + mov r0,r27 + mov r27,r3 + mov r3,r0 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + adc r26,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r26,r22 + eor r27,r23 + eor r2,r12 + eor r3,r13 + std Z+24,r4 + std Z+25,r5 + std Z+26,r6 + std Z+27,r7 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + st -Z,r3 + st -Z,r2 + st -Z,r27 + st -Z,r26 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + adiw r28,8 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gascon256_core_round, .-gascon256_core_round + + .text +.global drysponge256_g + .type drysponge256_g, @function +drysponge256_g: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 44 + subi r30,148 + sbci r31,255 + ld r19,Z + subi r30,108 + sbc r31,r1 + ldi r18,240 + std Y+25,r19 + std Y+26,r18 + std Y+9,r1 + std Y+10,r1 + std Y+11,r1 + std Y+12,r1 + std Y+13,r1 + std Y+14,r1 + std Y+15,r1 + std Y+16,r1 + std Y+17,r1 + std Y+18,r1 + std Y+19,r1 + std Y+20,r1 + std Y+21,r1 + std Y+22,r1 + std Y+23,r1 + std Y+24,r1 + ld r18,Z+ + ld r19,Z+ + ld r20,Z+ + ld r21,Z+ + ld r22,Z+ + ld r23,Z+ + ld r26,Z+ + ld r27,Z+ + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 +40: + ldd r24,Y+26 + eor r2,r24 + subi r24,15 + std Y+26,r24 + ld r10,Z + ldd r11,Z+8 + ldd r12,Z+16 + ldd r13,Z+32 + ldd r14,Z+40 + ldd r15,Z+48 + ldd r24,Z+56 + eor r18,r24 + eor r11,r10 + eor r2,r12 + eor r14,r13 + eor r24,r15 + mov r17,r18 + mov r25,r10 + mov r0,r18 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r18,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r2 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r2 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r2,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r18 + eor r12,r11 + eor r13,r2 + eor r15,r14 + eor r18,r24 + com r2 + std Y+1,r18 + st Z,r10 + std Z+8,r11 + std Z+16,r12 + std Z+32,r13 + std Z+40,r14 + std Z+48,r15 + std Z+56,r24 + ldd r10,Z+1 + ldd r11,Z+9 + ldd r12,Z+17 + ldd r13,Z+33 + ldd r14,Z+41 + ldd r15,Z+49 + ldd r24,Z+57 + eor r19,r24 + eor r11,r10 + eor r3,r12 + eor r14,r13 + eor r24,r15 + mov r17,r19 + mov r25,r10 + mov r0,r19 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r19,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r3 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r3 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r3,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r19 + eor r12,r11 + eor r13,r3 + eor r15,r14 + eor r19,r24 + com r3 + std Y+2,r19 + std Z+1,r10 + std Z+9,r11 + std Z+17,r12 + std Z+33,r13 + std Z+41,r14 + std Z+49,r15 + std Z+57,r24 + ldd r10,Z+2 + ldd r11,Z+10 + ldd r12,Z+18 + ldd r13,Z+34 + ldd r14,Z+42 + ldd r15,Z+50 + ldd r24,Z+58 + eor r20,r24 + eor r11,r10 + eor r4,r12 + eor r14,r13 + eor r24,r15 + mov r17,r20 + mov r25,r10 + mov r0,r20 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r20,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r4 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r4 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r4,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r20 + eor r12,r11 + eor r13,r4 + eor r15,r14 + eor r20,r24 + com r4 + std Y+3,r20 + std Z+2,r10 + std Z+10,r11 + std Z+18,r12 + std Z+34,r13 + std Z+42,r14 + std Z+50,r15 + std Z+58,r24 + ldd r10,Z+3 + ldd r11,Z+11 + ldd r12,Z+19 + ldd r13,Z+35 + ldd r14,Z+43 + ldd r15,Z+51 + ldd r24,Z+59 + eor r21,r24 + eor r11,r10 + eor r5,r12 + eor r14,r13 + eor r24,r15 + mov r17,r21 + mov r25,r10 + mov r0,r21 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r21,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r5 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r5 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r5,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r21 + eor r12,r11 + eor r13,r5 + eor r15,r14 + eor r21,r24 + com r5 + std Y+4,r21 + std Z+3,r10 + std Z+11,r11 + std Z+19,r12 + std Z+35,r13 + std Z+43,r14 + std Z+51,r15 + std Z+59,r24 + ldd r10,Z+4 + ldd r11,Z+12 + ldd r12,Z+20 + ldd r13,Z+36 + ldd r14,Z+44 + ldd r15,Z+52 + ldd r24,Z+60 + eor r22,r24 + eor r11,r10 + eor r6,r12 + eor r14,r13 + eor r24,r15 + mov r17,r22 + mov r25,r10 + mov r0,r22 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r22,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r6 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r6 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r6,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r22 + eor r12,r11 + eor r13,r6 + eor r15,r14 + eor r22,r24 + com r6 + std Y+5,r22 + std Z+4,r10 + std Z+12,r11 + std Z+20,r12 + std Z+36,r13 + std Z+44,r14 + std Z+52,r15 + std Z+60,r24 + ldd r10,Z+5 + ldd r11,Z+13 + ldd r12,Z+21 + ldd r13,Z+37 + ldd r14,Z+45 + ldd r15,Z+53 + ldd r24,Z+61 + eor r23,r24 + eor r11,r10 + eor r7,r12 + eor r14,r13 + eor r24,r15 + mov r17,r23 + mov r25,r10 + mov r0,r23 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r23,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r7 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r7 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r7,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r23 + eor r12,r11 + eor r13,r7 + eor r15,r14 + eor r23,r24 + com r7 + std Y+6,r23 + std Z+5,r10 + std Z+13,r11 + std Z+21,r12 + std Z+37,r13 + std Z+45,r14 + std Z+53,r15 + std Z+61,r24 + ldd r10,Z+6 + ldd r11,Z+14 + ldd r12,Z+22 + ldd r13,Z+38 + ldd r14,Z+46 + ldd r15,Z+54 + ldd r24,Z+62 + eor r26,r24 + eor r11,r10 + eor r8,r12 + eor r14,r13 + eor r24,r15 + mov r17,r26 + mov r25,r10 + mov r0,r26 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r26,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r8 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r8 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r8,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r26 + eor r12,r11 + eor r13,r8 + eor r15,r14 + eor r26,r24 + com r8 + std Y+7,r26 + std Z+6,r10 + std Z+14,r11 + std Z+22,r12 + std Z+38,r13 + std Z+46,r14 + std Z+54,r15 + std Z+62,r24 + ldd r10,Z+7 + ldd r11,Z+15 + ldd r12,Z+23 + ldd r13,Z+39 + ldd r14,Z+47 + ldd r15,Z+55 + ldd r24,Z+63 + eor r27,r24 + eor r11,r10 + eor r9,r12 + eor r14,r13 + eor r24,r15 + mov r17,r27 + mov r25,r10 + mov r0,r27 + com r0 + and r25,r0 + mov r16,r11 + mov r0,r10 + com r0 + and r16,r0 + eor r27,r16 + mov r16,r12 + mov r0,r11 + com r0 + and r16,r0 + eor r10,r16 + mov r16,r9 + mov r0,r12 + com r0 + and r16,r0 + eor r11,r16 + mov r16,r13 + mov r0,r9 + com r0 + and r16,r0 + eor r12,r16 + mov r16,r14 + mov r0,r13 + com r0 + and r16,r0 + eor r9,r16 + mov r16,r15 + mov r0,r14 + com r0 + and r16,r0 + eor r13,r16 + mov r16,r24 + mov r0,r15 + com r0 + and r16,r0 + eor r14,r16 + mov r0,r24 + com r0 + and r17,r0 + eor r15,r17 + eor r24,r25 + eor r10,r27 + eor r12,r11 + eor r13,r9 + eor r15,r14 + eor r27,r24 + com r9 + std Y+8,r27 + std Z+7,r10 + std Z+15,r11 + std Z+23,r12 + std Z+39,r13 + std Z+47,r14 + std Z+55,r15 + std Z+63,r24 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + bst r10,0 + lsr r13 + ror r12 + ror r11 + ror r10 + bld r13,7 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r23 + mov r23,r26 + mov r26,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r22 + std Z+21,r23 + std Z+22,r26 + std Z+23,r27 + movw r10,r2 + movw r12,r4 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + mov r0,r2 + mov r2,r4 + mov r4,r0 + mov r0,r3 + mov r3,r5 + mov r5,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + lsr r5 + ror r4 + ror r3 + ror r2 + ror r0 + or r5,r0 + mov r0,r6 + mov r6,r8 + mov r8,r0 + mov r0,r7 + mov r7,r9 + mov r9,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r6,r10 + eor r7,r11 + eor r8,r12 + eor r9,r13 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r26,Z+38 + ldd r27,Z+39 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r12 + mov r12,r0 + mov r0,r11 + mov r11,r13 + mov r13,r0 + mov r0,r14 + mov r14,r24 + mov r24,r0 + mov r0,r15 + mov r15,r25 + mov r25,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + std Z+36,r22 + std Z+37,r23 + std Z+38,r26 + std Z+39,r27 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r22,Z+44 + ldd r23,Z+45 + ldd r26,Z+46 + ldd r27,Z+47 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+40,r18 + std Z+41,r19 + std Z+42,r20 + std Z+43,r21 + std Z+44,r22 + std Z+45,r23 + std Z+46,r26 + std Z+47,r27 + ldd r18,Z+48 + ldd r19,Z+49 + ldd r20,Z+50 + ldd r21,Z+51 + ldd r22,Z+52 + ldd r23,Z+53 + ldd r26,Z+54 + ldd r27,Z+55 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+48,r18 + std Z+49,r19 + std Z+50,r20 + std Z+51,r21 + std Z+52,r22 + std Z+53,r23 + std Z+54,r26 + std Z+55,r27 + ldd r18,Z+56 + ldd r19,Z+57 + ldd r20,Z+58 + ldd r21,Z+59 + ldd r22,Z+60 + ldd r23,Z+61 + ldd r26,Z+62 + ldd r27,Z+63 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + lsl r10 + rol r11 + rol r12 + rol r13 + adc r10,r1 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r21,r0 + mov r0,r27 + mov r27,r26 + mov r26,r23 + mov r23,r22 + mov r22,r0 + mov r0,r1 + lsr r27 + ror r26 + ror r23 + ror r22 + ror r0 + or r27,r0 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + std Z+56,r18 + std Z+57,r19 + std Z+58,r20 + std Z+59,r21 + std Z+60,r22 + std Z+61,r23 + std Z+62,r26 + std Z+63,r27 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + movw r10,r18 + movw r12,r20 + movw r14,r22 + movw r24,r26 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r14,r18 + eor r15,r19 + eor r24,r20 + eor r25,r21 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + mov r0,r22 + mov r22,r26 + mov r26,r0 + mov r0,r23 + mov r23,r27 + mov r27,r0 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + lsl r22 + rol r23 + rol r26 + rol r27 + adc r22,r1 + eor r18,r14 + eor r19,r15 + eor r20,r24 + eor r21,r25 + eor r22,r10 + eor r23,r11 + eor r26,r12 + eor r27,r13 + ldd r10,Y+9 + ldd r11,Y+10 + ldd r12,Y+11 + ldd r13,Y+12 + eor r10,r18 + eor r11,r19 + eor r12,r20 + eor r13,r21 + ldd r0,Z+12 + eor r10,r0 + ldd r0,Z+13 + eor r11,r0 + ldd r0,Z+14 + eor r12,r0 + ldd r0,Z+15 + eor r13,r0 + ldd r0,Z+32 + eor r10,r0 + ldd r0,Z+33 + eor r11,r0 + ldd r0,Z+34 + eor r12,r0 + ldd r0,Z+35 + eor r13,r0 + ldd r0,Z+52 + eor r10,r0 + ldd r0,Z+53 + eor r11,r0 + ldd r0,Z+54 + eor r12,r0 + ldd r0,Z+55 + eor r13,r0 + std Y+9,r10 + std Y+10,r11 + std Y+11,r12 + std Y+12,r13 + ldd r10,Y+13 + ldd r11,Y+14 + ldd r12,Y+15 + ldd r13,Y+16 + eor r10,r22 + eor r11,r23 + eor r12,r26 + eor r13,r27 + ldd r0,Z+16 + eor r10,r0 + ldd r0,Z+17 + eor r11,r0 + ldd r0,Z+18 + eor r12,r0 + ldd r0,Z+19 + eor r13,r0 + ldd r0,Z+36 + eor r10,r0 + ldd r0,Z+37 + eor r11,r0 + ldd r0,Z+38 + eor r12,r0 + ldd r0,Z+39 + eor r13,r0 + ldd r0,Z+40 + eor r10,r0 + ldd r0,Z+41 + eor r11,r0 + ldd r0,Z+42 + eor r12,r0 + ldd r0,Z+43 + eor r13,r0 + std Y+13,r10 + std Y+14,r11 + std Y+15,r12 + std Y+16,r13 + ldd r10,Y+17 + ldd r11,Y+18 + ldd r12,Y+19 + ldd r13,Y+20 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + ld r0,Z + eor r10,r0 + ldd r0,Z+1 + eor r11,r0 + ldd r0,Z+2 + eor r12,r0 + ldd r0,Z+3 + eor r13,r0 + ldd r0,Z+20 + eor r10,r0 + ldd r0,Z+21 + eor r11,r0 + ldd r0,Z+22 + eor r12,r0 + ldd r0,Z+23 + eor r13,r0 + ldd r0,Z+44 + eor r10,r0 + ldd r0,Z+45 + eor r11,r0 + ldd r0,Z+46 + eor r12,r0 + ldd r0,Z+47 + eor r13,r0 + std Y+17,r10 + std Y+18,r11 + std Y+19,r12 + std Y+20,r13 + ldd r10,Y+21 + ldd r11,Y+22 + ldd r12,Y+23 + ldd r13,Y+24 + eor r10,r6 + eor r11,r7 + eor r12,r8 + eor r13,r9 + ldd r0,Z+4 + eor r10,r0 + ldd r0,Z+5 + eor r11,r0 + ldd r0,Z+6 + eor r12,r0 + ldd r0,Z+7 + eor r13,r0 + ldd r0,Z+8 + eor r10,r0 + ldd r0,Z+9 + eor r11,r0 + ldd r0,Z+10 + eor r12,r0 + ldd r0,Z+11 + eor r13,r0 + ldd r0,Z+48 + eor r10,r0 + ldd r0,Z+49 + eor r11,r0 + ldd r0,Z+50 + eor r12,r0 + ldd r0,Z+51 + eor r13,r0 + std Y+21,r10 + std Y+22,r11 + std Y+23,r12 + std Y+24,r13 + ldd r10,Y+25 + dec r10 + std Y+25,r10 + breq 6623f + rjmp 40b +6623: + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + st -Z,r27 + st -Z,r26 + st -Z,r23 + st -Z,r22 + st -Z,r21 + st -Z,r20 + st -Z,r19 + st -Z,r18 + ldi r25,72 + add r30,r25 + adc r31,r1 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + ldd r2,Y+17 + ldd r3,Y+18 + ldd r4,Y+19 + ldd r5,Y+20 + ldd r6,Y+21 + ldd r7,Y+22 + ldd r8,Y+23 + ldd r9,Y+24 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + adiw r28,26 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size drysponge256_g, .-drysponge256_g + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.c b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.c new file mode 100644 index 0000000..6dfe48c --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.c @@ -0,0 +1,611 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-drysponge.h" +#include + +#if !defined(__AVR__) + +/* Right rotations in bit-interleaved format */ +#define intRightRotateEven(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, (bits)); \ + _x1 = rightRotate(_x1, (bits)); \ + _x0 | (((uint64_t)_x1) << 32); \ + })) +#define intRightRotateOdd(x,bits) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate(_x0, ((bits) + 1) % 32); \ + _x1 = rightRotate(_x1, (bits)); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate1_64(x) \ + (__extension__ ({ \ + uint32_t _x0 = (uint32_t)(x); \ + uint32_t _x1 = (uint32_t)((x) >> 32); \ + _x0 = rightRotate1(_x0); \ + _x1 | (((uint64_t)_x0) << 32); \ + })) +#define intRightRotate2_64(x) (intRightRotateEven((x), 1)) +#define intRightRotate3_64(x) (intRightRotateOdd((x), 1)) +#define intRightRotate4_64(x) (intRightRotateEven((x), 2)) +#define intRightRotate5_64(x) (intRightRotateOdd((x), 2)) +#define intRightRotate6_64(x) (intRightRotateEven((x), 3)) +#define intRightRotate7_64(x) (intRightRotateOdd((x), 3)) +#define intRightRotate8_64(x) (intRightRotateEven((x), 4)) +#define intRightRotate9_64(x) (intRightRotateOdd((x), 4)) +#define intRightRotate10_64(x) (intRightRotateEven((x), 5)) +#define intRightRotate11_64(x) (intRightRotateOdd((x), 5)) +#define intRightRotate12_64(x) (intRightRotateEven((x), 6)) +#define intRightRotate13_64(x) (intRightRotateOdd((x), 6)) +#define intRightRotate14_64(x) (intRightRotateEven((x), 7)) +#define intRightRotate15_64(x) (intRightRotateOdd((x), 7)) +#define intRightRotate16_64(x) (intRightRotateEven((x), 8)) +#define intRightRotate17_64(x) (intRightRotateOdd((x), 8)) +#define intRightRotate18_64(x) (intRightRotateEven((x), 9)) +#define intRightRotate19_64(x) (intRightRotateOdd((x), 9)) +#define intRightRotate20_64(x) (intRightRotateEven((x), 10)) +#define intRightRotate21_64(x) (intRightRotateOdd((x), 10)) +#define intRightRotate22_64(x) (intRightRotateEven((x), 11)) +#define intRightRotate23_64(x) (intRightRotateOdd((x), 11)) +#define intRightRotate24_64(x) (intRightRotateEven((x), 12)) +#define intRightRotate25_64(x) (intRightRotateOdd((x), 12)) +#define intRightRotate26_64(x) (intRightRotateEven((x), 13)) +#define intRightRotate27_64(x) (intRightRotateOdd((x), 13)) +#define intRightRotate28_64(x) (intRightRotateEven((x), 14)) +#define intRightRotate29_64(x) (intRightRotateOdd((x), 14)) +#define intRightRotate30_64(x) (intRightRotateEven((x), 15)) +#define intRightRotate31_64(x) (intRightRotateOdd((x), 15)) +#define intRightRotate32_64(x) (intRightRotateEven((x), 16)) +#define intRightRotate33_64(x) (intRightRotateOdd((x), 16)) +#define intRightRotate34_64(x) (intRightRotateEven((x), 17)) +#define intRightRotate35_64(x) (intRightRotateOdd((x), 17)) +#define intRightRotate36_64(x) (intRightRotateEven((x), 18)) +#define intRightRotate37_64(x) (intRightRotateOdd((x), 18)) +#define intRightRotate38_64(x) (intRightRotateEven((x), 19)) +#define intRightRotate39_64(x) (intRightRotateOdd((x), 19)) +#define intRightRotate40_64(x) (intRightRotateEven((x), 20)) +#define intRightRotate41_64(x) (intRightRotateOdd((x), 20)) +#define intRightRotate42_64(x) (intRightRotateEven((x), 21)) +#define intRightRotate43_64(x) (intRightRotateOdd((x), 21)) +#define intRightRotate44_64(x) (intRightRotateEven((x), 22)) +#define intRightRotate45_64(x) (intRightRotateOdd((x), 22)) +#define intRightRotate46_64(x) (intRightRotateEven((x), 23)) +#define intRightRotate47_64(x) (intRightRotateOdd((x), 23)) +#define intRightRotate48_64(x) (intRightRotateEven((x), 24)) +#define intRightRotate49_64(x) (intRightRotateOdd((x), 24)) +#define intRightRotate50_64(x) (intRightRotateEven((x), 25)) +#define intRightRotate51_64(x) (intRightRotateOdd((x), 25)) +#define intRightRotate52_64(x) (intRightRotateEven((x), 26)) +#define intRightRotate53_64(x) (intRightRotateOdd((x), 26)) +#define intRightRotate54_64(x) (intRightRotateEven((x), 27)) +#define intRightRotate55_64(x) (intRightRotateOdd((x), 27)) +#define intRightRotate56_64(x) (intRightRotateEven((x), 28)) +#define intRightRotate57_64(x) (intRightRotateOdd((x), 28)) +#define intRightRotate58_64(x) (intRightRotateEven((x), 29)) +#define intRightRotate59_64(x) (intRightRotateOdd((x), 29)) +#define intRightRotate60_64(x) (intRightRotateEven((x), 30)) +#define intRightRotate61_64(x) (intRightRotateOdd((x), 30)) +#define intRightRotate62_64(x) (intRightRotateEven((x), 31)) +#define intRightRotate63_64(x) (intRightRotateOdd((x), 31)) + +void gascon128_core_round(gascon128_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); +#endif + + /* Add the round constant to the middle of the state */ + x2 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x4; x2 ^= x1; x4 ^= x3; t0 = (~x0) & x1; t1 = (~x1) & x2; + t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x0; x0 ^= t1; + x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; x1 ^= x0; x3 ^= x2; + x0 ^= x4; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); +#endif +} + +void gascon256_core_round(gascon256_state_t *state, uint8_t round) +{ + uint64_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + + /* Load the state into local varaibles */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; + uint64_t x8 = state->S[8]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); + uint64_t x8 = le_load_word64(state->B + 64); +#endif + + /* Add the round constant to the middle of the state */ + x4 ^= ((0x0F - round) << 4) | round; + + /* Substitution layer */ + x0 ^= x8; x2 ^= x1; x4 ^= x3; x6 ^= x5; x8 ^= x7; t0 = (~x0) & x1; + t1 = (~x1) & x2; t2 = (~x2) & x3; t3 = (~x3) & x4; t4 = (~x4) & x5; + t5 = (~x5) & x6; t6 = (~x6) & x7; t7 = (~x7) & x8; t8 = (~x8) & x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t5; x5 ^= t6; x6 ^= t7; + x7 ^= t8; x8 ^= t0; x1 ^= x0; x3 ^= x2; x5 ^= x4; x7 ^= x6; x0 ^= x8; + x4 = ~x4; + + /* Linear diffusion layer */ + x0 ^= intRightRotate19_64(x0) ^ intRightRotate28_64(x0); + x1 ^= intRightRotate61_64(x1) ^ intRightRotate38_64(x1); + x2 ^= intRightRotate1_64(x2) ^ intRightRotate6_64(x2); + x3 ^= intRightRotate10_64(x3) ^ intRightRotate17_64(x3); + x4 ^= intRightRotate7_64(x4) ^ intRightRotate40_64(x4); + x5 ^= intRightRotate31_64(x5) ^ intRightRotate26_64(x5); + x6 ^= intRightRotate53_64(x6) ^ intRightRotate58_64(x6); + x7 ^= intRightRotate9_64(x7) ^ intRightRotate46_64(x7); + x8 ^= intRightRotate43_64(x8) ^ intRightRotate50_64(x8); + + /* Write the local variables back to the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; + state->S[8] = x8; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); + le_store_word64(state->B + 64, x8); +#endif +} + +void drysponge128_g(drysponge128_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes */ + gascon128_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon128_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4]; + } +} + +void drysponge256_g(drysponge256_state_t *state) +{ + unsigned round; + + /* Perform the first round. For each round we XOR the 16 bytes of + * the output data with the first 16 bytes of the state. And then + * XOR with the next 16 bytes of the state, rotated by 4 bytes. + * And so on for a total of 64 bytes XOR'ed into the output data. */ + gascon256_core_round(&(state->c), 0); + state->r.W[0] = state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] = state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] = state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] = state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + + /* Perform the rest of the rounds */ + for (round = 1; round < state->rounds; ++round) { + gascon256_core_round(&(state->c), round); + state->r.W[0] ^= state->c.W[0] ^ state->c.W[5] ^ + state->c.W[10] ^ state->c.W[15]; + state->r.W[1] ^= state->c.W[1] ^ state->c.W[6] ^ + state->c.W[11] ^ state->c.W[12]; + state->r.W[2] ^= state->c.W[2] ^ state->c.W[7] ^ + state->c.W[8] ^ state->c.W[13]; + state->r.W[3] ^= state->c.W[3] ^ state->c.W[4] ^ + state->c.W[9] ^ state->c.W[14]; + } +} + +#endif /* !__AVR__ */ + +void drysponge128_g_core(drysponge128_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon128_core_round(&(state->c), round); +} + +void drysponge256_g_core(drysponge256_state_t *state) +{ + unsigned round; + for (round = 0; round < state->rounds; ++round) + gascon256_core_round(&(state->c), round); +} + +/** + * \fn uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) + * \brief Selects an element of x in constant time. + * + * \param x Points to the four elements of x. + * \param index Index of which element to extract between 0 and 3. + * + * \return The selected element of x. + */ +#if !defined(__AVR__) +STATIC_INLINE uint32_t drysponge_select_x(const uint32_t x[4], uint8_t index) +{ + /* We need to be careful how we select each element of x because + * we are doing a data-dependent fetch here. Do the fetch in a way + * that should avoid cache timing issues by fetching every element + * of x and masking away the ones we don't want. + * + * There is a possible side channel here with respect to power analysis. + * The "mask" value will be all-ones for the selected index and all-zeroes + * for the other indexes. This may show up as different power consumption + * for the "result ^= x[i] & mask" statement when i is the selected index. + * Such a side channel could in theory allow reading the plaintext input + * to the cipher by analysing the CPU's power consumption. + * + * The DryGASCON specification acknowledges the possibility of plaintext + * recovery in section 7.4. For software mitigation the specification + * suggests randomization of the indexes into c and x and randomization + * of the order of processing words. We aren't doing that here yet. + * Patches welcome to fix this. + */ + uint32_t mask = -((uint32_t)((0x04 - index) >> 2)); + uint32_t result = x[0] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x01)) >> 2)); + result ^= x[1] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x02)) >> 2)); + result ^= x[2] & mask; + mask = -((uint32_t)((0x04 - (index ^ 0x03)) >> 2)); + return result ^ (x[3] & mask); +} +#else +/* AVR is more or less immune to cache timing issues because it doesn't + * have anything like an L1 or L2 cache. Select the word directly */ +#define drysponge_select_x(x, index) ((x)[(index)]) +#endif + +/** + * \brief Mixes a 32-bit value into the DrySPONGE128 state. + * + * \param state DrySPONGE128 state. + * \param data The data to be mixed in the bottom 10 bits. + */ +static void drysponge128_mix_phase_round + (drysponge128_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); +} + +/** + * \brief Mixes a 32-bit value into the DrySPONGE256 state. + * + * \param state DrySPONGE256 state. + * \param data The data to be mixed in the bottom 18 bits. + */ +static void drysponge256_mix_phase_round + (drysponge256_state_t *state, uint32_t data) +{ + /* Mix in elements from x according to the 2-bit indexes in the data */ + state->c.W[0] ^= drysponge_select_x(state->x.W, data & 0x03); + state->c.W[2] ^= drysponge_select_x(state->x.W, (data >> 2) & 0x03); + state->c.W[4] ^= drysponge_select_x(state->x.W, (data >> 4) & 0x03); + state->c.W[6] ^= drysponge_select_x(state->x.W, (data >> 6) & 0x03); + state->c.W[8] ^= drysponge_select_x(state->x.W, (data >> 8) & 0x03); + state->c.W[10] ^= drysponge_select_x(state->x.W, (data >> 10) & 0x03); + state->c.W[12] ^= drysponge_select_x(state->x.W, (data >> 12) & 0x03); + state->c.W[14] ^= drysponge_select_x(state->x.W, (data >> 14) & 0x03); + state->c.W[16] ^= drysponge_select_x(state->x.W, (data >> 16) & 0x03); +} + +/** + * \brief Mixes an input block into a DrySPONGE128 state. + * + * \param state The DrySPONGE128 state. + * \param data Full rate block containing the input data. + */ +static void drysponge128_mix_phase + (drysponge128_state_t *state, const unsigned char data[DRYSPONGE128_RATE]) +{ + /* Mix 10-bit groups into the output, with the domain + * separator added to the last two groups */ + drysponge128_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[1] >> 2) | (((uint32_t)(data[2])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[2] >> 4) | (((uint32_t)(data[3])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[3] >> 6) | (((uint32_t)(data[4])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[5] | (((uint32_t)(data[6])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[6] >> 2) | (((uint32_t)(data[7])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[7] >> 4) | (((uint32_t)(data[8])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[8] >> 6) | (((uint32_t)(data[9])) << 2)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, data[10] | (((uint32_t)(data[11])) << 8)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, (data[12] >> 4) | (((uint32_t)(data[13])) << 4)); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round + (state, ((data[13] >> 6) | (((uint32_t)(data[14])) << 2))); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, data[15] ^ state->domain); + gascon128_core_round(&(state->c), 0); + drysponge128_mix_phase_round(state, state->domain >> 10); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +/** + * \brief Mixes an input block into a DrySPONGE256 state. + * + * \param state The DrySPONGE256 state. + * \param data Full rate block containing the input data. + */ +static void drysponge256_mix_phase + (drysponge256_state_t *state, const unsigned char data[DRYSPONGE256_RATE]) +{ + /* Mix 18-bit groups into the output, with the domain in the last group */ + drysponge256_mix_phase_round + (state, data[0] | (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[2] >> 2) | (((uint32_t)(data[3])) << 6) | + (((uint32_t)(data[4])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[4] >> 4) | (((uint32_t)(data[5])) << 4) | + (((uint32_t)(data[6])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[6] >> 6) | (((uint32_t)(data[7])) << 2) | + (((uint32_t)(data[8])) << 10)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, data[9] | (((uint32_t)(data[10])) << 8) | + (((uint32_t)(data[11])) << 16)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[11] >> 2) | (((uint32_t)(data[12])) << 6) | + (((uint32_t)(data[13])) << 14)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[13] >> 4) | (((uint32_t)(data[14])) << 4) | + (((uint32_t)(data[15])) << 12)); + gascon256_core_round(&(state->c), 0); + drysponge256_mix_phase_round + (state, (data[15] >> 6) ^ state->domain); + + /* Revert to the default domain separator for the next block */ + state->domain = 0; +} + +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE128_RATE) { + drysponge128_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE128_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE128_RATE - len - 1); + drysponge128_mix_phase(state, padded); + } +} + +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len) +{ + if (len >= DRYSPONGE256_RATE) { + drysponge256_mix_phase(state, input); + } else { + unsigned char padded[DRYSPONGE256_RATE]; + memcpy(padded, input, len); + padded[len] = 0x01; + memset(padded + len + 1, 0, DRYSPONGE256_RATE - len - 1); + drysponge256_mix_phase(state, padded); + } +} + +/** + * \brief Determine if some of the words of an "x" value are identical. + * + * \param x Points to the "x" buffer to check. + * + * \return Non-zero if some of the words are the same, zero if they are + * distinct from each other. + * + * We try to perform the check in constant time to avoid giving away + * any information about the value of the key. + */ +static int drysponge_x_words_are_same(const uint32_t x[4]) +{ + unsigned i, j; + int result = 0; + for (i = 0; i < 3; ++i) { + for (j = i + 1; j < 4; ++j) { + uint32_t check = x[i] ^ x[j]; + result |= (int)((0x100000000ULL - check) >> 32); + } + } + return result; +} + +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-128 state with repeated copies of the key */ + memcpy(state->c.B, key, 16); + memcpy(state->c.B + 16, key, 16); + memcpy(state->c.B + 32, key, 8); + + /* Generate the "x" value for the state. All four words of "x" + * must be unique because they will be used in drysponge_select_x() + * as stand-ins for the bit pairs 00, 01, 10, and 11. + * + * Run the core block operation over and over until "x" is unique. + * Technically the runtime here is key-dependent and not constant. + * If the input key is randomized, this should only take 1 round + * on average so it is "almost constant time". + */ + do { + gascon128_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE128_INIT_ROUNDS; + state->domain = DRYDOMAIN128_NONCE; + if (final_block) + state->domain |= DRYDOMAIN128_FINAL; + drysponge128_f_absorb(state, nonce, 16); + drysponge128_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE128_ROUNDS; +} + +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block) +{ + /* Fill the GASCON-256 state with repeated copies of the key */ + memcpy(state->c.B, key, 32); + memcpy(state->c.B + 32, key, 32); + memcpy(state->c.B + 64, key, 8); + + /* Generate the "x" value for the state */ + do { + gascon256_core_round(&(state->c), 0); + } while (drysponge_x_words_are_same(state->c.W)); + memcpy(state->x.W, state->c.W, sizeof(state->x)); + + /* Replace the generated "x" value in the state with the key prefix */ + memcpy(state->c.W, key, sizeof(state->x)); + + /* Absorb the nonce into the state with an increased number of rounds */ + state->rounds = DRYSPONGE256_INIT_ROUNDS; + state->domain = DRYDOMAIN256_NONCE; + if (final_block) + state->domain |= DRYDOMAIN256_FINAL; + drysponge256_f_absorb(state, nonce, 16); + drysponge256_g(state); + + /* Set up the normal number of rounds for future operations */ + state->rounds = DRYSPONGE256_ROUNDS; +} diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.h b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.h new file mode 100644 index 0000000..05b0c16 --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-drysponge.h @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_DRYSPONGE_H +#define LW_INTERNAL_DRYSPONGE_H + +#include "internal-util.h" + +/** + * \file internal-drysponge.h + * \brief Internal implementation of DrySPONGE for the DryGASCON cipher. + * + * References: https://github.com/sebastien-riou/DryGASCON + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the GASCON-128 permutation state in bytes. + */ +#define GASCON128_STATE_SIZE 40 + +/** + * \brief Size of the GASCON-256 permutation state in bytes. + */ +#define GASCON256_STATE_SIZE 72 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE128. + */ +#define DRYSPONGE128_RATE 16 + +/** + * \brief Rate of absorption and squeezing for DrySPONGE256. + */ +#define DRYSPONGE256_RATE 16 + +/** + * \brief Size of the "x" value for DrySPONGE128. + */ +#define DRYSPONGE128_XSIZE 16 + +/** + * \brief Size of the "x" value for DrySPONGE256. + */ +#define DRYSPONGE256_XSIZE 16 + +/** + * \brief Normal number of rounds for DrySPONGE128 when absorbing + * and squeezing data. + */ +#define DRYSPONGE128_ROUNDS 7 + +/** + * \brief Number of rounds for DrySPONGE128 during initialization. + */ +#define DRYSPONGE128_INIT_ROUNDS 11 + +/** + * \brief Normal number of rounds for DrySPONGE256 when absorbing + * and squeezing data. + */ +#define DRYSPONGE256_ROUNDS 8 + +/** + * \brief Number of rounds for DrySPONGE256 during initialization. + */ +#define DRYSPONGE256_INIT_ROUNDS 12 + +/** + * \brief DrySPONGE128 domain bit for a padded block. + */ +#define DRYDOMAIN128_PADDED (1 << 8) + +/** + * \brief DrySPONGE128 domain bit for a final block. + */ +#define DRYDOMAIN128_FINAL (1 << 9) + +/** + * \brief DrySPONGE128 domain value for processing the nonce. + */ +#define DRYDOMAIN128_NONCE (1 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the associated data. + */ +#define DRYDOMAIN128_ASSOC_DATA (2 << 10) + +/** + * \brief DrySPONGE128 domain value for processing the message. + */ +#define DRYDOMAIN128_MESSAGE (3 << 10) + +/** + * \brief DrySPONGE256 domain bit for a padded block. + */ +#define DRYDOMAIN256_PADDED (1 << 2) + +/** + * \brief DrySPONGE256 domain bit for a final block. + */ +#define DRYDOMAIN256_FINAL (1 << 3) + +/** + * \brief DrySPONGE256 domain value for processing the nonce. + */ +#define DRYDOMAIN256_NONCE (1 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the associated data. + */ +#define DRYDOMAIN256_ASSOC_DATA (2 << 4) + +/** + * \brief DrySPONGE256 domain value for processing the message. + */ +#define DRYDOMAIN256_MESSAGE (3 << 4) + +/** + * \brief Internal state of the GASCON-128 permutation. + */ +typedef union +{ + uint64_t S[GASCON128_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON128_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON128_STATE_SIZE]; /**< Bytes of the state */ + +} gascon128_state_t; + +/** + * \brief Internal state of the GASCON-256 permutation. + */ +typedef union +{ + uint64_t S[GASCON256_STATE_SIZE / 8]; /**< 64-bit words of the state */ + uint32_t W[GASCON256_STATE_SIZE / 4]; /**< 32-bit words of the state */ + uint8_t B[GASCON256_STATE_SIZE]; /**< Bytes of the state */ + +} gascon256_state_t; + +/** + * \brief Structure of a rate block for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_RATE]; /**< Bytes of the rate */ + +} drysponge128_rate_t; + +/** + * \brief Structure of a rate block for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_RATE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_RATE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_RATE]; /**< Bytes of the rate */ + +} drysponge256_rate_t; + +/** + * \brief Structure of the "x" value for DrySPONGE128. + */ +typedef union +{ + uint64_t S[DRYSPONGE128_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE128_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE128_XSIZE]; /**< Bytes of the rate */ + +} drysponge128_x_t; + +/** + * \brief Structure of the "x" value for DrySPONGE256. + */ +typedef union +{ + uint64_t S[DRYSPONGE256_XSIZE / 8]; /**< 64-bit words of the rate */ + uint32_t W[DRYSPONGE256_XSIZE / 4]; /**< 32-bit words of the rate */ + uint8_t B[DRYSPONGE256_XSIZE]; /**< Bytes of the rate */ + +} drysponge256_x_t; + +/** + * \brief Structure of the rolling DrySPONGE128 state. + */ +typedef struct +{ + gascon128_state_t c; /**< GASCON-128 state for the capacity */ + drysponge128_rate_t r; /**< Buffer for a rate block of data */ + drysponge128_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge128_state_t; + +/** + * \brief Structure of the rolling DrySPONGE256 state. + */ +typedef struct +{ + gascon256_state_t c; /**< GASCON-256 state for the capacity */ + drysponge256_rate_t r; /**< Buffer for a rate block of data */ + drysponge256_x_t x; /**< "x" value for the sponge */ + uint32_t domain; /**< Domain value to mix on next F call */ + uint32_t rounds; /**< Number of rounds for next G call */ + +} drysponge256_state_t; + +/** + * \brief Permutes the GASCON-128 state using one iteration of CoreRound. + * + * \param state The GASCON-128 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon128_core_round(gascon128_state_t *state, uint8_t round); + +/** + * \brief Permutes the GASCON-256 state using one iteration of CoreRound. + * + * \param state The GASCON-256 state to be permuted. + * \param round The round number. + * + * The input and output \a state will be in little-endian byte order. + */ +void gascon256_core_round(gascon256_state_t *state, uint8_t round); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds and squeezes data out of the GASGON-128 state. + * + * \param state The DrySPONGE128 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge128_g(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds and squeezes data out of the GASGON-256 state. + * + * \param state The DrySPONGE256 state. + * + * The data that is squeezed out will be in state->r on exit. + */ +void drysponge256_g(drysponge256_state_t *state); + +/** + * \brief Performs the DrySPONGE128 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE128 state. + */ +void drysponge128_g_core(drysponge128_state_t *state); + +/** + * \brief Performs the DrySPONGE256 G function which runs the core + * rounds but does not squeeze out any output. + * + * \param state The DrySPONGE256 state. + */ +void drysponge256_g_core(drysponge256_state_t *state); + +/** + * \brief Performs the absorption phase of the DrySPONGE128 F function. + * + * \param state The DrySPONGE128 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE128_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge128_g() or + * drysponge128_g_core() to perform the full F operation. + */ +void drysponge128_f_absorb + (drysponge128_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Performs the absorption phase of the DrySPONGE256 F function. + * + * \param state The DrySPONGE256 state. + * \param input The block of input data to incorporate into the state. + * \param len The length of the input block, which must be less than + * or equal to DRYSPONGE256_RATE. Smaller input blocks will be padded. + * + * This function must be followed by a call to drysponge256_g() or + * drysponge256_g_core() to perform the full F operation. + */ +void drysponge256_f_absorb + (drysponge256_state_t *state, const unsigned char *input, unsigned len); + +/** + * \brief Set up a DrySPONGE128 state to begin encryption or decryption. + * + * \param state The DrySPONGE128 state. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge128_setup + (drysponge128_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +/** + * \brief Set up a DrySPONGE256 state to begin encryption or decryption. + * + * \param state The DrySPONGE256 state. + * \param key Points to the 32 bytes of the key. + * \param nonce Points to the 16 bytes of the nonce. + * \param final_block Non-zero if after key setup there will be no more blocks. + */ +void drysponge256_setup + (drysponge256_state_t *state, const unsigned char *key, + const unsigned char *nonce, int final_block); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-util.h b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/drygascon/Implementations/crypto_hash/drygascon256/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.c b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/api.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.c b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.c new file mode 100644 index 0000000..2f7abb3 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.c @@ -0,0 +1,881 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "elephant.h" +#include "internal-keccak.h" +#include "internal-spongent.h" +#include + +aead_cipher_t const dumbo_cipher = { + "Dumbo", + DUMBO_KEY_SIZE, + DUMBO_NONCE_SIZE, + DUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + dumbo_aead_encrypt, + dumbo_aead_decrypt +}; + +aead_cipher_t const jumbo_cipher = { + "Jumbo", + JUMBO_KEY_SIZE, + JUMBO_NONCE_SIZE, + JUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + jumbo_aead_encrypt, + jumbo_aead_decrypt +}; + +aead_cipher_t const delirium_cipher = { + "Delirium", + DELIRIUM_KEY_SIZE, + DELIRIUM_NONCE_SIZE, + DELIRIUM_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + delirium_aead_encrypt, + delirium_aead_decrypt +}; + +/** + * \brief Applies the Dumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void dumbo_lfsr + (unsigned char out[SPONGENT160_STATE_SIZE], + const unsigned char in[SPONGENT160_STATE_SIZE]) +{ + unsigned char temp = + leftRotate3_8(in[0]) ^ (in[3] << 7) ^ (in[13] >> 7); + unsigned index; + for (index = 0; index < SPONGENT160_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT160_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Dumbo. + * + * \param state Points to the Spongent-pi[160] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void dumbo_process_ad + (spongent160_state_t *state, + unsigned char mask[SPONGENT160_STATE_SIZE], + unsigned char next[SPONGENT160_STATE_SIZE], + unsigned char tag[DUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + dumbo_lfsr(next, mask); + dumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state->B, npub, DUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT160_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); + dumbo_lfsr(mask, mask); + dumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); +} + +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT160_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, SPONGENT160_STATE_SIZE); + + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + mlen -= SPONGENT160_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + dumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT160_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + c += temp; + } else if (*clen != DUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DUMBO_TAG_SIZE); + return 0; +} + +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DUMBO_TAG_SIZE) + return -1; + *mlen = clen - DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DUMBO_TAG_SIZE; + while (clen >= SPONGENT160_STATE_SIZE) { + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT160_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + clen -= SPONGENT160_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Jumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void jumbo_lfsr + (unsigned char out[SPONGENT176_STATE_SIZE], + const unsigned char in[SPONGENT176_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ (in[3] << 7) ^ (in[19] >> 7); + unsigned index; + for (index = 0; index < SPONGENT176_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT176_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Jumbo. + * + * \param state Points to the Spongent-pi[170] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void jumbo_process_ad + (spongent176_state_t *state, + unsigned char mask[SPONGENT176_STATE_SIZE], + unsigned char next[SPONGENT176_STATE_SIZE], + unsigned char tag[JUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + jumbo_lfsr(next, mask); + jumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state->B, npub, JUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = JUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT176_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); + jumbo_lfsr(mask, mask); + jumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); +} + +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT176_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, SPONGENT176_STATE_SIZE); + + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + mlen -= SPONGENT176_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + jumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT176_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + c += temp; + } else if (*clen != JUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, JUMBO_TAG_SIZE); + return 0; +} + +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < JUMBO_TAG_SIZE) + return -1; + *mlen = clen - JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= JUMBO_TAG_SIZE; + while (clen >= SPONGENT176_STATE_SIZE) { + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT176_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + clen -= SPONGENT176_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, JUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Delirium LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void delirium_lfsr + (unsigned char out[KECCAKP_200_STATE_SIZE], + const unsigned char in[KECCAKP_200_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ leftRotate1_8(in[2]) ^ (in[13] << 1); + unsigned index; + for (index = 0; index < KECCAKP_200_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[KECCAKP_200_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Delirium. + * + * \param state Points to the Keccak[200] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void delirium_process_ad + (keccakp_200_state_t *state, + unsigned char mask[KECCAKP_200_STATE_SIZE], + unsigned char next[KECCAKP_200_STATE_SIZE], + unsigned char tag[DELIRIUM_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + delirium_lfsr(next, mask); + delirium_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state->B, npub, DELIRIUM_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DELIRIUM_NONCE_SIZE; + while (adlen > 0) { + size = KECCAKP_200_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); + delirium_lfsr(mask, mask); + delirium_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); +} + +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= KECCAKP_200_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, KECCAKP_200_STATE_SIZE); + + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + mlen -= KECCAKP_200_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + delirium_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, KECCAKP_200_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + c += temp; + } else if (*clen != DELIRIUM_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DELIRIUM_TAG_SIZE); + return 0; +} + +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char *mtemp = m; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DELIRIUM_TAG_SIZE) + return -1; + *mlen = clen - DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DELIRIUM_TAG_SIZE; + while (clen >= KECCAKP_200_STATE_SIZE) { + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, KECCAKP_200_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + clen -= KECCAKP_200_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DELIRIUM_TAG_SIZE); +} diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.h new file mode 100644 index 0000000..f775e3d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/elephant.h @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ELEPHANT_H +#define LWCRYPTO_ELEPHANT_H + +#include "aead-common.h" + +/** + * \file elephant.h + * \brief Elephant authenticated encryption algorithm family. + * + * Elephant is a family of authenticated encryption algorithms based + * around the Spongent-pi and Keccak permutations. + * + * \li Dumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[160] permutation. This is + * the primary member of the family. + * \li Jumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[176] permutation. + * \li Delirium has a 128-bit key, a 96-bit nonce, and a 128-bit authentication + * tag. It is based around the Keccak[200] permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Dumbo. + */ +#define DUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Dumbo. + */ +#define DUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Dumbo. + */ +#define DUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Jumbo. + */ +#define JUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Jumbo. + */ +#define JUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Jumbo. + */ +#define JUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Delirium. + */ +#define DELIRIUM_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Delirium. + */ +#define DELIRIUM_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Delirium. + */ +#define DELIRIUM_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Dumbo cipher. + */ +extern aead_cipher_t const dumbo_cipher; + +/** + * \brief Meta-information block for the Jumbo cipher. + */ +extern aead_cipher_t const jumbo_cipher; + +/** + * \brief Meta-information block for the Delirium cipher. + */ +extern aead_cipher_t const delirium_cipher; + +/** + * \brief Encrypts and authenticates a packet with Dumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa dumbo_aead_decrypt() + */ +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Dumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa dumbo_aead_encrypt() + */ +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Jumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa jumbo_aead_decrypt() + */ +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Jumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa jumbo_aead_encrypt() + */ +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Delirium. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa delirium_aead_decrypt() + */ +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Delirium. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa delirium_aead_encrypt() + */ +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/encrypt.c b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..df2a4b5 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "elephant.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return dumbo_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return dumbo_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak-avr.S b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.c b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent-avr.S b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent-avr.S new file mode 100644 index 0000000..4a43458 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent-avr.S @@ -0,0 +1,1677 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 238 + .byte 237 + .byte 235 + .byte 224 + .byte 226 + .byte 225 + .byte 228 + .byte 239 + .byte 231 + .byte 234 + .byte 232 + .byte 229 + .byte 233 + .byte 236 + .byte 227 + .byte 230 + .byte 222 + .byte 221 + .byte 219 + .byte 208 + .byte 210 + .byte 209 + .byte 212 + .byte 223 + .byte 215 + .byte 218 + .byte 216 + .byte 213 + .byte 217 + .byte 220 + .byte 211 + .byte 214 + .byte 190 + .byte 189 + .byte 187 + .byte 176 + .byte 178 + .byte 177 + .byte 180 + .byte 191 + .byte 183 + .byte 186 + .byte 184 + .byte 181 + .byte 185 + .byte 188 + .byte 179 + .byte 182 + .byte 14 + .byte 13 + .byte 11 + .byte 0 + .byte 2 + .byte 1 + .byte 4 + .byte 15 + .byte 7 + .byte 10 + .byte 8 + .byte 5 + .byte 9 + .byte 12 + .byte 3 + .byte 6 + .byte 46 + .byte 45 + .byte 43 + .byte 32 + .byte 34 + .byte 33 + .byte 36 + .byte 47 + .byte 39 + .byte 42 + .byte 40 + .byte 37 + .byte 41 + .byte 44 + .byte 35 + .byte 38 + .byte 30 + .byte 29 + .byte 27 + .byte 16 + .byte 18 + .byte 17 + .byte 20 + .byte 31 + .byte 23 + .byte 26 + .byte 24 + .byte 21 + .byte 25 + .byte 28 + .byte 19 + .byte 22 + .byte 78 + .byte 77 + .byte 75 + .byte 64 + .byte 66 + .byte 65 + .byte 68 + .byte 79 + .byte 71 + .byte 74 + .byte 72 + .byte 69 + .byte 73 + .byte 76 + .byte 67 + .byte 70 + .byte 254 + .byte 253 + .byte 251 + .byte 240 + .byte 242 + .byte 241 + .byte 244 + .byte 255 + .byte 247 + .byte 250 + .byte 248 + .byte 245 + .byte 249 + .byte 252 + .byte 243 + .byte 246 + .byte 126 + .byte 125 + .byte 123 + .byte 112 + .byte 114 + .byte 113 + .byte 116 + .byte 127 + .byte 119 + .byte 122 + .byte 120 + .byte 117 + .byte 121 + .byte 124 + .byte 115 + .byte 118 + .byte 174 + .byte 173 + .byte 171 + .byte 160 + .byte 162 + .byte 161 + .byte 164 + .byte 175 + .byte 167 + .byte 170 + .byte 168 + .byte 165 + .byte 169 + .byte 172 + .byte 163 + .byte 166 + .byte 142 + .byte 141 + .byte 139 + .byte 128 + .byte 130 + .byte 129 + .byte 132 + .byte 143 + .byte 135 + .byte 138 + .byte 136 + .byte 133 + .byte 137 + .byte 140 + .byte 131 + .byte 134 + .byte 94 + .byte 93 + .byte 91 + .byte 80 + .byte 82 + .byte 81 + .byte 84 + .byte 95 + .byte 87 + .byte 90 + .byte 88 + .byte 85 + .byte 89 + .byte 92 + .byte 83 + .byte 86 + .byte 158 + .byte 157 + .byte 155 + .byte 144 + .byte 146 + .byte 145 + .byte 148 + .byte 159 + .byte 151 + .byte 154 + .byte 152 + .byte 149 + .byte 153 + .byte 156 + .byte 147 + .byte 150 + .byte 206 + .byte 205 + .byte 203 + .byte 192 + .byte 194 + .byte 193 + .byte 196 + .byte 207 + .byte 199 + .byte 202 + .byte 200 + .byte 197 + .byte 201 + .byte 204 + .byte 195 + .byte 198 + .byte 62 + .byte 61 + .byte 59 + .byte 48 + .byte 50 + .byte 49 + .byte 52 + .byte 63 + .byte 55 + .byte 58 + .byte 56 + .byte 53 + .byte 57 + .byte 60 + .byte 51 + .byte 54 + .byte 110 + .byte 109 + .byte 107 + .byte 96 + .byte 98 + .byte 97 + .byte 100 + .byte 111 + .byte 103 + .byte 106 + .byte 104 + .byte 101 + .byte 105 + .byte 108 + .byte 99 + .byte 102 + + .text +.global spongent160_permute + .type spongent160_permute, @function +spongent160_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 +.L__stack_usage = 16 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,80 + ldi r19,117 + ldi r20,174 +25: + eor r22,r19 + eor r25,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r10,1 + bld r6,0 + bst r6,6 + bld r10,1 + bst r13,1 + bld r6,6 + bst r22,7 + bld r13,1 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r14,2 + bld r12,0 + bst r3,3 + bld r14,2 + bst r23,5 + bld r3,3 + bst r4,4 + bld r23,5 + bst r4,1 + bld r4,4 + bst r2,5 + bld r4,1 + bst r24,4 + bld r2,5 + bst r12,3 + bld r24,4 + bst r15,6 + bld r12,3 + bst r9,3 + bld r15,6 + bst r3,6 + bld r9,3 + bst r29,1 + bld r3,6 + bst r10,4 + bld r29,1 + bst r8,2 + bld r10,4 + bst r23,2 + bld r8,2 + bst r3,0 + bld r23,2 + bst r0,0 + bld r3,0 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r2,3 + bld r14,0 + bst r15,4 + bld r2,3 + bst r8,3 + bld r15,4 + bst r23,6 + bld r8,3 + bst r5,0 + bld r23,6 + bst r6,1 + bld r5,0 + bst r10,5 + bld r6,1 + bst r8,6 + bld r10,5 + bst r29,2 + bld r8,6 + bst r11,0 + bld r29,2 + bst r10,2 + bld r11,0 + bst r7,2 + bld r10,2 + bst r15,1 + bld r7,2 + bst r6,7 + bld r15,1 + bst r13,5 + bld r6,7 + bst r28,7 + bld r13,5 + bst r9,4 + bld r28,7 + bst r4,2 + bld r9,4 + bst r3,1 + bld r4,2 + bst r22,5 + bld r3,1 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r0,0 + bld r8,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r2,1 + bld r4,0 + bst r14,4 + bld r2,1 + bst r4,3 + bld r14,4 + bst r3,5 + bld r4,3 + bst r28,5 + bld r3,5 + bst r8,4 + bld r28,5 + bst r28,2 + bld r8,4 + bst r7,0 + bld r28,2 + bst r14,1 + bld r7,0 + bst r2,7 + bld r14,1 + bst r25,4 + bld r2,7 + bst r24,3 + bld r25,4 + bst r11,7 + bld r24,3 + bst r13,6 + bld r11,7 + bst r29,3 + bld r13,6 + bst r11,4 + bld r29,3 + bst r12,2 + bld r11,4 + bst r15,2 + bld r12,2 + bst r7,3 + bld r15,2 + bst r15,5 + bld r7,3 + bst r8,7 + bld r15,5 + bst r29,6 + bld r8,7 + bst r13,0 + bld r29,6 + bst r0,0 + bld r13,0 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r6,2 + bld r10,0 + bst r11,1 + bld r6,2 + bst r10,6 + bld r11,1 + bst r9,2 + bld r10,6 + bst r3,2 + bld r9,2 + bst r23,1 + bld r3,2 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r10,3 + bld r24,0 + bst r7,6 + bld r10,3 + bst r25,1 + bld r7,6 + bst r14,7 + bld r25,1 + bst r5,7 + bld r14,7 + bst r9,5 + bld r5,7 + bst r4,6 + bld r9,5 + bst r5,1 + bld r4,6 + bst r6,5 + bld r5,1 + bst r12,5 + bld r6,5 + bst r24,6 + bld r12,5 + bst r13,3 + bld r24,6 + bst r23,7 + bld r13,3 + bst r5,4 + bld r23,7 + bst r8,1 + bld r5,4 + bst r0,0 + bld r8,1 + bst r23,3 + bld r0,0 + bst r3,4 + bld r23,3 + bst r28,1 + bld r3,4 + bst r6,4 + bld r28,1 + bst r12,1 + bld r6,4 + bst r14,6 + bld r12,1 + bst r5,3 + bld r14,6 + bst r7,5 + bld r5,3 + bst r24,5 + bld r7,5 + bst r12,7 + bld r24,5 + bst r25,6 + bld r12,7 + bst r25,3 + bld r25,6 + bst r15,7 + bld r25,3 + bst r9,7 + bld r15,7 + bst r5,6 + bld r9,7 + bst r9,1 + bld r5,6 + bst r2,6 + bld r9,1 + bst r25,0 + bld r2,6 + bst r14,3 + bld r25,0 + bst r3,7 + bld r14,3 + bst r29,5 + bld r3,7 + bst r12,4 + bld r29,5 + bst r24,2 + bld r12,4 + bst r11,3 + bld r24,2 + bst r11,6 + bld r11,3 + bst r13,2 + bld r11,6 + bst r0,0 + bld r13,2 + bst r28,3 + bld r0,0 + bst r7,4 + bld r28,3 + bst r24,1 + bld r7,4 + bst r10,7 + bld r24,1 + bst r9,6 + bld r10,7 + bst r5,2 + bld r9,6 + bst r7,1 + bld r5,2 + bst r14,5 + bld r7,1 + bst r4,7 + bld r14,5 + bst r5,5 + bld r4,7 + bst r8,5 + bld r5,5 + bst r28,6 + bld r8,5 + bst r9,0 + bld r28,6 + bst r2,2 + bld r9,0 + bst r15,0 + bld r2,2 + bst r6,3 + bld r15,0 + bst r11,5 + bld r6,3 + bst r12,6 + bld r11,5 + bst r25,2 + bld r12,6 + bst r15,3 + bld r25,2 + bst r7,7 + bld r15,3 + bst r25,5 + bld r7,7 + bst r24,7 + bld r25,5 + bst r13,7 + bld r24,7 + bst r29,7 + bld r13,7 + bst r13,4 + bld r29,7 + bst r0,0 + bld r13,4 + dec r18 + breq 5389f + rjmp 25b +5389: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent160_permute, .-spongent160_permute + + .text +.global spongent176_permute + .type spongent176_permute, @function +spongent176_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + ldd r16,Z+20 + ldd r17,Z+21 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,90 + ldi r19,69 + ldi r20,162 +27: + eor r22,r19 + eor r17,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r8,1 + bld r6,0 + bst r24,5 + bld r8,1 + bst r6,7 + bld r24,5 + bst r11,5 + bld r6,7 + bst r8,6 + bld r11,5 + bst r17,1 + bld r8,6 + bst r24,7 + bld r17,1 + bst r7,7 + bld r24,7 + bst r15,5 + bld r7,7 + bst r2,7 + bld r15,5 + bst r25,4 + bld r2,7 + bst r10,3 + bld r25,4 + bst r3,6 + bld r10,3 + bst r23,1 + bld r3,6 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r4,3 + bld r24,0 + bst r29,5 + bld r4,3 + bst r12,4 + bld r29,5 + bst r12,2 + bld r12,4 + bst r11,2 + bld r12,2 + bst r7,2 + bld r11,2 + bst r13,1 + bld r7,2 + bst r14,6 + bld r13,1 + bst r23,3 + bld r14,6 + bst r3,4 + bld r23,3 + bst r0,0 + bld r3,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r16,2 + bld r14,0 + bst r13,3 + bld r16,2 + bst r15,6 + bld r13,3 + bst r3,3 + bld r15,6 + bst r17,4 + bld r3,3 + bst r16,3 + bld r17,4 + bst r13,7 + bld r16,3 + bst r25,6 + bld r13,7 + bst r11,3 + bld r25,6 + bst r7,6 + bld r11,3 + bst r15,1 + bld r7,6 + bst r28,7 + bld r15,1 + bst r9,4 + bld r28,7 + bst r28,2 + bld r9,4 + bst r7,0 + bld r28,2 + bst r12,1 + bld r7,0 + bst r10,6 + bld r12,1 + bst r5,2 + bld r10,6 + bst r5,1 + bld r5,2 + bst r4,5 + bld r5,1 + bst r2,5 + bld r4,5 + bst r24,4 + bld r2,5 + bst r6,3 + bld r24,4 + bst r9,5 + bld r6,3 + bst r28,6 + bld r9,5 + bst r9,0 + bld r28,6 + bst r0,0 + bld r9,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r28,1 + bld r4,0 + bst r6,4 + bld r28,1 + bst r10,1 + bld r6,4 + bst r2,6 + bld r10,1 + bst r25,0 + bld r2,6 + bst r8,3 + bld r25,0 + bst r25,5 + bld r8,3 + bst r10,7 + bld r25,5 + bst r5,6 + bld r10,7 + bst r7,1 + bld r5,6 + bst r12,5 + bld r7,1 + bst r12,6 + bld r12,5 + bst r13,2 + bld r12,6 + bst r15,2 + bld r13,2 + bst r29,3 + bld r15,2 + bst r11,4 + bld r29,3 + bst r8,2 + bld r11,4 + bst r25,1 + bld r8,2 + bst r8,7 + bld r25,1 + bst r17,5 + bld r8,7 + bst r16,7 + bld r17,5 + bst r15,7 + bld r16,7 + bst r3,7 + bld r15,7 + bst r23,5 + bld r3,7 + bst r4,4 + bld r23,5 + bst r2,1 + bld r4,4 + bst r14,4 + bld r2,1 + bst r0,0 + bld r14,4 + bst r22,5 + bld r0,0 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r24,1 + bld r8,0 + bst r4,7 + bld r24,1 + bst r3,5 + bld r4,7 + bst r0,0 + bld r3,5 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r2,2 + bld r10,0 + bst r15,0 + bld r2,2 + bst r28,3 + bld r15,0 + bst r7,4 + bld r28,3 + bst r14,1 + bld r7,4 + bst r16,6 + bld r14,1 + bst r15,3 + bld r16,6 + bst r29,7 + bld r15,3 + bst r13,4 + bld r29,7 + bst r24,2 + bld r13,4 + bst r5,3 + bld r24,2 + bst r5,5 + bld r5,3 + bst r6,5 + bld r5,5 + bst r10,5 + bld r6,5 + bst r4,6 + bld r10,5 + bst r3,1 + bld r4,6 + bst r16,4 + bld r3,1 + bst r14,3 + bld r16,4 + bst r17,6 + bld r14,3 + bst r17,3 + bld r17,6 + bst r25,7 + bld r17,3 + bst r11,7 + bld r25,7 + bst r9,6 + bld r11,7 + bst r29,2 + bld r9,6 + bst r11,0 + bld r29,2 + bst r6,2 + bld r11,0 + bst r9,1 + bld r6,2 + bst r0,0 + bld r9,1 + bst r22,7 + bld r0,0 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r10,2 + bld r12,0 + bst r3,2 + bld r10,2 + bst r17,0 + bld r3,2 + bst r24,3 + bld r17,0 + bst r5,7 + bld r24,3 + bst r7,5 + bld r5,7 + bst r14,5 + bld r7,5 + bst r0,0 + bld r14,5 + bst r23,2 + bld r0,0 + bst r3,0 + bld r23,2 + bst r16,0 + bld r3,0 + bst r12,3 + bld r16,0 + bst r11,6 + bld r12,3 + bst r9,2 + bld r11,6 + bst r0,0 + bld r9,2 + bst r23,6 + bld r0,0 + bst r5,0 + bld r23,6 + bst r4,1 + bld r5,0 + bst r28,5 + bld r4,1 + bst r8,4 + bld r28,5 + bst r16,1 + bld r8,4 + bst r12,7 + bld r16,1 + bst r13,6 + bld r12,7 + bst r25,2 + bld r13,6 + bst r9,3 + bld r25,2 + bst r0,0 + bld r9,3 + bst r23,7 + bld r0,0 + bst r5,4 + bld r23,7 + bst r6,1 + bld r5,4 + bst r8,5 + bld r6,1 + bst r16,5 + bld r8,5 + bst r14,7 + bld r16,5 + bst r0,0 + bld r14,7 + bst r29,1 + bld r0,0 + bst r10,4 + bld r29,1 + bst r4,2 + bld r10,4 + bst r0,0 + bld r4,2 + bst r29,6 + bld r0,0 + bst r13,0 + bld r29,6 + bst r14,2 + bld r13,0 + bst r17,2 + bld r14,2 + bst r25,3 + bld r17,2 + bst r9,7 + bld r25,3 + bst r0,0 + bld r9,7 + bst r2,3 + bld r0,0 + bst r15,4 + bld r2,3 + bst r0,0 + bld r15,4 + bst r6,6 + bld r0,0 + bst r11,1 + bld r6,6 + bst r0,0 + bld r11,1 + bst r7,3 + bld r0,0 + bst r13,5 + bld r7,3 + bst r24,6 + bld r13,5 + bst r0,0 + bld r24,6 + dec r18 + breq 5445f + rjmp 27b +5445: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r16 + st X+,r17 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent176_permute, .-spongent176_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.c b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.c new file mode 100644 index 0000000..8e0d57d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.c @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spongent.h" + +#if !defined(__AVR__) + +/** + * \brief Applies the Spongent-pi S-box in parallel to the 8 nibbles + * of a 32-bit word. + * + * \param x3 The input values to the parallel S-boxes. + * + * \return The output values from the parallel S-boxes. + * + * Based on the bit-sliced S-box implementation from here: + * https://github.com/DadaIsCrazy/usuba/blob/master/data/sboxes/spongent.ua + * + * Note that spongent.ua numbers bits from highest to lowest, so x0 is the + * high bit of each nibble and x3 is the low bit. + */ +static uint32_t spongent_sbox(uint32_t x3) +{ + uint32_t q0, q1, q2, q3, t0, t1, t2, t3; + uint32_t x2 = (x3 >> 1); + uint32_t x1 = (x2 >> 1); + uint32_t x0 = (x1 >> 1); + q0 = x0 ^ x2; + q1 = x1 ^ x2; + t0 = q0 & q1; + q2 = ~(x0 ^ x1 ^ x3 ^ t0); + t1 = q2 & ~x0; + q3 = x1 ^ t1; + t2 = q3 & (q3 ^ x2 ^ x3 ^ t0); + t3 = (x2 ^ t0) & ~(x1 ^ t0); + q0 = x1 ^ x2 ^ x3 ^ t2; + q1 = x0 ^ x2 ^ x3 ^ t0 ^ t1; + q2 = x0 ^ x1 ^ x2 ^ t1; + q3 = x0 ^ x3 ^ t0 ^ t3; + return ((q0 << 3) & 0x88888888U) | ((q1 << 2) & 0x44444444U) | + ((q2 << 1) & 0x22222222U) | (q3 & 0x11111111U); +} + +void spongent160_permute(spongent160_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[160] */ + 0x75, 0xae, 0x6a, 0x56, 0x54, 0x2a, 0x29, 0x94, + 0x53, 0xca, 0x27, 0xe4, 0x4f, 0xf2, 0x1f, 0xf8, + 0x3e, 0x7c, 0x7d, 0xbe, 0x7a, 0x5e, 0x74, 0x2e, + 0x68, 0x16, 0x50, 0x0a, 0x21, 0x84, 0x43, 0xc2, + 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, + 0x71, 0x8e, 0x62, 0x46, 0x44, 0x22, 0x09, 0x90, + 0x12, 0x48, 0x24, 0x24, 0x49, 0x92, 0x13, 0xc8, + 0x26, 0x64, 0x4d, 0xb2, 0x1b, 0xd8, 0x36, 0x6c, + 0x6d, 0xb6, 0x5a, 0x5a, 0x35, 0xac, 0x6b, 0xd6, + 0x56, 0x6a, 0x2d, 0xb4, 0x5b, 0xda, 0x37, 0xec, + 0x6f, 0xf6, 0x5e, 0x7a, 0x3d, 0xbc, 0x7b, 0xde, + 0x76, 0x6e, 0x6c, 0x36, 0x58, 0x1a, 0x31, 0x8c, + 0x63, 0xc6, 0x46, 0x62, 0x0d, 0xb0, 0x1a, 0x58, + 0x34, 0x2c, 0x69, 0x96, 0x52, 0x4a, 0x25, 0xa4, + 0x4b, 0xd2, 0x17, 0xe8, 0x2e, 0x74, 0x5d, 0xba, + 0x3b, 0xdc, 0x77, 0xee, 0x6e, 0x76, 0x5c, 0x3a, + 0x39, 0x9c, 0x73, 0xce, 0x66, 0x66, 0x4c, 0x32, + 0x19, 0x98, 0x32, 0x4c, 0x65, 0xa6, 0x4a, 0x52, + 0x15, 0xa8, 0x2a, 0x54, 0x55, 0xaa, 0x2b, 0xd4, + 0x57, 0xea, 0x2f, 0xf4, 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4; + uint32_t t0, t1, t2, t3, t4; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); +#endif + + /* Perform the 80 rounds of Spongent-pi[160] */ + for (round = 0; round < 80; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x4 ^= ((uint32_t)(rc[1])) << 24; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + + /* Permute the bits of the state. Bit i is moved to (40 * i) % 159 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + #define BCP(x, bit) ((x) & (((uint32_t)1) << (bit))) + #define BUP(x, from, to) \ + (((x) << ((to) - (from))) & (((uint32_t)1) << (to))) + #define BDN(x, from, to) \ + (((x) >> ((from) - (to))) & (((uint32_t)1) << (to))) + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 8) ^ BUP(t0, 5, 9) ^ BUP(t0, 9, 10) ^ + BDN(t0, 13, 11) ^ BDN(t0, 17, 12) ^ BDN(t0, 21, 13) ^ + BDN(t0, 25, 14) ^ BDN(t0, 29, 15) ^ BUP(t1, 1, 16) ^ + BUP(t1, 5, 17) ^ BUP(t1, 9, 18) ^ BUP(t1, 13, 19) ^ + BUP(t1, 17, 20) ^ BCP(t1, 21) ^ BDN(t1, 25, 22) ^ + BDN(t1, 29, 23) ^ BUP(t2, 1, 24) ^ BUP(t2, 5, 25) ^ + BUP(t2, 9, 26) ^ BUP(t2, 13, 27) ^ BUP(t2, 17, 28) ^ + BUP(t2, 21, 29) ^ BUP(t2, 25, 30) ^ BUP(t2, 29, 31) ^ + BCP(t4, 0) ^ BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ + BDN(t4, 12, 3) ^ BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ + BDN(t4, 24, 6) ^ BDN(t4, 28, 7); + x2 = BUP(t0, 2, 16) ^ BUP(t0, 6, 17) ^ BUP(t0, 10, 18) ^ + BUP(t0, 14, 19) ^ BUP(t0, 18, 20) ^ BDN(t0, 22, 21) ^ + BDN(t0, 26, 22) ^ BDN(t0, 30, 23) ^ BUP(t1, 2, 24) ^ + BUP(t1, 6, 25) ^ BUP(t1, 10, 26) ^ BUP(t1, 14, 27) ^ + BUP(t1, 18, 28) ^ BUP(t1, 22, 29) ^ BUP(t1, 26, 30) ^ + BUP(t1, 30, 31) ^ BDN(t3, 1, 0) ^ BDN(t3, 5, 1) ^ + BDN(t3, 9, 2) ^ BDN(t3, 13, 3) ^ BDN(t3, 17, 4) ^ + BDN(t3, 21, 5) ^ BDN(t3, 25, 6) ^ BDN(t3, 29, 7) ^ + BUP(t4, 1, 8) ^ BUP(t4, 5, 9) ^ BUP(t4, 9, 10) ^ + BDN(t4, 13, 11) ^ BDN(t4, 17, 12) ^ BDN(t4, 21, 13) ^ + BDN(t4, 25, 14) ^ BDN(t4, 29, 15); + x3 = BUP(t0, 3, 24) ^ BUP(t0, 7, 25) ^ BUP(t0, 11, 26) ^ + BUP(t0, 15, 27) ^ BUP(t0, 19, 28) ^ BUP(t0, 23, 29) ^ + BUP(t0, 27, 30) ^ BCP(t0, 31) ^ BDN(t2, 2, 0) ^ + BDN(t2, 6, 1) ^ BDN(t2, 10, 2) ^ BDN(t2, 14, 3) ^ + BDN(t2, 18, 4) ^ BDN(t2, 22, 5) ^ BDN(t2, 26, 6) ^ + BDN(t2, 30, 7) ^ BUP(t3, 2, 8) ^ BUP(t3, 6, 9) ^ + BCP(t3, 10) ^ BDN(t3, 14, 11) ^ BDN(t3, 18, 12) ^ + BDN(t3, 22, 13) ^ BDN(t3, 26, 14) ^ BDN(t3, 30, 15) ^ + BUP(t4, 2, 16) ^ BUP(t4, 6, 17) ^ BUP(t4, 10, 18) ^ + BUP(t4, 14, 19) ^ BUP(t4, 18, 20) ^ BDN(t4, 22, 21) ^ + BDN(t4, 26, 22) ^ BDN(t4, 30, 23); + x4 = BDN(t1, 3, 0) ^ BDN(t1, 7, 1) ^ BDN(t1, 11, 2) ^ + BDN(t1, 15, 3) ^ BDN(t1, 19, 4) ^ BDN(t1, 23, 5) ^ + BDN(t1, 27, 6) ^ BDN(t1, 31, 7) ^ BUP(t2, 3, 8) ^ + BUP(t2, 7, 9) ^ BDN(t2, 11, 10) ^ BDN(t2, 15, 11) ^ + BDN(t2, 19, 12) ^ BDN(t2, 23, 13) ^ BDN(t2, 27, 14) ^ + BDN(t2, 31, 15) ^ BUP(t3, 3, 16) ^ BUP(t3, 7, 17) ^ + BUP(t3, 11, 18) ^ BUP(t3, 15, 19) ^ BUP(t3, 19, 20) ^ + BDN(t3, 23, 21) ^ BDN(t3, 27, 22) ^ BDN(t3, 31, 23) ^ + BUP(t4, 3, 24) ^ BUP(t4, 7, 25) ^ BUP(t4, 11, 26) ^ + BUP(t4, 15, 27) ^ BUP(t4, 19, 28) ^ BUP(t4, 23, 29) ^ + BUP(t4, 27, 30) ^ BCP(t4, 31); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); +#endif +} + +void spongent176_permute(spongent176_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[176] */ + 0x45, 0xa2, 0x0b, 0xd0, 0x16, 0x68, 0x2c, 0x34, + 0x59, 0x9a, 0x33, 0xcc, 0x67, 0xe6, 0x4e, 0x72, + 0x1d, 0xb8, 0x3a, 0x5c, 0x75, 0xae, 0x6a, 0x56, + 0x54, 0x2a, 0x29, 0x94, 0x53, 0xca, 0x27, 0xe4, + 0x4f, 0xf2, 0x1f, 0xf8, 0x3e, 0x7c, 0x7d, 0xbe, + 0x7a, 0x5e, 0x74, 0x2e, 0x68, 0x16, 0x50, 0x0a, + 0x21, 0x84, 0x43, 0xc2, 0x07, 0xe0, 0x0e, 0x70, + 0x1c, 0x38, 0x38, 0x1c, 0x71, 0x8e, 0x62, 0x46, + 0x44, 0x22, 0x09, 0x90, 0x12, 0x48, 0x24, 0x24, + 0x49, 0x92, 0x13, 0xc8, 0x26, 0x64, 0x4d, 0xb2, + 0x1b, 0xd8, 0x36, 0x6c, 0x6d, 0xb6, 0x5a, 0x5a, + 0x35, 0xac, 0x6b, 0xd6, 0x56, 0x6a, 0x2d, 0xb4, + 0x5b, 0xda, 0x37, 0xec, 0x6f, 0xf6, 0x5e, 0x7a, + 0x3d, 0xbc, 0x7b, 0xde, 0x76, 0x6e, 0x6c, 0x36, + 0x58, 0x1a, 0x31, 0x8c, 0x63, 0xc6, 0x46, 0x62, + 0x0d, 0xb0, 0x1a, 0x58, 0x34, 0x2c, 0x69, 0x96, + 0x52, 0x4a, 0x25, 0xa4, 0x4b, 0xd2, 0x17, 0xe8, + 0x2e, 0x74, 0x5d, 0xba, 0x3b, 0xdc, 0x77, 0xee, + 0x6e, 0x76, 0x5c, 0x3a, 0x39, 0x9c, 0x73, 0xce, + 0x66, 0x66, 0x4c, 0x32, 0x19, 0x98, 0x32, 0x4c, + 0x65, 0xa6, 0x4a, 0x52, 0x15, 0xa8, 0x2a, 0x54, + 0x55, 0xaa, 0x2b, 0xd4, 0x57, 0xea, 0x2f, 0xf4, + 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t t0, t1, t2, t3, t4, t5; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; + x5 = state->W[5]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); + x5 = le_load_word16(state->B + 20); /* Last word is only 16 bits */ +#endif + + /* Perform the 90 rounds of Spongent-pi[176] */ + for (round = 0; round < 90; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x5 ^= ((uint32_t)(rc[1])) << 8; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + t5 = spongent_sbox(x5); + + /* Permute the bits of the state. Bit i is moved to (44 * i) % 175 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 12) ^ BUP(t0, 5, 13) ^ BUP(t0, 9, 14) ^ + BUP(t0, 13, 15) ^ BDN(t0, 17, 16) ^ BDN(t0, 21, 17) ^ + BDN(t0, 25, 18) ^ BDN(t0, 29, 19) ^ BUP(t1, 1, 20) ^ + BUP(t1, 5, 21) ^ BUP(t1, 9, 22) ^ BUP(t1, 13, 23) ^ + BUP(t1, 17, 24) ^ BUP(t1, 21, 25) ^ BUP(t1, 25, 26) ^ + BDN(t1, 29, 27) ^ BUP(t2, 1, 28) ^ BUP(t2, 5, 29) ^ + BUP(t2, 9, 30) ^ BUP(t2, 13, 31) ^ BCP(t4, 0) ^ + BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ BDN(t4, 12, 3) ^ + BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ BDN(t4, 24, 6) ^ + BDN(t4, 28, 7) ^ BUP(t5, 0, 8) ^ BUP(t5, 4, 9) ^ + BUP(t5, 8, 10) ^ BDN(t5, 12, 11); + x2 = BUP(t0, 2, 24) ^ BUP(t0, 6, 25) ^ BUP(t0, 10, 26) ^ + BUP(t0, 14, 27) ^ BUP(t0, 18, 28) ^ BUP(t0, 22, 29) ^ + BUP(t0, 26, 30) ^ BUP(t0, 30, 31) ^ BDN(t2, 17, 0) ^ + BDN(t2, 21, 1) ^ BDN(t2, 25, 2) ^ BDN(t2, 29, 3) ^ + BUP(t3, 1, 4) ^ BCP(t3, 5) ^ BDN(t3, 9, 6) ^ + BDN(t3, 13, 7) ^ BDN(t3, 17, 8) ^ BDN(t3, 21, 9) ^ + BDN(t3, 25, 10) ^ BDN(t3, 29, 11) ^ BUP(t4, 1, 12) ^ + BUP(t4, 5, 13) ^ BUP(t4, 9, 14) ^ BUP(t4, 13, 15) ^ + BDN(t4, 17, 16) ^ BDN(t4, 21, 17) ^ BDN(t4, 25, 18) ^ + BDN(t4, 29, 19) ^ BUP(t5, 1, 20) ^ BUP(t5, 5, 21) ^ + BUP(t5, 9, 22) ^ BUP(t5, 13, 23); + x3 = BDN(t1, 2, 0) ^ BDN(t1, 6, 1) ^ BDN(t1, 10, 2) ^ + BDN(t1, 14, 3) ^ BDN(t1, 18, 4) ^ BDN(t1, 22, 5) ^ + BDN(t1, 26, 6) ^ BDN(t1, 30, 7) ^ BUP(t2, 2, 8) ^ + BUP(t2, 6, 9) ^ BCP(t2, 10) ^ BDN(t2, 14, 11) ^ + BDN(t2, 18, 12) ^ BDN(t2, 22, 13) ^ BDN(t2, 26, 14) ^ + BDN(t2, 30, 15) ^ BUP(t3, 2, 16) ^ BUP(t3, 6, 17) ^ + BUP(t3, 10, 18) ^ BUP(t3, 14, 19) ^ BUP(t3, 18, 20) ^ + BDN(t3, 22, 21) ^ BDN(t3, 26, 22) ^ BDN(t3, 30, 23) ^ + BUP(t4, 2, 24) ^ BUP(t4, 6, 25) ^ BUP(t4, 10, 26) ^ + BUP(t4, 14, 27) ^ BUP(t4, 18, 28) ^ BUP(t4, 22, 29) ^ + BUP(t4, 26, 30) ^ BUP(t4, 30, 31); + x4 = BUP(t0, 3, 4) ^ BDN(t0, 7, 5) ^ BDN(t0, 11, 6) ^ + BDN(t0, 15, 7) ^ BDN(t0, 19, 8) ^ BDN(t0, 23, 9) ^ + BDN(t0, 27, 10) ^ BDN(t0, 31, 11) ^ BUP(t1, 3, 12) ^ + BUP(t1, 7, 13) ^ BUP(t1, 11, 14) ^ BCP(t1, 15) ^ + BDN(t1, 19, 16) ^ BDN(t1, 23, 17) ^ BDN(t1, 27, 18) ^ + BDN(t1, 31, 19) ^ BUP(t2, 3, 20) ^ BUP(t2, 7, 21) ^ + BUP(t2, 11, 22) ^ BUP(t2, 15, 23) ^ BUP(t2, 19, 24) ^ + BUP(t2, 23, 25) ^ BDN(t2, 27, 26) ^ BDN(t2, 31, 27) ^ + BUP(t3, 3, 28) ^ BUP(t3, 7, 29) ^ BUP(t3, 11, 30) ^ + BUP(t3, 15, 31) ^ BDN(t5, 2, 0) ^ BDN(t5, 6, 1) ^ + BDN(t5, 10, 2) ^ BDN(t5, 14, 3); + x5 = BDN(t3, 19, 0) ^ BDN(t3, 23, 1) ^ BDN(t3, 27, 2) ^ + BDN(t3, 31, 3) ^ BUP(t4, 3, 4) ^ BDN(t4, 7, 5) ^ + BDN(t4, 11, 6) ^ BDN(t4, 15, 7) ^ BDN(t4, 19, 8) ^ + BDN(t4, 23, 9) ^ BDN(t4, 27, 10) ^ BDN(t4, 31, 11) ^ + BUP(t5, 3, 12) ^ BUP(t5, 7, 13) ^ BUP(t5, 11, 14) ^ + BCP(t5, 15); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; + state->W[5] = x5; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); + le_store_word16(state->B + 20, x5); /* Last word is only 16 bits */ +#endif +} + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.h new file mode 100644 index 0000000..bb9823f --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-spongent.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPONGENT_H +#define LW_INTERNAL_SPONGENT_H + +#include "internal-util.h" + +/** + * \file internal-spongent.h + * \brief Internal implementation of the Spongent-pi permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the Spongent-pi[160] state in bytes. + */ +#define SPONGENT160_STATE_SIZE 20 + +/** + * \brief Size of the Spongent-pi[176] state in bytes. + */ +#define SPONGENT176_STATE_SIZE 22 + +/** + * \brief Structure of the internal state of the Spongent-pi[160] permutation. + */ +typedef union +{ + uint32_t W[5]; /**< Spongent-pi[160] state as 32-bit words */ + uint8_t B[20]; /**< Spongent-pi[160] state as bytes */ + +} spongent160_state_t; + +/** + * \brief Structure of the internal state of the Spongent-pi[176] permutation. + * + * Note: The state is technically only 176 bits, but we increase it to + * 192 bits so that we can use 32-bit word operations to manipulate the + * state. The extra bits in the last word are fixed to zero. + */ +typedef union +{ + uint32_t W[6]; /**< Spongent-pi[176] state as 32-bit words */ + uint8_t B[24]; /**< Spongent-pi[176] state as bytes */ + +} spongent176_state_t; + +/** + * \brief Permutes the Spongent-pi[160] state. + * + * \param state The Spongent-pi[160] state to be permuted. + */ +void spongent160_permute(spongent160_state_t *state); + +/** + * \brief Permutes the Spongent-pi[176] state. + * + * \param state The Spongent-pi[176] state to be permuted. + */ +void spongent176_permute(spongent176_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-util.h b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant160v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.c b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/api.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.c b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.c new file mode 100644 index 0000000..2f7abb3 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.c @@ -0,0 +1,881 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "elephant.h" +#include "internal-keccak.h" +#include "internal-spongent.h" +#include + +aead_cipher_t const dumbo_cipher = { + "Dumbo", + DUMBO_KEY_SIZE, + DUMBO_NONCE_SIZE, + DUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + dumbo_aead_encrypt, + dumbo_aead_decrypt +}; + +aead_cipher_t const jumbo_cipher = { + "Jumbo", + JUMBO_KEY_SIZE, + JUMBO_NONCE_SIZE, + JUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + jumbo_aead_encrypt, + jumbo_aead_decrypt +}; + +aead_cipher_t const delirium_cipher = { + "Delirium", + DELIRIUM_KEY_SIZE, + DELIRIUM_NONCE_SIZE, + DELIRIUM_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + delirium_aead_encrypt, + delirium_aead_decrypt +}; + +/** + * \brief Applies the Dumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void dumbo_lfsr + (unsigned char out[SPONGENT160_STATE_SIZE], + const unsigned char in[SPONGENT160_STATE_SIZE]) +{ + unsigned char temp = + leftRotate3_8(in[0]) ^ (in[3] << 7) ^ (in[13] >> 7); + unsigned index; + for (index = 0; index < SPONGENT160_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT160_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Dumbo. + * + * \param state Points to the Spongent-pi[160] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void dumbo_process_ad + (spongent160_state_t *state, + unsigned char mask[SPONGENT160_STATE_SIZE], + unsigned char next[SPONGENT160_STATE_SIZE], + unsigned char tag[DUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + dumbo_lfsr(next, mask); + dumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state->B, npub, DUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT160_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); + dumbo_lfsr(mask, mask); + dumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); +} + +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT160_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, SPONGENT160_STATE_SIZE); + + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + mlen -= SPONGENT160_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + dumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT160_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + c += temp; + } else if (*clen != DUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DUMBO_TAG_SIZE); + return 0; +} + +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DUMBO_TAG_SIZE) + return -1; + *mlen = clen - DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DUMBO_TAG_SIZE; + while (clen >= SPONGENT160_STATE_SIZE) { + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT160_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + clen -= SPONGENT160_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Jumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void jumbo_lfsr + (unsigned char out[SPONGENT176_STATE_SIZE], + const unsigned char in[SPONGENT176_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ (in[3] << 7) ^ (in[19] >> 7); + unsigned index; + for (index = 0; index < SPONGENT176_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT176_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Jumbo. + * + * \param state Points to the Spongent-pi[170] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void jumbo_process_ad + (spongent176_state_t *state, + unsigned char mask[SPONGENT176_STATE_SIZE], + unsigned char next[SPONGENT176_STATE_SIZE], + unsigned char tag[JUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + jumbo_lfsr(next, mask); + jumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state->B, npub, JUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = JUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT176_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); + jumbo_lfsr(mask, mask); + jumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); +} + +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT176_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, SPONGENT176_STATE_SIZE); + + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + mlen -= SPONGENT176_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + jumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT176_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + c += temp; + } else if (*clen != JUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, JUMBO_TAG_SIZE); + return 0; +} + +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < JUMBO_TAG_SIZE) + return -1; + *mlen = clen - JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= JUMBO_TAG_SIZE; + while (clen >= SPONGENT176_STATE_SIZE) { + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT176_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + clen -= SPONGENT176_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, JUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Delirium LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void delirium_lfsr + (unsigned char out[KECCAKP_200_STATE_SIZE], + const unsigned char in[KECCAKP_200_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ leftRotate1_8(in[2]) ^ (in[13] << 1); + unsigned index; + for (index = 0; index < KECCAKP_200_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[KECCAKP_200_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Delirium. + * + * \param state Points to the Keccak[200] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void delirium_process_ad + (keccakp_200_state_t *state, + unsigned char mask[KECCAKP_200_STATE_SIZE], + unsigned char next[KECCAKP_200_STATE_SIZE], + unsigned char tag[DELIRIUM_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + delirium_lfsr(next, mask); + delirium_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state->B, npub, DELIRIUM_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DELIRIUM_NONCE_SIZE; + while (adlen > 0) { + size = KECCAKP_200_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); + delirium_lfsr(mask, mask); + delirium_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); +} + +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= KECCAKP_200_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, KECCAKP_200_STATE_SIZE); + + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + mlen -= KECCAKP_200_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + delirium_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, KECCAKP_200_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + c += temp; + } else if (*clen != DELIRIUM_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DELIRIUM_TAG_SIZE); + return 0; +} + +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char *mtemp = m; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DELIRIUM_TAG_SIZE) + return -1; + *mlen = clen - DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DELIRIUM_TAG_SIZE; + while (clen >= KECCAKP_200_STATE_SIZE) { + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, KECCAKP_200_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + clen -= KECCAKP_200_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DELIRIUM_TAG_SIZE); +} diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.h new file mode 100644 index 0000000..f775e3d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/elephant.h @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ELEPHANT_H +#define LWCRYPTO_ELEPHANT_H + +#include "aead-common.h" + +/** + * \file elephant.h + * \brief Elephant authenticated encryption algorithm family. + * + * Elephant is a family of authenticated encryption algorithms based + * around the Spongent-pi and Keccak permutations. + * + * \li Dumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[160] permutation. This is + * the primary member of the family. + * \li Jumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[176] permutation. + * \li Delirium has a 128-bit key, a 96-bit nonce, and a 128-bit authentication + * tag. It is based around the Keccak[200] permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Dumbo. + */ +#define DUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Dumbo. + */ +#define DUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Dumbo. + */ +#define DUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Jumbo. + */ +#define JUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Jumbo. + */ +#define JUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Jumbo. + */ +#define JUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Delirium. + */ +#define DELIRIUM_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Delirium. + */ +#define DELIRIUM_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Delirium. + */ +#define DELIRIUM_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Dumbo cipher. + */ +extern aead_cipher_t const dumbo_cipher; + +/** + * \brief Meta-information block for the Jumbo cipher. + */ +extern aead_cipher_t const jumbo_cipher; + +/** + * \brief Meta-information block for the Delirium cipher. + */ +extern aead_cipher_t const delirium_cipher; + +/** + * \brief Encrypts and authenticates a packet with Dumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa dumbo_aead_decrypt() + */ +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Dumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa dumbo_aead_encrypt() + */ +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Jumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa jumbo_aead_decrypt() + */ +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Jumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa jumbo_aead_encrypt() + */ +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Delirium. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa delirium_aead_decrypt() + */ +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Delirium. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa delirium_aead_encrypt() + */ +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/encrypt.c b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..89b60ae --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "elephant.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return jumbo_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return jumbo_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak-avr.S b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.c b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent-avr.S b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent-avr.S new file mode 100644 index 0000000..4a43458 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent-avr.S @@ -0,0 +1,1677 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 238 + .byte 237 + .byte 235 + .byte 224 + .byte 226 + .byte 225 + .byte 228 + .byte 239 + .byte 231 + .byte 234 + .byte 232 + .byte 229 + .byte 233 + .byte 236 + .byte 227 + .byte 230 + .byte 222 + .byte 221 + .byte 219 + .byte 208 + .byte 210 + .byte 209 + .byte 212 + .byte 223 + .byte 215 + .byte 218 + .byte 216 + .byte 213 + .byte 217 + .byte 220 + .byte 211 + .byte 214 + .byte 190 + .byte 189 + .byte 187 + .byte 176 + .byte 178 + .byte 177 + .byte 180 + .byte 191 + .byte 183 + .byte 186 + .byte 184 + .byte 181 + .byte 185 + .byte 188 + .byte 179 + .byte 182 + .byte 14 + .byte 13 + .byte 11 + .byte 0 + .byte 2 + .byte 1 + .byte 4 + .byte 15 + .byte 7 + .byte 10 + .byte 8 + .byte 5 + .byte 9 + .byte 12 + .byte 3 + .byte 6 + .byte 46 + .byte 45 + .byte 43 + .byte 32 + .byte 34 + .byte 33 + .byte 36 + .byte 47 + .byte 39 + .byte 42 + .byte 40 + .byte 37 + .byte 41 + .byte 44 + .byte 35 + .byte 38 + .byte 30 + .byte 29 + .byte 27 + .byte 16 + .byte 18 + .byte 17 + .byte 20 + .byte 31 + .byte 23 + .byte 26 + .byte 24 + .byte 21 + .byte 25 + .byte 28 + .byte 19 + .byte 22 + .byte 78 + .byte 77 + .byte 75 + .byte 64 + .byte 66 + .byte 65 + .byte 68 + .byte 79 + .byte 71 + .byte 74 + .byte 72 + .byte 69 + .byte 73 + .byte 76 + .byte 67 + .byte 70 + .byte 254 + .byte 253 + .byte 251 + .byte 240 + .byte 242 + .byte 241 + .byte 244 + .byte 255 + .byte 247 + .byte 250 + .byte 248 + .byte 245 + .byte 249 + .byte 252 + .byte 243 + .byte 246 + .byte 126 + .byte 125 + .byte 123 + .byte 112 + .byte 114 + .byte 113 + .byte 116 + .byte 127 + .byte 119 + .byte 122 + .byte 120 + .byte 117 + .byte 121 + .byte 124 + .byte 115 + .byte 118 + .byte 174 + .byte 173 + .byte 171 + .byte 160 + .byte 162 + .byte 161 + .byte 164 + .byte 175 + .byte 167 + .byte 170 + .byte 168 + .byte 165 + .byte 169 + .byte 172 + .byte 163 + .byte 166 + .byte 142 + .byte 141 + .byte 139 + .byte 128 + .byte 130 + .byte 129 + .byte 132 + .byte 143 + .byte 135 + .byte 138 + .byte 136 + .byte 133 + .byte 137 + .byte 140 + .byte 131 + .byte 134 + .byte 94 + .byte 93 + .byte 91 + .byte 80 + .byte 82 + .byte 81 + .byte 84 + .byte 95 + .byte 87 + .byte 90 + .byte 88 + .byte 85 + .byte 89 + .byte 92 + .byte 83 + .byte 86 + .byte 158 + .byte 157 + .byte 155 + .byte 144 + .byte 146 + .byte 145 + .byte 148 + .byte 159 + .byte 151 + .byte 154 + .byte 152 + .byte 149 + .byte 153 + .byte 156 + .byte 147 + .byte 150 + .byte 206 + .byte 205 + .byte 203 + .byte 192 + .byte 194 + .byte 193 + .byte 196 + .byte 207 + .byte 199 + .byte 202 + .byte 200 + .byte 197 + .byte 201 + .byte 204 + .byte 195 + .byte 198 + .byte 62 + .byte 61 + .byte 59 + .byte 48 + .byte 50 + .byte 49 + .byte 52 + .byte 63 + .byte 55 + .byte 58 + .byte 56 + .byte 53 + .byte 57 + .byte 60 + .byte 51 + .byte 54 + .byte 110 + .byte 109 + .byte 107 + .byte 96 + .byte 98 + .byte 97 + .byte 100 + .byte 111 + .byte 103 + .byte 106 + .byte 104 + .byte 101 + .byte 105 + .byte 108 + .byte 99 + .byte 102 + + .text +.global spongent160_permute + .type spongent160_permute, @function +spongent160_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 +.L__stack_usage = 16 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,80 + ldi r19,117 + ldi r20,174 +25: + eor r22,r19 + eor r25,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r10,1 + bld r6,0 + bst r6,6 + bld r10,1 + bst r13,1 + bld r6,6 + bst r22,7 + bld r13,1 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r14,2 + bld r12,0 + bst r3,3 + bld r14,2 + bst r23,5 + bld r3,3 + bst r4,4 + bld r23,5 + bst r4,1 + bld r4,4 + bst r2,5 + bld r4,1 + bst r24,4 + bld r2,5 + bst r12,3 + bld r24,4 + bst r15,6 + bld r12,3 + bst r9,3 + bld r15,6 + bst r3,6 + bld r9,3 + bst r29,1 + bld r3,6 + bst r10,4 + bld r29,1 + bst r8,2 + bld r10,4 + bst r23,2 + bld r8,2 + bst r3,0 + bld r23,2 + bst r0,0 + bld r3,0 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r2,3 + bld r14,0 + bst r15,4 + bld r2,3 + bst r8,3 + bld r15,4 + bst r23,6 + bld r8,3 + bst r5,0 + bld r23,6 + bst r6,1 + bld r5,0 + bst r10,5 + bld r6,1 + bst r8,6 + bld r10,5 + bst r29,2 + bld r8,6 + bst r11,0 + bld r29,2 + bst r10,2 + bld r11,0 + bst r7,2 + bld r10,2 + bst r15,1 + bld r7,2 + bst r6,7 + bld r15,1 + bst r13,5 + bld r6,7 + bst r28,7 + bld r13,5 + bst r9,4 + bld r28,7 + bst r4,2 + bld r9,4 + bst r3,1 + bld r4,2 + bst r22,5 + bld r3,1 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r0,0 + bld r8,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r2,1 + bld r4,0 + bst r14,4 + bld r2,1 + bst r4,3 + bld r14,4 + bst r3,5 + bld r4,3 + bst r28,5 + bld r3,5 + bst r8,4 + bld r28,5 + bst r28,2 + bld r8,4 + bst r7,0 + bld r28,2 + bst r14,1 + bld r7,0 + bst r2,7 + bld r14,1 + bst r25,4 + bld r2,7 + bst r24,3 + bld r25,4 + bst r11,7 + bld r24,3 + bst r13,6 + bld r11,7 + bst r29,3 + bld r13,6 + bst r11,4 + bld r29,3 + bst r12,2 + bld r11,4 + bst r15,2 + bld r12,2 + bst r7,3 + bld r15,2 + bst r15,5 + bld r7,3 + bst r8,7 + bld r15,5 + bst r29,6 + bld r8,7 + bst r13,0 + bld r29,6 + bst r0,0 + bld r13,0 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r6,2 + bld r10,0 + bst r11,1 + bld r6,2 + bst r10,6 + bld r11,1 + bst r9,2 + bld r10,6 + bst r3,2 + bld r9,2 + bst r23,1 + bld r3,2 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r10,3 + bld r24,0 + bst r7,6 + bld r10,3 + bst r25,1 + bld r7,6 + bst r14,7 + bld r25,1 + bst r5,7 + bld r14,7 + bst r9,5 + bld r5,7 + bst r4,6 + bld r9,5 + bst r5,1 + bld r4,6 + bst r6,5 + bld r5,1 + bst r12,5 + bld r6,5 + bst r24,6 + bld r12,5 + bst r13,3 + bld r24,6 + bst r23,7 + bld r13,3 + bst r5,4 + bld r23,7 + bst r8,1 + bld r5,4 + bst r0,0 + bld r8,1 + bst r23,3 + bld r0,0 + bst r3,4 + bld r23,3 + bst r28,1 + bld r3,4 + bst r6,4 + bld r28,1 + bst r12,1 + bld r6,4 + bst r14,6 + bld r12,1 + bst r5,3 + bld r14,6 + bst r7,5 + bld r5,3 + bst r24,5 + bld r7,5 + bst r12,7 + bld r24,5 + bst r25,6 + bld r12,7 + bst r25,3 + bld r25,6 + bst r15,7 + bld r25,3 + bst r9,7 + bld r15,7 + bst r5,6 + bld r9,7 + bst r9,1 + bld r5,6 + bst r2,6 + bld r9,1 + bst r25,0 + bld r2,6 + bst r14,3 + bld r25,0 + bst r3,7 + bld r14,3 + bst r29,5 + bld r3,7 + bst r12,4 + bld r29,5 + bst r24,2 + bld r12,4 + bst r11,3 + bld r24,2 + bst r11,6 + bld r11,3 + bst r13,2 + bld r11,6 + bst r0,0 + bld r13,2 + bst r28,3 + bld r0,0 + bst r7,4 + bld r28,3 + bst r24,1 + bld r7,4 + bst r10,7 + bld r24,1 + bst r9,6 + bld r10,7 + bst r5,2 + bld r9,6 + bst r7,1 + bld r5,2 + bst r14,5 + bld r7,1 + bst r4,7 + bld r14,5 + bst r5,5 + bld r4,7 + bst r8,5 + bld r5,5 + bst r28,6 + bld r8,5 + bst r9,0 + bld r28,6 + bst r2,2 + bld r9,0 + bst r15,0 + bld r2,2 + bst r6,3 + bld r15,0 + bst r11,5 + bld r6,3 + bst r12,6 + bld r11,5 + bst r25,2 + bld r12,6 + bst r15,3 + bld r25,2 + bst r7,7 + bld r15,3 + bst r25,5 + bld r7,7 + bst r24,7 + bld r25,5 + bst r13,7 + bld r24,7 + bst r29,7 + bld r13,7 + bst r13,4 + bld r29,7 + bst r0,0 + bld r13,4 + dec r18 + breq 5389f + rjmp 25b +5389: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent160_permute, .-spongent160_permute + + .text +.global spongent176_permute + .type spongent176_permute, @function +spongent176_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + ldd r16,Z+20 + ldd r17,Z+21 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,90 + ldi r19,69 + ldi r20,162 +27: + eor r22,r19 + eor r17,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r8,1 + bld r6,0 + bst r24,5 + bld r8,1 + bst r6,7 + bld r24,5 + bst r11,5 + bld r6,7 + bst r8,6 + bld r11,5 + bst r17,1 + bld r8,6 + bst r24,7 + bld r17,1 + bst r7,7 + bld r24,7 + bst r15,5 + bld r7,7 + bst r2,7 + bld r15,5 + bst r25,4 + bld r2,7 + bst r10,3 + bld r25,4 + bst r3,6 + bld r10,3 + bst r23,1 + bld r3,6 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r4,3 + bld r24,0 + bst r29,5 + bld r4,3 + bst r12,4 + bld r29,5 + bst r12,2 + bld r12,4 + bst r11,2 + bld r12,2 + bst r7,2 + bld r11,2 + bst r13,1 + bld r7,2 + bst r14,6 + bld r13,1 + bst r23,3 + bld r14,6 + bst r3,4 + bld r23,3 + bst r0,0 + bld r3,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r16,2 + bld r14,0 + bst r13,3 + bld r16,2 + bst r15,6 + bld r13,3 + bst r3,3 + bld r15,6 + bst r17,4 + bld r3,3 + bst r16,3 + bld r17,4 + bst r13,7 + bld r16,3 + bst r25,6 + bld r13,7 + bst r11,3 + bld r25,6 + bst r7,6 + bld r11,3 + bst r15,1 + bld r7,6 + bst r28,7 + bld r15,1 + bst r9,4 + bld r28,7 + bst r28,2 + bld r9,4 + bst r7,0 + bld r28,2 + bst r12,1 + bld r7,0 + bst r10,6 + bld r12,1 + bst r5,2 + bld r10,6 + bst r5,1 + bld r5,2 + bst r4,5 + bld r5,1 + bst r2,5 + bld r4,5 + bst r24,4 + bld r2,5 + bst r6,3 + bld r24,4 + bst r9,5 + bld r6,3 + bst r28,6 + bld r9,5 + bst r9,0 + bld r28,6 + bst r0,0 + bld r9,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r28,1 + bld r4,0 + bst r6,4 + bld r28,1 + bst r10,1 + bld r6,4 + bst r2,6 + bld r10,1 + bst r25,0 + bld r2,6 + bst r8,3 + bld r25,0 + bst r25,5 + bld r8,3 + bst r10,7 + bld r25,5 + bst r5,6 + bld r10,7 + bst r7,1 + bld r5,6 + bst r12,5 + bld r7,1 + bst r12,6 + bld r12,5 + bst r13,2 + bld r12,6 + bst r15,2 + bld r13,2 + bst r29,3 + bld r15,2 + bst r11,4 + bld r29,3 + bst r8,2 + bld r11,4 + bst r25,1 + bld r8,2 + bst r8,7 + bld r25,1 + bst r17,5 + bld r8,7 + bst r16,7 + bld r17,5 + bst r15,7 + bld r16,7 + bst r3,7 + bld r15,7 + bst r23,5 + bld r3,7 + bst r4,4 + bld r23,5 + bst r2,1 + bld r4,4 + bst r14,4 + bld r2,1 + bst r0,0 + bld r14,4 + bst r22,5 + bld r0,0 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r24,1 + bld r8,0 + bst r4,7 + bld r24,1 + bst r3,5 + bld r4,7 + bst r0,0 + bld r3,5 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r2,2 + bld r10,0 + bst r15,0 + bld r2,2 + bst r28,3 + bld r15,0 + bst r7,4 + bld r28,3 + bst r14,1 + bld r7,4 + bst r16,6 + bld r14,1 + bst r15,3 + bld r16,6 + bst r29,7 + bld r15,3 + bst r13,4 + bld r29,7 + bst r24,2 + bld r13,4 + bst r5,3 + bld r24,2 + bst r5,5 + bld r5,3 + bst r6,5 + bld r5,5 + bst r10,5 + bld r6,5 + bst r4,6 + bld r10,5 + bst r3,1 + bld r4,6 + bst r16,4 + bld r3,1 + bst r14,3 + bld r16,4 + bst r17,6 + bld r14,3 + bst r17,3 + bld r17,6 + bst r25,7 + bld r17,3 + bst r11,7 + bld r25,7 + bst r9,6 + bld r11,7 + bst r29,2 + bld r9,6 + bst r11,0 + bld r29,2 + bst r6,2 + bld r11,0 + bst r9,1 + bld r6,2 + bst r0,0 + bld r9,1 + bst r22,7 + bld r0,0 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r10,2 + bld r12,0 + bst r3,2 + bld r10,2 + bst r17,0 + bld r3,2 + bst r24,3 + bld r17,0 + bst r5,7 + bld r24,3 + bst r7,5 + bld r5,7 + bst r14,5 + bld r7,5 + bst r0,0 + bld r14,5 + bst r23,2 + bld r0,0 + bst r3,0 + bld r23,2 + bst r16,0 + bld r3,0 + bst r12,3 + bld r16,0 + bst r11,6 + bld r12,3 + bst r9,2 + bld r11,6 + bst r0,0 + bld r9,2 + bst r23,6 + bld r0,0 + bst r5,0 + bld r23,6 + bst r4,1 + bld r5,0 + bst r28,5 + bld r4,1 + bst r8,4 + bld r28,5 + bst r16,1 + bld r8,4 + bst r12,7 + bld r16,1 + bst r13,6 + bld r12,7 + bst r25,2 + bld r13,6 + bst r9,3 + bld r25,2 + bst r0,0 + bld r9,3 + bst r23,7 + bld r0,0 + bst r5,4 + bld r23,7 + bst r6,1 + bld r5,4 + bst r8,5 + bld r6,1 + bst r16,5 + bld r8,5 + bst r14,7 + bld r16,5 + bst r0,0 + bld r14,7 + bst r29,1 + bld r0,0 + bst r10,4 + bld r29,1 + bst r4,2 + bld r10,4 + bst r0,0 + bld r4,2 + bst r29,6 + bld r0,0 + bst r13,0 + bld r29,6 + bst r14,2 + bld r13,0 + bst r17,2 + bld r14,2 + bst r25,3 + bld r17,2 + bst r9,7 + bld r25,3 + bst r0,0 + bld r9,7 + bst r2,3 + bld r0,0 + bst r15,4 + bld r2,3 + bst r0,0 + bld r15,4 + bst r6,6 + bld r0,0 + bst r11,1 + bld r6,6 + bst r0,0 + bld r11,1 + bst r7,3 + bld r0,0 + bst r13,5 + bld r7,3 + bst r24,6 + bld r13,5 + bst r0,0 + bld r24,6 + dec r18 + breq 5445f + rjmp 27b +5445: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r16 + st X+,r17 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent176_permute, .-spongent176_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.c b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.c new file mode 100644 index 0000000..8e0d57d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.c @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spongent.h" + +#if !defined(__AVR__) + +/** + * \brief Applies the Spongent-pi S-box in parallel to the 8 nibbles + * of a 32-bit word. + * + * \param x3 The input values to the parallel S-boxes. + * + * \return The output values from the parallel S-boxes. + * + * Based on the bit-sliced S-box implementation from here: + * https://github.com/DadaIsCrazy/usuba/blob/master/data/sboxes/spongent.ua + * + * Note that spongent.ua numbers bits from highest to lowest, so x0 is the + * high bit of each nibble and x3 is the low bit. + */ +static uint32_t spongent_sbox(uint32_t x3) +{ + uint32_t q0, q1, q2, q3, t0, t1, t2, t3; + uint32_t x2 = (x3 >> 1); + uint32_t x1 = (x2 >> 1); + uint32_t x0 = (x1 >> 1); + q0 = x0 ^ x2; + q1 = x1 ^ x2; + t0 = q0 & q1; + q2 = ~(x0 ^ x1 ^ x3 ^ t0); + t1 = q2 & ~x0; + q3 = x1 ^ t1; + t2 = q3 & (q3 ^ x2 ^ x3 ^ t0); + t3 = (x2 ^ t0) & ~(x1 ^ t0); + q0 = x1 ^ x2 ^ x3 ^ t2; + q1 = x0 ^ x2 ^ x3 ^ t0 ^ t1; + q2 = x0 ^ x1 ^ x2 ^ t1; + q3 = x0 ^ x3 ^ t0 ^ t3; + return ((q0 << 3) & 0x88888888U) | ((q1 << 2) & 0x44444444U) | + ((q2 << 1) & 0x22222222U) | (q3 & 0x11111111U); +} + +void spongent160_permute(spongent160_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[160] */ + 0x75, 0xae, 0x6a, 0x56, 0x54, 0x2a, 0x29, 0x94, + 0x53, 0xca, 0x27, 0xe4, 0x4f, 0xf2, 0x1f, 0xf8, + 0x3e, 0x7c, 0x7d, 0xbe, 0x7a, 0x5e, 0x74, 0x2e, + 0x68, 0x16, 0x50, 0x0a, 0x21, 0x84, 0x43, 0xc2, + 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, + 0x71, 0x8e, 0x62, 0x46, 0x44, 0x22, 0x09, 0x90, + 0x12, 0x48, 0x24, 0x24, 0x49, 0x92, 0x13, 0xc8, + 0x26, 0x64, 0x4d, 0xb2, 0x1b, 0xd8, 0x36, 0x6c, + 0x6d, 0xb6, 0x5a, 0x5a, 0x35, 0xac, 0x6b, 0xd6, + 0x56, 0x6a, 0x2d, 0xb4, 0x5b, 0xda, 0x37, 0xec, + 0x6f, 0xf6, 0x5e, 0x7a, 0x3d, 0xbc, 0x7b, 0xde, + 0x76, 0x6e, 0x6c, 0x36, 0x58, 0x1a, 0x31, 0x8c, + 0x63, 0xc6, 0x46, 0x62, 0x0d, 0xb0, 0x1a, 0x58, + 0x34, 0x2c, 0x69, 0x96, 0x52, 0x4a, 0x25, 0xa4, + 0x4b, 0xd2, 0x17, 0xe8, 0x2e, 0x74, 0x5d, 0xba, + 0x3b, 0xdc, 0x77, 0xee, 0x6e, 0x76, 0x5c, 0x3a, + 0x39, 0x9c, 0x73, 0xce, 0x66, 0x66, 0x4c, 0x32, + 0x19, 0x98, 0x32, 0x4c, 0x65, 0xa6, 0x4a, 0x52, + 0x15, 0xa8, 0x2a, 0x54, 0x55, 0xaa, 0x2b, 0xd4, + 0x57, 0xea, 0x2f, 0xf4, 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4; + uint32_t t0, t1, t2, t3, t4; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); +#endif + + /* Perform the 80 rounds of Spongent-pi[160] */ + for (round = 0; round < 80; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x4 ^= ((uint32_t)(rc[1])) << 24; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + + /* Permute the bits of the state. Bit i is moved to (40 * i) % 159 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + #define BCP(x, bit) ((x) & (((uint32_t)1) << (bit))) + #define BUP(x, from, to) \ + (((x) << ((to) - (from))) & (((uint32_t)1) << (to))) + #define BDN(x, from, to) \ + (((x) >> ((from) - (to))) & (((uint32_t)1) << (to))) + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 8) ^ BUP(t0, 5, 9) ^ BUP(t0, 9, 10) ^ + BDN(t0, 13, 11) ^ BDN(t0, 17, 12) ^ BDN(t0, 21, 13) ^ + BDN(t0, 25, 14) ^ BDN(t0, 29, 15) ^ BUP(t1, 1, 16) ^ + BUP(t1, 5, 17) ^ BUP(t1, 9, 18) ^ BUP(t1, 13, 19) ^ + BUP(t1, 17, 20) ^ BCP(t1, 21) ^ BDN(t1, 25, 22) ^ + BDN(t1, 29, 23) ^ BUP(t2, 1, 24) ^ BUP(t2, 5, 25) ^ + BUP(t2, 9, 26) ^ BUP(t2, 13, 27) ^ BUP(t2, 17, 28) ^ + BUP(t2, 21, 29) ^ BUP(t2, 25, 30) ^ BUP(t2, 29, 31) ^ + BCP(t4, 0) ^ BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ + BDN(t4, 12, 3) ^ BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ + BDN(t4, 24, 6) ^ BDN(t4, 28, 7); + x2 = BUP(t0, 2, 16) ^ BUP(t0, 6, 17) ^ BUP(t0, 10, 18) ^ + BUP(t0, 14, 19) ^ BUP(t0, 18, 20) ^ BDN(t0, 22, 21) ^ + BDN(t0, 26, 22) ^ BDN(t0, 30, 23) ^ BUP(t1, 2, 24) ^ + BUP(t1, 6, 25) ^ BUP(t1, 10, 26) ^ BUP(t1, 14, 27) ^ + BUP(t1, 18, 28) ^ BUP(t1, 22, 29) ^ BUP(t1, 26, 30) ^ + BUP(t1, 30, 31) ^ BDN(t3, 1, 0) ^ BDN(t3, 5, 1) ^ + BDN(t3, 9, 2) ^ BDN(t3, 13, 3) ^ BDN(t3, 17, 4) ^ + BDN(t3, 21, 5) ^ BDN(t3, 25, 6) ^ BDN(t3, 29, 7) ^ + BUP(t4, 1, 8) ^ BUP(t4, 5, 9) ^ BUP(t4, 9, 10) ^ + BDN(t4, 13, 11) ^ BDN(t4, 17, 12) ^ BDN(t4, 21, 13) ^ + BDN(t4, 25, 14) ^ BDN(t4, 29, 15); + x3 = BUP(t0, 3, 24) ^ BUP(t0, 7, 25) ^ BUP(t0, 11, 26) ^ + BUP(t0, 15, 27) ^ BUP(t0, 19, 28) ^ BUP(t0, 23, 29) ^ + BUP(t0, 27, 30) ^ BCP(t0, 31) ^ BDN(t2, 2, 0) ^ + BDN(t2, 6, 1) ^ BDN(t2, 10, 2) ^ BDN(t2, 14, 3) ^ + BDN(t2, 18, 4) ^ BDN(t2, 22, 5) ^ BDN(t2, 26, 6) ^ + BDN(t2, 30, 7) ^ BUP(t3, 2, 8) ^ BUP(t3, 6, 9) ^ + BCP(t3, 10) ^ BDN(t3, 14, 11) ^ BDN(t3, 18, 12) ^ + BDN(t3, 22, 13) ^ BDN(t3, 26, 14) ^ BDN(t3, 30, 15) ^ + BUP(t4, 2, 16) ^ BUP(t4, 6, 17) ^ BUP(t4, 10, 18) ^ + BUP(t4, 14, 19) ^ BUP(t4, 18, 20) ^ BDN(t4, 22, 21) ^ + BDN(t4, 26, 22) ^ BDN(t4, 30, 23); + x4 = BDN(t1, 3, 0) ^ BDN(t1, 7, 1) ^ BDN(t1, 11, 2) ^ + BDN(t1, 15, 3) ^ BDN(t1, 19, 4) ^ BDN(t1, 23, 5) ^ + BDN(t1, 27, 6) ^ BDN(t1, 31, 7) ^ BUP(t2, 3, 8) ^ + BUP(t2, 7, 9) ^ BDN(t2, 11, 10) ^ BDN(t2, 15, 11) ^ + BDN(t2, 19, 12) ^ BDN(t2, 23, 13) ^ BDN(t2, 27, 14) ^ + BDN(t2, 31, 15) ^ BUP(t3, 3, 16) ^ BUP(t3, 7, 17) ^ + BUP(t3, 11, 18) ^ BUP(t3, 15, 19) ^ BUP(t3, 19, 20) ^ + BDN(t3, 23, 21) ^ BDN(t3, 27, 22) ^ BDN(t3, 31, 23) ^ + BUP(t4, 3, 24) ^ BUP(t4, 7, 25) ^ BUP(t4, 11, 26) ^ + BUP(t4, 15, 27) ^ BUP(t4, 19, 28) ^ BUP(t4, 23, 29) ^ + BUP(t4, 27, 30) ^ BCP(t4, 31); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); +#endif +} + +void spongent176_permute(spongent176_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[176] */ + 0x45, 0xa2, 0x0b, 0xd0, 0x16, 0x68, 0x2c, 0x34, + 0x59, 0x9a, 0x33, 0xcc, 0x67, 0xe6, 0x4e, 0x72, + 0x1d, 0xb8, 0x3a, 0x5c, 0x75, 0xae, 0x6a, 0x56, + 0x54, 0x2a, 0x29, 0x94, 0x53, 0xca, 0x27, 0xe4, + 0x4f, 0xf2, 0x1f, 0xf8, 0x3e, 0x7c, 0x7d, 0xbe, + 0x7a, 0x5e, 0x74, 0x2e, 0x68, 0x16, 0x50, 0x0a, + 0x21, 0x84, 0x43, 0xc2, 0x07, 0xe0, 0x0e, 0x70, + 0x1c, 0x38, 0x38, 0x1c, 0x71, 0x8e, 0x62, 0x46, + 0x44, 0x22, 0x09, 0x90, 0x12, 0x48, 0x24, 0x24, + 0x49, 0x92, 0x13, 0xc8, 0x26, 0x64, 0x4d, 0xb2, + 0x1b, 0xd8, 0x36, 0x6c, 0x6d, 0xb6, 0x5a, 0x5a, + 0x35, 0xac, 0x6b, 0xd6, 0x56, 0x6a, 0x2d, 0xb4, + 0x5b, 0xda, 0x37, 0xec, 0x6f, 0xf6, 0x5e, 0x7a, + 0x3d, 0xbc, 0x7b, 0xde, 0x76, 0x6e, 0x6c, 0x36, + 0x58, 0x1a, 0x31, 0x8c, 0x63, 0xc6, 0x46, 0x62, + 0x0d, 0xb0, 0x1a, 0x58, 0x34, 0x2c, 0x69, 0x96, + 0x52, 0x4a, 0x25, 0xa4, 0x4b, 0xd2, 0x17, 0xe8, + 0x2e, 0x74, 0x5d, 0xba, 0x3b, 0xdc, 0x77, 0xee, + 0x6e, 0x76, 0x5c, 0x3a, 0x39, 0x9c, 0x73, 0xce, + 0x66, 0x66, 0x4c, 0x32, 0x19, 0x98, 0x32, 0x4c, + 0x65, 0xa6, 0x4a, 0x52, 0x15, 0xa8, 0x2a, 0x54, + 0x55, 0xaa, 0x2b, 0xd4, 0x57, 0xea, 0x2f, 0xf4, + 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t t0, t1, t2, t3, t4, t5; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; + x5 = state->W[5]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); + x5 = le_load_word16(state->B + 20); /* Last word is only 16 bits */ +#endif + + /* Perform the 90 rounds of Spongent-pi[176] */ + for (round = 0; round < 90; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x5 ^= ((uint32_t)(rc[1])) << 8; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + t5 = spongent_sbox(x5); + + /* Permute the bits of the state. Bit i is moved to (44 * i) % 175 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 12) ^ BUP(t0, 5, 13) ^ BUP(t0, 9, 14) ^ + BUP(t0, 13, 15) ^ BDN(t0, 17, 16) ^ BDN(t0, 21, 17) ^ + BDN(t0, 25, 18) ^ BDN(t0, 29, 19) ^ BUP(t1, 1, 20) ^ + BUP(t1, 5, 21) ^ BUP(t1, 9, 22) ^ BUP(t1, 13, 23) ^ + BUP(t1, 17, 24) ^ BUP(t1, 21, 25) ^ BUP(t1, 25, 26) ^ + BDN(t1, 29, 27) ^ BUP(t2, 1, 28) ^ BUP(t2, 5, 29) ^ + BUP(t2, 9, 30) ^ BUP(t2, 13, 31) ^ BCP(t4, 0) ^ + BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ BDN(t4, 12, 3) ^ + BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ BDN(t4, 24, 6) ^ + BDN(t4, 28, 7) ^ BUP(t5, 0, 8) ^ BUP(t5, 4, 9) ^ + BUP(t5, 8, 10) ^ BDN(t5, 12, 11); + x2 = BUP(t0, 2, 24) ^ BUP(t0, 6, 25) ^ BUP(t0, 10, 26) ^ + BUP(t0, 14, 27) ^ BUP(t0, 18, 28) ^ BUP(t0, 22, 29) ^ + BUP(t0, 26, 30) ^ BUP(t0, 30, 31) ^ BDN(t2, 17, 0) ^ + BDN(t2, 21, 1) ^ BDN(t2, 25, 2) ^ BDN(t2, 29, 3) ^ + BUP(t3, 1, 4) ^ BCP(t3, 5) ^ BDN(t3, 9, 6) ^ + BDN(t3, 13, 7) ^ BDN(t3, 17, 8) ^ BDN(t3, 21, 9) ^ + BDN(t3, 25, 10) ^ BDN(t3, 29, 11) ^ BUP(t4, 1, 12) ^ + BUP(t4, 5, 13) ^ BUP(t4, 9, 14) ^ BUP(t4, 13, 15) ^ + BDN(t4, 17, 16) ^ BDN(t4, 21, 17) ^ BDN(t4, 25, 18) ^ + BDN(t4, 29, 19) ^ BUP(t5, 1, 20) ^ BUP(t5, 5, 21) ^ + BUP(t5, 9, 22) ^ BUP(t5, 13, 23); + x3 = BDN(t1, 2, 0) ^ BDN(t1, 6, 1) ^ BDN(t1, 10, 2) ^ + BDN(t1, 14, 3) ^ BDN(t1, 18, 4) ^ BDN(t1, 22, 5) ^ + BDN(t1, 26, 6) ^ BDN(t1, 30, 7) ^ BUP(t2, 2, 8) ^ + BUP(t2, 6, 9) ^ BCP(t2, 10) ^ BDN(t2, 14, 11) ^ + BDN(t2, 18, 12) ^ BDN(t2, 22, 13) ^ BDN(t2, 26, 14) ^ + BDN(t2, 30, 15) ^ BUP(t3, 2, 16) ^ BUP(t3, 6, 17) ^ + BUP(t3, 10, 18) ^ BUP(t3, 14, 19) ^ BUP(t3, 18, 20) ^ + BDN(t3, 22, 21) ^ BDN(t3, 26, 22) ^ BDN(t3, 30, 23) ^ + BUP(t4, 2, 24) ^ BUP(t4, 6, 25) ^ BUP(t4, 10, 26) ^ + BUP(t4, 14, 27) ^ BUP(t4, 18, 28) ^ BUP(t4, 22, 29) ^ + BUP(t4, 26, 30) ^ BUP(t4, 30, 31); + x4 = BUP(t0, 3, 4) ^ BDN(t0, 7, 5) ^ BDN(t0, 11, 6) ^ + BDN(t0, 15, 7) ^ BDN(t0, 19, 8) ^ BDN(t0, 23, 9) ^ + BDN(t0, 27, 10) ^ BDN(t0, 31, 11) ^ BUP(t1, 3, 12) ^ + BUP(t1, 7, 13) ^ BUP(t1, 11, 14) ^ BCP(t1, 15) ^ + BDN(t1, 19, 16) ^ BDN(t1, 23, 17) ^ BDN(t1, 27, 18) ^ + BDN(t1, 31, 19) ^ BUP(t2, 3, 20) ^ BUP(t2, 7, 21) ^ + BUP(t2, 11, 22) ^ BUP(t2, 15, 23) ^ BUP(t2, 19, 24) ^ + BUP(t2, 23, 25) ^ BDN(t2, 27, 26) ^ BDN(t2, 31, 27) ^ + BUP(t3, 3, 28) ^ BUP(t3, 7, 29) ^ BUP(t3, 11, 30) ^ + BUP(t3, 15, 31) ^ BDN(t5, 2, 0) ^ BDN(t5, 6, 1) ^ + BDN(t5, 10, 2) ^ BDN(t5, 14, 3); + x5 = BDN(t3, 19, 0) ^ BDN(t3, 23, 1) ^ BDN(t3, 27, 2) ^ + BDN(t3, 31, 3) ^ BUP(t4, 3, 4) ^ BDN(t4, 7, 5) ^ + BDN(t4, 11, 6) ^ BDN(t4, 15, 7) ^ BDN(t4, 19, 8) ^ + BDN(t4, 23, 9) ^ BDN(t4, 27, 10) ^ BDN(t4, 31, 11) ^ + BUP(t5, 3, 12) ^ BUP(t5, 7, 13) ^ BUP(t5, 11, 14) ^ + BCP(t5, 15); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; + state->W[5] = x5; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); + le_store_word16(state->B + 20, x5); /* Last word is only 16 bits */ +#endif +} + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.h new file mode 100644 index 0000000..bb9823f --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-spongent.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPONGENT_H +#define LW_INTERNAL_SPONGENT_H + +#include "internal-util.h" + +/** + * \file internal-spongent.h + * \brief Internal implementation of the Spongent-pi permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the Spongent-pi[160] state in bytes. + */ +#define SPONGENT160_STATE_SIZE 20 + +/** + * \brief Size of the Spongent-pi[176] state in bytes. + */ +#define SPONGENT176_STATE_SIZE 22 + +/** + * \brief Structure of the internal state of the Spongent-pi[160] permutation. + */ +typedef union +{ + uint32_t W[5]; /**< Spongent-pi[160] state as 32-bit words */ + uint8_t B[20]; /**< Spongent-pi[160] state as bytes */ + +} spongent160_state_t; + +/** + * \brief Structure of the internal state of the Spongent-pi[176] permutation. + * + * Note: The state is technically only 176 bits, but we increase it to + * 192 bits so that we can use 32-bit word operations to manipulate the + * state. The extra bits in the last word are fixed to zero. + */ +typedef union +{ + uint32_t W[6]; /**< Spongent-pi[176] state as 32-bit words */ + uint8_t B[24]; /**< Spongent-pi[176] state as bytes */ + +} spongent176_state_t; + +/** + * \brief Permutes the Spongent-pi[160] state. + * + * \param state The Spongent-pi[160] state to be permuted. + */ +void spongent160_permute(spongent160_state_t *state); + +/** + * \brief Permutes the Spongent-pi[176] state. + * + * \param state The Spongent-pi[176] state to be permuted. + */ +void spongent176_permute(spongent176_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-util.h b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant176v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.c b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/api.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.c b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.c new file mode 100644 index 0000000..2f7abb3 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.c @@ -0,0 +1,881 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "elephant.h" +#include "internal-keccak.h" +#include "internal-spongent.h" +#include + +aead_cipher_t const dumbo_cipher = { + "Dumbo", + DUMBO_KEY_SIZE, + DUMBO_NONCE_SIZE, + DUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + dumbo_aead_encrypt, + dumbo_aead_decrypt +}; + +aead_cipher_t const jumbo_cipher = { + "Jumbo", + JUMBO_KEY_SIZE, + JUMBO_NONCE_SIZE, + JUMBO_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + jumbo_aead_encrypt, + jumbo_aead_decrypt +}; + +aead_cipher_t const delirium_cipher = { + "Delirium", + DELIRIUM_KEY_SIZE, + DELIRIUM_NONCE_SIZE, + DELIRIUM_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + delirium_aead_encrypt, + delirium_aead_decrypt +}; + +/** + * \brief Applies the Dumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void dumbo_lfsr + (unsigned char out[SPONGENT160_STATE_SIZE], + const unsigned char in[SPONGENT160_STATE_SIZE]) +{ + unsigned char temp = + leftRotate3_8(in[0]) ^ (in[3] << 7) ^ (in[13] >> 7); + unsigned index; + for (index = 0; index < SPONGENT160_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT160_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Dumbo. + * + * \param state Points to the Spongent-pi[160] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void dumbo_process_ad + (spongent160_state_t *state, + unsigned char mask[SPONGENT160_STATE_SIZE], + unsigned char next[SPONGENT160_STATE_SIZE], + unsigned char tag[DUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + dumbo_lfsr(next, mask); + dumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state->B, npub, DUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT160_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); + dumbo_lfsr(mask, mask); + dumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT160_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent160_permute(state); + lw_xor_block(state->B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state->B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, DUMBO_TAG_SIZE); +} + +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT160_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, SPONGENT160_STATE_SIZE); + + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + mlen -= SPONGENT160_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + dumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT160_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + c += temp; + } else if (*clen != DUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DUMBO_TAG_SIZE); + return 0; +} + +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent160_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT160_STATE_SIZE]; + unsigned char mask[SPONGENT160_STATE_SIZE]; + unsigned char next[SPONGENT160_STATE_SIZE]; + unsigned char tag[DUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DUMBO_TAG_SIZE) + return -1; + *mlen = clen - DUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DUMBO_KEY_SIZE); + memset(state.B + DUMBO_KEY_SIZE, 0, sizeof(state.B) - DUMBO_KEY_SIZE); + spongent160_permute(&state); + memcpy(mask, state.B, DUMBO_KEY_SIZE); + memset(mask + DUMBO_KEY_SIZE, 0, sizeof(mask) - DUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + dumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DUMBO_TAG_SIZE; + while (clen >= SPONGENT160_STATE_SIZE) { + /* Authenticate using the next mask */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT160_STATE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT160_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT160_STATE_SIZE); + c += SPONGENT160_STATE_SIZE; + m += SPONGENT160_STATE_SIZE; + clen -= SPONGENT160_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT160_STATE_SIZE); + lw_xor_block(state.B, npub, DUMBO_NONCE_SIZE); + spongent160_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + dumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT160_STATE_SIZE); + state.B[0] ^= 0x01; + spongent160_permute(&state); + lw_xor_block(state.B, mask, DUMBO_TAG_SIZE); + lw_xor_block(state.B, next, DUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, DUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Jumbo LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void jumbo_lfsr + (unsigned char out[SPONGENT176_STATE_SIZE], + const unsigned char in[SPONGENT176_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ (in[3] << 7) ^ (in[19] >> 7); + unsigned index; + for (index = 0; index < SPONGENT176_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[SPONGENT176_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Jumbo. + * + * \param state Points to the Spongent-pi[170] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void jumbo_process_ad + (spongent176_state_t *state, + unsigned char mask[SPONGENT176_STATE_SIZE], + unsigned char next[SPONGENT176_STATE_SIZE], + unsigned char tag[JUMBO_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + jumbo_lfsr(next, mask); + jumbo_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state->B, npub, JUMBO_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = JUMBO_NONCE_SIZE; + while (adlen > 0) { + size = SPONGENT176_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); + jumbo_lfsr(mask, mask); + jumbo_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, SPONGENT176_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + spongent176_permute(state); + lw_xor_block(state->B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state->B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state->B, JUMBO_TAG_SIZE); +} + +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= SPONGENT176_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, SPONGENT176_STATE_SIZE); + + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + mlen -= SPONGENT176_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + jumbo_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, SPONGENT176_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, next, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + c += temp; + } else if (*clen != JUMBO_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, JUMBO_TAG_SIZE); + return 0; +} + +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + spongent176_state_t state; + unsigned char *mtemp = m; + unsigned char start[SPONGENT176_STATE_SIZE]; + unsigned char mask[SPONGENT176_STATE_SIZE]; + unsigned char next[SPONGENT176_STATE_SIZE]; + unsigned char tag[JUMBO_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < JUMBO_TAG_SIZE) + return -1; + *mlen = clen - JUMBO_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, JUMBO_KEY_SIZE); + memset(state.B + JUMBO_KEY_SIZE, 0, sizeof(state.B) - JUMBO_KEY_SIZE); + spongent176_permute(&state); + memcpy(mask, state.B, JUMBO_KEY_SIZE); + memset(mask + JUMBO_KEY_SIZE, 0, sizeof(mask) - JUMBO_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + jumbo_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= JUMBO_TAG_SIZE; + while (clen >= SPONGENT176_STATE_SIZE) { + /* Authenticate using the next mask */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, SPONGENT176_STATE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, SPONGENT176_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, SPONGENT176_STATE_SIZE); + c += SPONGENT176_STATE_SIZE; + m += SPONGENT176_STATE_SIZE; + clen -= SPONGENT176_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, SPONGENT176_STATE_SIZE); + lw_xor_block(state.B, npub, JUMBO_NONCE_SIZE); + spongent176_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + jumbo_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, SPONGENT176_STATE_SIZE); + state.B[0] ^= 0x01; + spongent176_permute(&state); + lw_xor_block(state.B, mask, JUMBO_TAG_SIZE); + lw_xor_block(state.B, next, JUMBO_TAG_SIZE); + lw_xor_block(tag, state.B, JUMBO_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, JUMBO_TAG_SIZE); +} + +/** + * \brief Applies the Delirium LFSR to the mask. + * + * \param out The output mask. + * \param in The input mask. + */ +static void delirium_lfsr + (unsigned char out[KECCAKP_200_STATE_SIZE], + const unsigned char in[KECCAKP_200_STATE_SIZE]) +{ + unsigned char temp = + leftRotate1_8(in[0]) ^ leftRotate1_8(in[2]) ^ (in[13] << 1); + unsigned index; + for (index = 0; index < KECCAKP_200_STATE_SIZE - 1; ++index) + out[index] = in[index + 1]; + out[KECCAKP_200_STATE_SIZE - 1] = temp; +} + +/** + * \brief Processes the nonce and associated data for Delirium. + * + * \param state Points to the Keccak[200] state. + * \param mask Points to the initial mask value. + * \param next Points to the next mask value. + * \param tag Points to the ongoing tag that is being computed. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void delirium_process_ad + (keccakp_200_state_t *state, + unsigned char mask[KECCAKP_200_STATE_SIZE], + unsigned char next[KECCAKP_200_STATE_SIZE], + unsigned char tag[DELIRIUM_TAG_SIZE], + const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned posn, size; + + /* We need the "previous" and "next" masks in each step. + * Compare the first such values */ + delirium_lfsr(next, mask); + delirium_lfsr(next, next); + + /* Absorb the nonce into the state */ + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state->B, npub, DELIRIUM_NONCE_SIZE); + + /* Absorb the rest of the associated data */ + posn = DELIRIUM_NONCE_SIZE; + while (adlen > 0) { + size = KECCAKP_200_STATE_SIZE - posn; + if (size <= adlen) { + /* Process a complete block */ + lw_xor_block(state->B + posn, ad, size); + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); + delirium_lfsr(mask, mask); + delirium_lfsr(next, next); + lw_xor_block_2_src(state->B, mask, next, KECCAKP_200_STATE_SIZE); + posn = 0; + } else { + /* Process the partial block at the end of the associated data */ + size = (unsigned)adlen; + lw_xor_block(state->B + posn, ad, size); + posn += size; + } + ad += size; + adlen -= size; + } + + /* Pad and absorb the final block */ + state->B[posn] ^= 0x01; + keccakp_200_permute(state); + lw_xor_block(state->B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state->B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state->B, DELIRIUM_TAG_SIZE); +} + +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Encrypt and authenticate the payload */ + while (mlen >= KECCAKP_200_STATE_SIZE) { + /* Encrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, KECCAKP_200_STATE_SIZE); + + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + mlen -= KECCAKP_200_STATE_SIZE; + } + if (mlen > 0) { + /* Encrypt the last block using the current mask */ + unsigned temp = (unsigned)mlen; + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, m, temp); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + memcpy(c, state.B, temp); + + /* Authenticate the last block using the next mask */ + delirium_lfsr(next, mask); + state.B[temp] = 0x01; + memset(state.B + temp + 1, 0, KECCAKP_200_STATE_SIZE - temp - 1); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, next, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + c += temp; + } else if (*clen != DELIRIUM_TAG_SIZE) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Generate the authentication tag */ + memcpy(c, tag, DELIRIUM_TAG_SIZE); + return 0; +} + +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + keccakp_200_state_t state; + unsigned char *mtemp = m; + unsigned char start[KECCAKP_200_STATE_SIZE]; + unsigned char mask[KECCAKP_200_STATE_SIZE]; + unsigned char next[KECCAKP_200_STATE_SIZE]; + unsigned char tag[DELIRIUM_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < DELIRIUM_TAG_SIZE) + return -1; + *mlen = clen - DELIRIUM_TAG_SIZE; + + /* Hash the key and generate the initial mask */ + memcpy(state.B, k, DELIRIUM_KEY_SIZE); + memset(state.B + DELIRIUM_KEY_SIZE, 0, sizeof(state.B) - DELIRIUM_KEY_SIZE); + keccakp_200_permute(&state); + memcpy(mask, state.B, DELIRIUM_KEY_SIZE); + memset(mask + DELIRIUM_KEY_SIZE, 0, sizeof(mask) - DELIRIUM_KEY_SIZE); + memcpy(start, mask, sizeof(mask)); + + /* Tag starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Authenticate the nonce and the associated data */ + delirium_process_ad(&state, mask, next, tag, npub, ad, adlen); + + /* Reset back to the starting mask for the encryption phase */ + memcpy(mask, start, sizeof(mask)); + + /* Decrypt and authenticate the payload */ + clen -= DELIRIUM_TAG_SIZE; + while (clen >= KECCAKP_200_STATE_SIZE) { + /* Authenticate using the next mask */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, KECCAKP_200_STATE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block_2_src(m, state.B, c, KECCAKP_200_STATE_SIZE); + + /* Advance to the next block */ + memcpy(mask, next, KECCAKP_200_STATE_SIZE); + c += KECCAKP_200_STATE_SIZE; + m += KECCAKP_200_STATE_SIZE; + clen -= KECCAKP_200_STATE_SIZE; + } + if (clen > 0) { + /* Authenticate the last block using the next mask */ + unsigned temp = (unsigned)clen; + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, c, temp); + state.B[temp] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + + /* Decrypt the last block using the current mask */ + memcpy(state.B, mask, KECCAKP_200_STATE_SIZE); + lw_xor_block(state.B, npub, DELIRIUM_NONCE_SIZE); + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, temp); + lw_xor_block_2_src(m, state.B, c, temp); + c += temp; + } else if (*mlen != 0) { + /* Pad and authenticate when the last block is aligned */ + delirium_lfsr(next, mask); + lw_xor_block_2_src(state.B, mask, next, KECCAKP_200_STATE_SIZE); + state.B[0] ^= 0x01; + keccakp_200_permute(&state); + lw_xor_block(state.B, mask, DELIRIUM_TAG_SIZE); + lw_xor_block(state.B, next, DELIRIUM_TAG_SIZE); + lw_xor_block(tag, state.B, DELIRIUM_TAG_SIZE); + } + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, tag, c, DELIRIUM_TAG_SIZE); +} diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.h new file mode 100644 index 0000000..f775e3d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/elephant.h @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ELEPHANT_H +#define LWCRYPTO_ELEPHANT_H + +#include "aead-common.h" + +/** + * \file elephant.h + * \brief Elephant authenticated encryption algorithm family. + * + * Elephant is a family of authenticated encryption algorithms based + * around the Spongent-pi and Keccak permutations. + * + * \li Dumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[160] permutation. This is + * the primary member of the family. + * \li Jumbo has a 128-bit key, a 96-bit nonce, and a 64-bit authentication + * tag. It is based around the Spongent-pi[176] permutation. + * \li Delirium has a 128-bit key, a 96-bit nonce, and a 128-bit authentication + * tag. It is based around the Keccak[200] permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Dumbo. + */ +#define DUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Dumbo. + */ +#define DUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Dumbo. + */ +#define DUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Jumbo. + */ +#define JUMBO_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Jumbo. + */ +#define JUMBO_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Jumbo. + */ +#define JUMBO_NONCE_SIZE 12 + +/** + * \brief Size of the key for Delirium. + */ +#define DELIRIUM_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Delirium. + */ +#define DELIRIUM_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Delirium. + */ +#define DELIRIUM_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Dumbo cipher. + */ +extern aead_cipher_t const dumbo_cipher; + +/** + * \brief Meta-information block for the Jumbo cipher. + */ +extern aead_cipher_t const jumbo_cipher; + +/** + * \brief Meta-information block for the Delirium cipher. + */ +extern aead_cipher_t const delirium_cipher; + +/** + * \brief Encrypts and authenticates a packet with Dumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa dumbo_aead_decrypt() + */ +int dumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Dumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa dumbo_aead_encrypt() + */ +int dumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Jumbo. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa jumbo_aead_decrypt() + */ +int jumbo_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Jumbo. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa jumbo_aead_encrypt() + */ +int jumbo_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Delirium. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa delirium_aead_decrypt() + */ +int delirium_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Delirium. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa delirium_aead_encrypt() + */ +int delirium_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/encrypt.c b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..bf6840c --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "elephant.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return delirium_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return delirium_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak-avr.S b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.c b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent-avr.S b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent-avr.S new file mode 100644 index 0000000..4a43458 --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent-avr.S @@ -0,0 +1,1677 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 238 + .byte 237 + .byte 235 + .byte 224 + .byte 226 + .byte 225 + .byte 228 + .byte 239 + .byte 231 + .byte 234 + .byte 232 + .byte 229 + .byte 233 + .byte 236 + .byte 227 + .byte 230 + .byte 222 + .byte 221 + .byte 219 + .byte 208 + .byte 210 + .byte 209 + .byte 212 + .byte 223 + .byte 215 + .byte 218 + .byte 216 + .byte 213 + .byte 217 + .byte 220 + .byte 211 + .byte 214 + .byte 190 + .byte 189 + .byte 187 + .byte 176 + .byte 178 + .byte 177 + .byte 180 + .byte 191 + .byte 183 + .byte 186 + .byte 184 + .byte 181 + .byte 185 + .byte 188 + .byte 179 + .byte 182 + .byte 14 + .byte 13 + .byte 11 + .byte 0 + .byte 2 + .byte 1 + .byte 4 + .byte 15 + .byte 7 + .byte 10 + .byte 8 + .byte 5 + .byte 9 + .byte 12 + .byte 3 + .byte 6 + .byte 46 + .byte 45 + .byte 43 + .byte 32 + .byte 34 + .byte 33 + .byte 36 + .byte 47 + .byte 39 + .byte 42 + .byte 40 + .byte 37 + .byte 41 + .byte 44 + .byte 35 + .byte 38 + .byte 30 + .byte 29 + .byte 27 + .byte 16 + .byte 18 + .byte 17 + .byte 20 + .byte 31 + .byte 23 + .byte 26 + .byte 24 + .byte 21 + .byte 25 + .byte 28 + .byte 19 + .byte 22 + .byte 78 + .byte 77 + .byte 75 + .byte 64 + .byte 66 + .byte 65 + .byte 68 + .byte 79 + .byte 71 + .byte 74 + .byte 72 + .byte 69 + .byte 73 + .byte 76 + .byte 67 + .byte 70 + .byte 254 + .byte 253 + .byte 251 + .byte 240 + .byte 242 + .byte 241 + .byte 244 + .byte 255 + .byte 247 + .byte 250 + .byte 248 + .byte 245 + .byte 249 + .byte 252 + .byte 243 + .byte 246 + .byte 126 + .byte 125 + .byte 123 + .byte 112 + .byte 114 + .byte 113 + .byte 116 + .byte 127 + .byte 119 + .byte 122 + .byte 120 + .byte 117 + .byte 121 + .byte 124 + .byte 115 + .byte 118 + .byte 174 + .byte 173 + .byte 171 + .byte 160 + .byte 162 + .byte 161 + .byte 164 + .byte 175 + .byte 167 + .byte 170 + .byte 168 + .byte 165 + .byte 169 + .byte 172 + .byte 163 + .byte 166 + .byte 142 + .byte 141 + .byte 139 + .byte 128 + .byte 130 + .byte 129 + .byte 132 + .byte 143 + .byte 135 + .byte 138 + .byte 136 + .byte 133 + .byte 137 + .byte 140 + .byte 131 + .byte 134 + .byte 94 + .byte 93 + .byte 91 + .byte 80 + .byte 82 + .byte 81 + .byte 84 + .byte 95 + .byte 87 + .byte 90 + .byte 88 + .byte 85 + .byte 89 + .byte 92 + .byte 83 + .byte 86 + .byte 158 + .byte 157 + .byte 155 + .byte 144 + .byte 146 + .byte 145 + .byte 148 + .byte 159 + .byte 151 + .byte 154 + .byte 152 + .byte 149 + .byte 153 + .byte 156 + .byte 147 + .byte 150 + .byte 206 + .byte 205 + .byte 203 + .byte 192 + .byte 194 + .byte 193 + .byte 196 + .byte 207 + .byte 199 + .byte 202 + .byte 200 + .byte 197 + .byte 201 + .byte 204 + .byte 195 + .byte 198 + .byte 62 + .byte 61 + .byte 59 + .byte 48 + .byte 50 + .byte 49 + .byte 52 + .byte 63 + .byte 55 + .byte 58 + .byte 56 + .byte 53 + .byte 57 + .byte 60 + .byte 51 + .byte 54 + .byte 110 + .byte 109 + .byte 107 + .byte 96 + .byte 98 + .byte 97 + .byte 100 + .byte 111 + .byte 103 + .byte 106 + .byte 104 + .byte 101 + .byte 105 + .byte 108 + .byte 99 + .byte 102 + + .text +.global spongent160_permute + .type spongent160_permute, @function +spongent160_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 +.L__stack_usage = 16 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,80 + ldi r19,117 + ldi r20,174 +25: + eor r22,r19 + eor r25,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r10,1 + bld r6,0 + bst r6,6 + bld r10,1 + bst r13,1 + bld r6,6 + bst r22,7 + bld r13,1 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r14,2 + bld r12,0 + bst r3,3 + bld r14,2 + bst r23,5 + bld r3,3 + bst r4,4 + bld r23,5 + bst r4,1 + bld r4,4 + bst r2,5 + bld r4,1 + bst r24,4 + bld r2,5 + bst r12,3 + bld r24,4 + bst r15,6 + bld r12,3 + bst r9,3 + bld r15,6 + bst r3,6 + bld r9,3 + bst r29,1 + bld r3,6 + bst r10,4 + bld r29,1 + bst r8,2 + bld r10,4 + bst r23,2 + bld r8,2 + bst r3,0 + bld r23,2 + bst r0,0 + bld r3,0 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r2,3 + bld r14,0 + bst r15,4 + bld r2,3 + bst r8,3 + bld r15,4 + bst r23,6 + bld r8,3 + bst r5,0 + bld r23,6 + bst r6,1 + bld r5,0 + bst r10,5 + bld r6,1 + bst r8,6 + bld r10,5 + bst r29,2 + bld r8,6 + bst r11,0 + bld r29,2 + bst r10,2 + bld r11,0 + bst r7,2 + bld r10,2 + bst r15,1 + bld r7,2 + bst r6,7 + bld r15,1 + bst r13,5 + bld r6,7 + bst r28,7 + bld r13,5 + bst r9,4 + bld r28,7 + bst r4,2 + bld r9,4 + bst r3,1 + bld r4,2 + bst r22,5 + bld r3,1 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r0,0 + bld r8,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r2,1 + bld r4,0 + bst r14,4 + bld r2,1 + bst r4,3 + bld r14,4 + bst r3,5 + bld r4,3 + bst r28,5 + bld r3,5 + bst r8,4 + bld r28,5 + bst r28,2 + bld r8,4 + bst r7,0 + bld r28,2 + bst r14,1 + bld r7,0 + bst r2,7 + bld r14,1 + bst r25,4 + bld r2,7 + bst r24,3 + bld r25,4 + bst r11,7 + bld r24,3 + bst r13,6 + bld r11,7 + bst r29,3 + bld r13,6 + bst r11,4 + bld r29,3 + bst r12,2 + bld r11,4 + bst r15,2 + bld r12,2 + bst r7,3 + bld r15,2 + bst r15,5 + bld r7,3 + bst r8,7 + bld r15,5 + bst r29,6 + bld r8,7 + bst r13,0 + bld r29,6 + bst r0,0 + bld r13,0 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r6,2 + bld r10,0 + bst r11,1 + bld r6,2 + bst r10,6 + bld r11,1 + bst r9,2 + bld r10,6 + bst r3,2 + bld r9,2 + bst r23,1 + bld r3,2 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r10,3 + bld r24,0 + bst r7,6 + bld r10,3 + bst r25,1 + bld r7,6 + bst r14,7 + bld r25,1 + bst r5,7 + bld r14,7 + bst r9,5 + bld r5,7 + bst r4,6 + bld r9,5 + bst r5,1 + bld r4,6 + bst r6,5 + bld r5,1 + bst r12,5 + bld r6,5 + bst r24,6 + bld r12,5 + bst r13,3 + bld r24,6 + bst r23,7 + bld r13,3 + bst r5,4 + bld r23,7 + bst r8,1 + bld r5,4 + bst r0,0 + bld r8,1 + bst r23,3 + bld r0,0 + bst r3,4 + bld r23,3 + bst r28,1 + bld r3,4 + bst r6,4 + bld r28,1 + bst r12,1 + bld r6,4 + bst r14,6 + bld r12,1 + bst r5,3 + bld r14,6 + bst r7,5 + bld r5,3 + bst r24,5 + bld r7,5 + bst r12,7 + bld r24,5 + bst r25,6 + bld r12,7 + bst r25,3 + bld r25,6 + bst r15,7 + bld r25,3 + bst r9,7 + bld r15,7 + bst r5,6 + bld r9,7 + bst r9,1 + bld r5,6 + bst r2,6 + bld r9,1 + bst r25,0 + bld r2,6 + bst r14,3 + bld r25,0 + bst r3,7 + bld r14,3 + bst r29,5 + bld r3,7 + bst r12,4 + bld r29,5 + bst r24,2 + bld r12,4 + bst r11,3 + bld r24,2 + bst r11,6 + bld r11,3 + bst r13,2 + bld r11,6 + bst r0,0 + bld r13,2 + bst r28,3 + bld r0,0 + bst r7,4 + bld r28,3 + bst r24,1 + bld r7,4 + bst r10,7 + bld r24,1 + bst r9,6 + bld r10,7 + bst r5,2 + bld r9,6 + bst r7,1 + bld r5,2 + bst r14,5 + bld r7,1 + bst r4,7 + bld r14,5 + bst r5,5 + bld r4,7 + bst r8,5 + bld r5,5 + bst r28,6 + bld r8,5 + bst r9,0 + bld r28,6 + bst r2,2 + bld r9,0 + bst r15,0 + bld r2,2 + bst r6,3 + bld r15,0 + bst r11,5 + bld r6,3 + bst r12,6 + bld r11,5 + bst r25,2 + bld r12,6 + bst r15,3 + bld r25,2 + bst r7,7 + bld r15,3 + bst r25,5 + bld r7,7 + bst r24,7 + bld r25,5 + bst r13,7 + bld r24,7 + bst r29,7 + bld r13,7 + bst r13,4 + bld r29,7 + bst r0,0 + bld r13,4 + dec r18 + breq 5389f + rjmp 25b +5389: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent160_permute, .-spongent160_permute + + .text +.global spongent176_permute + .type spongent176_permute, @function +spongent176_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + ldd r10,Z+12 + ldd r11,Z+13 + ldd r12,Z+14 + ldd r13,Z+15 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r24,Z+18 + ldd r25,Z+19 + ldd r16,Z+20 + ldd r17,Z+21 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r21,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r21 +#endif + ldi r18,90 + ldi r19,69 + ldi r20,162 +27: + eor r22,r19 + eor r17,r20 + lsl r19 + bst r19,7 + bld r19,0 + mov r0,r1 + bst r19,6 + bld r0,0 + eor r19,r0 + andi r19,127 + lsr r20 + bst r20,0 + bld r20,7 + mov r0,r1 + bst r20,1 + bld r0,7 + eor r20,r0 + andi r20,254 + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r28 +#if defined(RAMPZ) + elpm r28,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r28,Z +#elif defined(__AVR_TINY__) + ld r28,Z +#else + lpm + mov r28,r0 +#endif + mov r30,r29 +#if defined(RAMPZ) + elpm r29,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r29,Z +#elif defined(__AVR_TINY__) + ld r29,Z +#else + lpm + mov r29,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r28,0 + bld r22,4 + bst r6,0 + bld r28,0 + bst r8,1 + bld r6,0 + bst r24,5 + bld r8,1 + bst r6,7 + bld r24,5 + bst r11,5 + bld r6,7 + bst r8,6 + bld r11,5 + bst r17,1 + bld r8,6 + bst r24,7 + bld r17,1 + bst r7,7 + bld r24,7 + bst r15,5 + bld r7,7 + bst r2,7 + bld r15,5 + bst r25,4 + bld r2,7 + bst r10,3 + bld r25,4 + bst r3,6 + bld r10,3 + bst r23,1 + bld r3,6 + bst r2,4 + bld r23,1 + bst r24,0 + bld r2,4 + bst r4,3 + bld r24,0 + bst r29,5 + bld r4,3 + bst r12,4 + bld r29,5 + bst r12,2 + bld r12,4 + bst r11,2 + bld r12,2 + bst r7,2 + bld r11,2 + bst r13,1 + bld r7,2 + bst r14,6 + bld r13,1 + bst r23,3 + bld r14,6 + bst r3,4 + bld r23,3 + bst r0,0 + bld r3,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r2,0 + bld r23,0 + bst r14,0 + bld r2,0 + bst r16,2 + bld r14,0 + bst r13,3 + bld r16,2 + bst r15,6 + bld r13,3 + bst r3,3 + bld r15,6 + bst r17,4 + bld r3,3 + bst r16,3 + bld r17,4 + bst r13,7 + bld r16,3 + bst r25,6 + bld r13,7 + bst r11,3 + bld r25,6 + bst r7,6 + bld r11,3 + bst r15,1 + bld r7,6 + bst r28,7 + bld r15,1 + bst r9,4 + bld r28,7 + bst r28,2 + bld r9,4 + bst r7,0 + bld r28,2 + bst r12,1 + bld r7,0 + bst r10,6 + bld r12,1 + bst r5,2 + bld r10,6 + bst r5,1 + bld r5,2 + bst r4,5 + bld r5,1 + bst r2,5 + bld r4,5 + bst r24,4 + bld r2,5 + bst r6,3 + bld r24,4 + bst r9,5 + bld r6,3 + bst r28,6 + bld r9,5 + bst r9,0 + bld r28,6 + bst r0,0 + bld r9,0 + bst r22,3 + bld r0,0 + bst r23,4 + bld r22,3 + bst r4,0 + bld r23,4 + bst r28,1 + bld r4,0 + bst r6,4 + bld r28,1 + bst r10,1 + bld r6,4 + bst r2,6 + bld r10,1 + bst r25,0 + bld r2,6 + bst r8,3 + bld r25,0 + bst r25,5 + bld r8,3 + bst r10,7 + bld r25,5 + bst r5,6 + bld r10,7 + bst r7,1 + bld r5,6 + bst r12,5 + bld r7,1 + bst r12,6 + bld r12,5 + bst r13,2 + bld r12,6 + bst r15,2 + bld r13,2 + bst r29,3 + bld r15,2 + bst r11,4 + bld r29,3 + bst r8,2 + bld r11,4 + bst r25,1 + bld r8,2 + bst r8,7 + bld r25,1 + bst r17,5 + bld r8,7 + bst r16,7 + bld r17,5 + bst r15,7 + bld r16,7 + bst r3,7 + bld r15,7 + bst r23,5 + bld r3,7 + bst r4,4 + bld r23,5 + bst r2,1 + bld r4,4 + bst r14,4 + bld r2,1 + bst r0,0 + bld r14,4 + bst r22,5 + bld r0,0 + bst r28,4 + bld r22,5 + bst r8,0 + bld r28,4 + bst r24,1 + bld r8,0 + bst r4,7 + bld r24,1 + bst r3,5 + bld r4,7 + bst r0,0 + bld r3,5 + bst r22,6 + bld r0,0 + bst r29,0 + bld r22,6 + bst r10,0 + bld r29,0 + bst r2,2 + bld r10,0 + bst r15,0 + bld r2,2 + bst r28,3 + bld r15,0 + bst r7,4 + bld r28,3 + bst r14,1 + bld r7,4 + bst r16,6 + bld r14,1 + bst r15,3 + bld r16,6 + bst r29,7 + bld r15,3 + bst r13,4 + bld r29,7 + bst r24,2 + bld r13,4 + bst r5,3 + bld r24,2 + bst r5,5 + bld r5,3 + bst r6,5 + bld r5,5 + bst r10,5 + bld r6,5 + bst r4,6 + bld r10,5 + bst r3,1 + bld r4,6 + bst r16,4 + bld r3,1 + bst r14,3 + bld r16,4 + bst r17,6 + bld r14,3 + bst r17,3 + bld r17,6 + bst r25,7 + bld r17,3 + bst r11,7 + bld r25,7 + bst r9,6 + bld r11,7 + bst r29,2 + bld r9,6 + bst r11,0 + bld r29,2 + bst r6,2 + bld r11,0 + bst r9,1 + bld r6,2 + bst r0,0 + bld r9,1 + bst r22,7 + bld r0,0 + bst r29,4 + bld r22,7 + bst r12,0 + bld r29,4 + bst r10,2 + bld r12,0 + bst r3,2 + bld r10,2 + bst r17,0 + bld r3,2 + bst r24,3 + bld r17,0 + bst r5,7 + bld r24,3 + bst r7,5 + bld r5,7 + bst r14,5 + bld r7,5 + bst r0,0 + bld r14,5 + bst r23,2 + bld r0,0 + bst r3,0 + bld r23,2 + bst r16,0 + bld r3,0 + bst r12,3 + bld r16,0 + bst r11,6 + bld r12,3 + bst r9,2 + bld r11,6 + bst r0,0 + bld r9,2 + bst r23,6 + bld r0,0 + bst r5,0 + bld r23,6 + bst r4,1 + bld r5,0 + bst r28,5 + bld r4,1 + bst r8,4 + bld r28,5 + bst r16,1 + bld r8,4 + bst r12,7 + bld r16,1 + bst r13,6 + bld r12,7 + bst r25,2 + bld r13,6 + bst r9,3 + bld r25,2 + bst r0,0 + bld r9,3 + bst r23,7 + bld r0,0 + bst r5,4 + bld r23,7 + bst r6,1 + bld r5,4 + bst r8,5 + bld r6,1 + bst r16,5 + bld r8,5 + bst r14,7 + bld r16,5 + bst r0,0 + bld r14,7 + bst r29,1 + bld r0,0 + bst r10,4 + bld r29,1 + bst r4,2 + bld r10,4 + bst r0,0 + bld r4,2 + bst r29,6 + bld r0,0 + bst r13,0 + bld r29,6 + bst r14,2 + bld r13,0 + bst r17,2 + bld r14,2 + bst r25,3 + bld r17,2 + bst r9,7 + bld r25,3 + bst r0,0 + bld r9,7 + bst r2,3 + bld r0,0 + bst r15,4 + bld r2,3 + bst r0,0 + bld r15,4 + bst r6,6 + bld r0,0 + bst r11,1 + bld r6,6 + bst r0,0 + bld r11,1 + bst r7,3 + bld r0,0 + bst r13,5 + bld r7,3 + bst r24,6 + bld r13,5 + bst r0,0 + bld r24,6 + dec r18 + breq 5445f + rjmp 27b +5445: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + st X+,r22 + st X+,r23 + st X+,r28 + st X+,r29 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + st X+,r24 + st X+,r25 + st X+,r16 + st X+,r17 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size spongent176_permute, .-spongent176_permute + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.c b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.c new file mode 100644 index 0000000..8e0d57d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.c @@ -0,0 +1,350 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spongent.h" + +#if !defined(__AVR__) + +/** + * \brief Applies the Spongent-pi S-box in parallel to the 8 nibbles + * of a 32-bit word. + * + * \param x3 The input values to the parallel S-boxes. + * + * \return The output values from the parallel S-boxes. + * + * Based on the bit-sliced S-box implementation from here: + * https://github.com/DadaIsCrazy/usuba/blob/master/data/sboxes/spongent.ua + * + * Note that spongent.ua numbers bits from highest to lowest, so x0 is the + * high bit of each nibble and x3 is the low bit. + */ +static uint32_t spongent_sbox(uint32_t x3) +{ + uint32_t q0, q1, q2, q3, t0, t1, t2, t3; + uint32_t x2 = (x3 >> 1); + uint32_t x1 = (x2 >> 1); + uint32_t x0 = (x1 >> 1); + q0 = x0 ^ x2; + q1 = x1 ^ x2; + t0 = q0 & q1; + q2 = ~(x0 ^ x1 ^ x3 ^ t0); + t1 = q2 & ~x0; + q3 = x1 ^ t1; + t2 = q3 & (q3 ^ x2 ^ x3 ^ t0); + t3 = (x2 ^ t0) & ~(x1 ^ t0); + q0 = x1 ^ x2 ^ x3 ^ t2; + q1 = x0 ^ x2 ^ x3 ^ t0 ^ t1; + q2 = x0 ^ x1 ^ x2 ^ t1; + q3 = x0 ^ x3 ^ t0 ^ t3; + return ((q0 << 3) & 0x88888888U) | ((q1 << 2) & 0x44444444U) | + ((q2 << 1) & 0x22222222U) | (q3 & 0x11111111U); +} + +void spongent160_permute(spongent160_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[160] */ + 0x75, 0xae, 0x6a, 0x56, 0x54, 0x2a, 0x29, 0x94, + 0x53, 0xca, 0x27, 0xe4, 0x4f, 0xf2, 0x1f, 0xf8, + 0x3e, 0x7c, 0x7d, 0xbe, 0x7a, 0x5e, 0x74, 0x2e, + 0x68, 0x16, 0x50, 0x0a, 0x21, 0x84, 0x43, 0xc2, + 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, + 0x71, 0x8e, 0x62, 0x46, 0x44, 0x22, 0x09, 0x90, + 0x12, 0x48, 0x24, 0x24, 0x49, 0x92, 0x13, 0xc8, + 0x26, 0x64, 0x4d, 0xb2, 0x1b, 0xd8, 0x36, 0x6c, + 0x6d, 0xb6, 0x5a, 0x5a, 0x35, 0xac, 0x6b, 0xd6, + 0x56, 0x6a, 0x2d, 0xb4, 0x5b, 0xda, 0x37, 0xec, + 0x6f, 0xf6, 0x5e, 0x7a, 0x3d, 0xbc, 0x7b, 0xde, + 0x76, 0x6e, 0x6c, 0x36, 0x58, 0x1a, 0x31, 0x8c, + 0x63, 0xc6, 0x46, 0x62, 0x0d, 0xb0, 0x1a, 0x58, + 0x34, 0x2c, 0x69, 0x96, 0x52, 0x4a, 0x25, 0xa4, + 0x4b, 0xd2, 0x17, 0xe8, 0x2e, 0x74, 0x5d, 0xba, + 0x3b, 0xdc, 0x77, 0xee, 0x6e, 0x76, 0x5c, 0x3a, + 0x39, 0x9c, 0x73, 0xce, 0x66, 0x66, 0x4c, 0x32, + 0x19, 0x98, 0x32, 0x4c, 0x65, 0xa6, 0x4a, 0x52, + 0x15, 0xa8, 0x2a, 0x54, 0x55, 0xaa, 0x2b, 0xd4, + 0x57, 0xea, 0x2f, 0xf4, 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4; + uint32_t t0, t1, t2, t3, t4; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); +#endif + + /* Perform the 80 rounds of Spongent-pi[160] */ + for (round = 0; round < 80; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x4 ^= ((uint32_t)(rc[1])) << 24; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + + /* Permute the bits of the state. Bit i is moved to (40 * i) % 159 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + #define BCP(x, bit) ((x) & (((uint32_t)1) << (bit))) + #define BUP(x, from, to) \ + (((x) << ((to) - (from))) & (((uint32_t)1) << (to))) + #define BDN(x, from, to) \ + (((x) >> ((from) - (to))) & (((uint32_t)1) << (to))) + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 8) ^ BUP(t0, 5, 9) ^ BUP(t0, 9, 10) ^ + BDN(t0, 13, 11) ^ BDN(t0, 17, 12) ^ BDN(t0, 21, 13) ^ + BDN(t0, 25, 14) ^ BDN(t0, 29, 15) ^ BUP(t1, 1, 16) ^ + BUP(t1, 5, 17) ^ BUP(t1, 9, 18) ^ BUP(t1, 13, 19) ^ + BUP(t1, 17, 20) ^ BCP(t1, 21) ^ BDN(t1, 25, 22) ^ + BDN(t1, 29, 23) ^ BUP(t2, 1, 24) ^ BUP(t2, 5, 25) ^ + BUP(t2, 9, 26) ^ BUP(t2, 13, 27) ^ BUP(t2, 17, 28) ^ + BUP(t2, 21, 29) ^ BUP(t2, 25, 30) ^ BUP(t2, 29, 31) ^ + BCP(t4, 0) ^ BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ + BDN(t4, 12, 3) ^ BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ + BDN(t4, 24, 6) ^ BDN(t4, 28, 7); + x2 = BUP(t0, 2, 16) ^ BUP(t0, 6, 17) ^ BUP(t0, 10, 18) ^ + BUP(t0, 14, 19) ^ BUP(t0, 18, 20) ^ BDN(t0, 22, 21) ^ + BDN(t0, 26, 22) ^ BDN(t0, 30, 23) ^ BUP(t1, 2, 24) ^ + BUP(t1, 6, 25) ^ BUP(t1, 10, 26) ^ BUP(t1, 14, 27) ^ + BUP(t1, 18, 28) ^ BUP(t1, 22, 29) ^ BUP(t1, 26, 30) ^ + BUP(t1, 30, 31) ^ BDN(t3, 1, 0) ^ BDN(t3, 5, 1) ^ + BDN(t3, 9, 2) ^ BDN(t3, 13, 3) ^ BDN(t3, 17, 4) ^ + BDN(t3, 21, 5) ^ BDN(t3, 25, 6) ^ BDN(t3, 29, 7) ^ + BUP(t4, 1, 8) ^ BUP(t4, 5, 9) ^ BUP(t4, 9, 10) ^ + BDN(t4, 13, 11) ^ BDN(t4, 17, 12) ^ BDN(t4, 21, 13) ^ + BDN(t4, 25, 14) ^ BDN(t4, 29, 15); + x3 = BUP(t0, 3, 24) ^ BUP(t0, 7, 25) ^ BUP(t0, 11, 26) ^ + BUP(t0, 15, 27) ^ BUP(t0, 19, 28) ^ BUP(t0, 23, 29) ^ + BUP(t0, 27, 30) ^ BCP(t0, 31) ^ BDN(t2, 2, 0) ^ + BDN(t2, 6, 1) ^ BDN(t2, 10, 2) ^ BDN(t2, 14, 3) ^ + BDN(t2, 18, 4) ^ BDN(t2, 22, 5) ^ BDN(t2, 26, 6) ^ + BDN(t2, 30, 7) ^ BUP(t3, 2, 8) ^ BUP(t3, 6, 9) ^ + BCP(t3, 10) ^ BDN(t3, 14, 11) ^ BDN(t3, 18, 12) ^ + BDN(t3, 22, 13) ^ BDN(t3, 26, 14) ^ BDN(t3, 30, 15) ^ + BUP(t4, 2, 16) ^ BUP(t4, 6, 17) ^ BUP(t4, 10, 18) ^ + BUP(t4, 14, 19) ^ BUP(t4, 18, 20) ^ BDN(t4, 22, 21) ^ + BDN(t4, 26, 22) ^ BDN(t4, 30, 23); + x4 = BDN(t1, 3, 0) ^ BDN(t1, 7, 1) ^ BDN(t1, 11, 2) ^ + BDN(t1, 15, 3) ^ BDN(t1, 19, 4) ^ BDN(t1, 23, 5) ^ + BDN(t1, 27, 6) ^ BDN(t1, 31, 7) ^ BUP(t2, 3, 8) ^ + BUP(t2, 7, 9) ^ BDN(t2, 11, 10) ^ BDN(t2, 15, 11) ^ + BDN(t2, 19, 12) ^ BDN(t2, 23, 13) ^ BDN(t2, 27, 14) ^ + BDN(t2, 31, 15) ^ BUP(t3, 3, 16) ^ BUP(t3, 7, 17) ^ + BUP(t3, 11, 18) ^ BUP(t3, 15, 19) ^ BUP(t3, 19, 20) ^ + BDN(t3, 23, 21) ^ BDN(t3, 27, 22) ^ BDN(t3, 31, 23) ^ + BUP(t4, 3, 24) ^ BUP(t4, 7, 25) ^ BUP(t4, 11, 26) ^ + BUP(t4, 15, 27) ^ BUP(t4, 19, 28) ^ BUP(t4, 23, 29) ^ + BUP(t4, 27, 30) ^ BCP(t4, 31); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); +#endif +} + +void spongent176_permute(spongent176_state_t *state) +{ + static uint8_t const RC[] = { + /* Round constants for Spongent-pi[176] */ + 0x45, 0xa2, 0x0b, 0xd0, 0x16, 0x68, 0x2c, 0x34, + 0x59, 0x9a, 0x33, 0xcc, 0x67, 0xe6, 0x4e, 0x72, + 0x1d, 0xb8, 0x3a, 0x5c, 0x75, 0xae, 0x6a, 0x56, + 0x54, 0x2a, 0x29, 0x94, 0x53, 0xca, 0x27, 0xe4, + 0x4f, 0xf2, 0x1f, 0xf8, 0x3e, 0x7c, 0x7d, 0xbe, + 0x7a, 0x5e, 0x74, 0x2e, 0x68, 0x16, 0x50, 0x0a, + 0x21, 0x84, 0x43, 0xc2, 0x07, 0xe0, 0x0e, 0x70, + 0x1c, 0x38, 0x38, 0x1c, 0x71, 0x8e, 0x62, 0x46, + 0x44, 0x22, 0x09, 0x90, 0x12, 0x48, 0x24, 0x24, + 0x49, 0x92, 0x13, 0xc8, 0x26, 0x64, 0x4d, 0xb2, + 0x1b, 0xd8, 0x36, 0x6c, 0x6d, 0xb6, 0x5a, 0x5a, + 0x35, 0xac, 0x6b, 0xd6, 0x56, 0x6a, 0x2d, 0xb4, + 0x5b, 0xda, 0x37, 0xec, 0x6f, 0xf6, 0x5e, 0x7a, + 0x3d, 0xbc, 0x7b, 0xde, 0x76, 0x6e, 0x6c, 0x36, + 0x58, 0x1a, 0x31, 0x8c, 0x63, 0xc6, 0x46, 0x62, + 0x0d, 0xb0, 0x1a, 0x58, 0x34, 0x2c, 0x69, 0x96, + 0x52, 0x4a, 0x25, 0xa4, 0x4b, 0xd2, 0x17, 0xe8, + 0x2e, 0x74, 0x5d, 0xba, 0x3b, 0xdc, 0x77, 0xee, + 0x6e, 0x76, 0x5c, 0x3a, 0x39, 0x9c, 0x73, 0xce, + 0x66, 0x66, 0x4c, 0x32, 0x19, 0x98, 0x32, 0x4c, + 0x65, 0xa6, 0x4a, 0x52, 0x15, 0xa8, 0x2a, 0x54, + 0x55, 0xaa, 0x2b, 0xd4, 0x57, 0xea, 0x2f, 0xf4, + 0x5f, 0xfa, 0x3f, 0xfc + }; + const uint8_t *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t t0, t1, t2, t3, t4, t5; + uint8_t round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = state->W[0]; + x1 = state->W[1]; + x2 = state->W[2]; + x3 = state->W[3]; + x4 = state->W[4]; + x5 = state->W[5]; +#else + x0 = le_load_word32(state->B); + x1 = le_load_word32(state->B + 4); + x2 = le_load_word32(state->B + 8); + x3 = le_load_word32(state->B + 12); + x4 = le_load_word32(state->B + 16); + x5 = le_load_word16(state->B + 20); /* Last word is only 16 bits */ +#endif + + /* Perform the 90 rounds of Spongent-pi[176] */ + for (round = 0; round < 90; ++round, rc += 2) { + /* Add the round constant to front and back of the state */ + x0 ^= rc[0]; + x5 ^= ((uint32_t)(rc[1])) << 8; + + /* Apply the S-box to all 4-bit groups in the state */ + t0 = spongent_sbox(x0); + t1 = spongent_sbox(x1); + t2 = spongent_sbox(x2); + t3 = spongent_sbox(x3); + t4 = spongent_sbox(x4); + t5 = spongent_sbox(x5); + + /* Permute the bits of the state. Bit i is moved to (44 * i) % 175 + * for all bits except the last which is left where it is. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + x0 = BCP(t0, 0) ^ BDN(t0, 4, 1) ^ BDN(t0, 8, 2) ^ + BDN(t0, 12, 3) ^ BDN(t0, 16, 4) ^ BDN(t0, 20, 5) ^ + BDN(t0, 24, 6) ^ BDN(t0, 28, 7) ^ BUP(t1, 0, 8) ^ + BUP(t1, 4, 9) ^ BUP(t1, 8, 10) ^ BDN(t1, 12, 11) ^ + BDN(t1, 16, 12) ^ BDN(t1, 20, 13) ^ BDN(t1, 24, 14) ^ + BDN(t1, 28, 15) ^ BUP(t2, 0, 16) ^ BUP(t2, 4, 17) ^ + BUP(t2, 8, 18) ^ BUP(t2, 12, 19) ^ BUP(t2, 16, 20) ^ + BUP(t2, 20, 21) ^ BDN(t2, 24, 22) ^ BDN(t2, 28, 23) ^ + BUP(t3, 0, 24) ^ BUP(t3, 4, 25) ^ BUP(t3, 8, 26) ^ + BUP(t3, 12, 27) ^ BUP(t3, 16, 28) ^ BUP(t3, 20, 29) ^ + BUP(t3, 24, 30) ^ BUP(t3, 28, 31); + x1 = BUP(t0, 1, 12) ^ BUP(t0, 5, 13) ^ BUP(t0, 9, 14) ^ + BUP(t0, 13, 15) ^ BDN(t0, 17, 16) ^ BDN(t0, 21, 17) ^ + BDN(t0, 25, 18) ^ BDN(t0, 29, 19) ^ BUP(t1, 1, 20) ^ + BUP(t1, 5, 21) ^ BUP(t1, 9, 22) ^ BUP(t1, 13, 23) ^ + BUP(t1, 17, 24) ^ BUP(t1, 21, 25) ^ BUP(t1, 25, 26) ^ + BDN(t1, 29, 27) ^ BUP(t2, 1, 28) ^ BUP(t2, 5, 29) ^ + BUP(t2, 9, 30) ^ BUP(t2, 13, 31) ^ BCP(t4, 0) ^ + BDN(t4, 4, 1) ^ BDN(t4, 8, 2) ^ BDN(t4, 12, 3) ^ + BDN(t4, 16, 4) ^ BDN(t4, 20, 5) ^ BDN(t4, 24, 6) ^ + BDN(t4, 28, 7) ^ BUP(t5, 0, 8) ^ BUP(t5, 4, 9) ^ + BUP(t5, 8, 10) ^ BDN(t5, 12, 11); + x2 = BUP(t0, 2, 24) ^ BUP(t0, 6, 25) ^ BUP(t0, 10, 26) ^ + BUP(t0, 14, 27) ^ BUP(t0, 18, 28) ^ BUP(t0, 22, 29) ^ + BUP(t0, 26, 30) ^ BUP(t0, 30, 31) ^ BDN(t2, 17, 0) ^ + BDN(t2, 21, 1) ^ BDN(t2, 25, 2) ^ BDN(t2, 29, 3) ^ + BUP(t3, 1, 4) ^ BCP(t3, 5) ^ BDN(t3, 9, 6) ^ + BDN(t3, 13, 7) ^ BDN(t3, 17, 8) ^ BDN(t3, 21, 9) ^ + BDN(t3, 25, 10) ^ BDN(t3, 29, 11) ^ BUP(t4, 1, 12) ^ + BUP(t4, 5, 13) ^ BUP(t4, 9, 14) ^ BUP(t4, 13, 15) ^ + BDN(t4, 17, 16) ^ BDN(t4, 21, 17) ^ BDN(t4, 25, 18) ^ + BDN(t4, 29, 19) ^ BUP(t5, 1, 20) ^ BUP(t5, 5, 21) ^ + BUP(t5, 9, 22) ^ BUP(t5, 13, 23); + x3 = BDN(t1, 2, 0) ^ BDN(t1, 6, 1) ^ BDN(t1, 10, 2) ^ + BDN(t1, 14, 3) ^ BDN(t1, 18, 4) ^ BDN(t1, 22, 5) ^ + BDN(t1, 26, 6) ^ BDN(t1, 30, 7) ^ BUP(t2, 2, 8) ^ + BUP(t2, 6, 9) ^ BCP(t2, 10) ^ BDN(t2, 14, 11) ^ + BDN(t2, 18, 12) ^ BDN(t2, 22, 13) ^ BDN(t2, 26, 14) ^ + BDN(t2, 30, 15) ^ BUP(t3, 2, 16) ^ BUP(t3, 6, 17) ^ + BUP(t3, 10, 18) ^ BUP(t3, 14, 19) ^ BUP(t3, 18, 20) ^ + BDN(t3, 22, 21) ^ BDN(t3, 26, 22) ^ BDN(t3, 30, 23) ^ + BUP(t4, 2, 24) ^ BUP(t4, 6, 25) ^ BUP(t4, 10, 26) ^ + BUP(t4, 14, 27) ^ BUP(t4, 18, 28) ^ BUP(t4, 22, 29) ^ + BUP(t4, 26, 30) ^ BUP(t4, 30, 31); + x4 = BUP(t0, 3, 4) ^ BDN(t0, 7, 5) ^ BDN(t0, 11, 6) ^ + BDN(t0, 15, 7) ^ BDN(t0, 19, 8) ^ BDN(t0, 23, 9) ^ + BDN(t0, 27, 10) ^ BDN(t0, 31, 11) ^ BUP(t1, 3, 12) ^ + BUP(t1, 7, 13) ^ BUP(t1, 11, 14) ^ BCP(t1, 15) ^ + BDN(t1, 19, 16) ^ BDN(t1, 23, 17) ^ BDN(t1, 27, 18) ^ + BDN(t1, 31, 19) ^ BUP(t2, 3, 20) ^ BUP(t2, 7, 21) ^ + BUP(t2, 11, 22) ^ BUP(t2, 15, 23) ^ BUP(t2, 19, 24) ^ + BUP(t2, 23, 25) ^ BDN(t2, 27, 26) ^ BDN(t2, 31, 27) ^ + BUP(t3, 3, 28) ^ BUP(t3, 7, 29) ^ BUP(t3, 11, 30) ^ + BUP(t3, 15, 31) ^ BDN(t5, 2, 0) ^ BDN(t5, 6, 1) ^ + BDN(t5, 10, 2) ^ BDN(t5, 14, 3); + x5 = BDN(t3, 19, 0) ^ BDN(t3, 23, 1) ^ BDN(t3, 27, 2) ^ + BDN(t3, 31, 3) ^ BUP(t4, 3, 4) ^ BDN(t4, 7, 5) ^ + BDN(t4, 11, 6) ^ BDN(t4, 15, 7) ^ BDN(t4, 19, 8) ^ + BDN(t4, 23, 9) ^ BDN(t4, 27, 10) ^ BDN(t4, 31, 11) ^ + BUP(t5, 3, 12) ^ BUP(t5, 7, 13) ^ BUP(t5, 11, 14) ^ + BCP(t5, 15); + } + + /* Store the local variables back to the state in little-endian order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = x0; + state->W[1] = x1; + state->W[2] = x2; + state->W[3] = x3; + state->W[4] = x4; + state->W[5] = x5; +#else + le_store_word32(state->B, x0); + le_store_word32(state->B + 4, x1); + le_store_word32(state->B + 8, x2); + le_store_word32(state->B + 12, x3); + le_store_word32(state->B + 16, x4); + le_store_word16(state->B + 20, x5); /* Last word is only 16 bits */ +#endif +} + +#endif /* !__AVR__ */ diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.h new file mode 100644 index 0000000..bb9823f --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-spongent.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPONGENT_H +#define LW_INTERNAL_SPONGENT_H + +#include "internal-util.h" + +/** + * \file internal-spongent.h + * \brief Internal implementation of the Spongent-pi permutation. + * + * References: https://www.esat.kuleuven.be/cosic/elephant/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the Spongent-pi[160] state in bytes. + */ +#define SPONGENT160_STATE_SIZE 20 + +/** + * \brief Size of the Spongent-pi[176] state in bytes. + */ +#define SPONGENT176_STATE_SIZE 22 + +/** + * \brief Structure of the internal state of the Spongent-pi[160] permutation. + */ +typedef union +{ + uint32_t W[5]; /**< Spongent-pi[160] state as 32-bit words */ + uint8_t B[20]; /**< Spongent-pi[160] state as bytes */ + +} spongent160_state_t; + +/** + * \brief Structure of the internal state of the Spongent-pi[176] permutation. + * + * Note: The state is technically only 176 bits, but we increase it to + * 192 bits so that we can use 32-bit word operations to manipulate the + * state. The extra bits in the last word are fixed to zero. + */ +typedef union +{ + uint32_t W[6]; /**< Spongent-pi[176] state as 32-bit words */ + uint8_t B[24]; /**< Spongent-pi[176] state as bytes */ + +} spongent176_state_t; + +/** + * \brief Permutes the Spongent-pi[160] state. + * + * \param state The Spongent-pi[160] state to be permuted. + */ +void spongent160_permute(spongent160_state_t *state); + +/** + * \brief Permutes the Spongent-pi[176] state. + * + * \param state The Spongent-pi[176] state to be permuted. + */ +void spongent176_permute(spongent176_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-util.h b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/elephant/Implementations/crypto_aead/elephant200v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.c b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/api.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/encrypt.c b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..daa5139 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "estate.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return estate_twegift_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return estate_twegift_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.c b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.c new file mode 100644 index 0000000..a570791 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.c @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "estate.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const estate_twegift_cipher = { + "ESTATE_TweGIFT-128", + ESTATE_TWEGIFT_KEY_SIZE, + ESTATE_TWEGIFT_NONCE_SIZE, + ESTATE_TWEGIFT_TAG_SIZE, + AEAD_FLAG_NONE, + estate_twegift_aead_encrypt, + estate_twegift_aead_decrypt +}; + +/** + * \brief Generates the FCBC MAC for a packet using ESTATE_TweGIFT-128. + * + * \param ks The key schedule for TweGIFT-128. + * \param tag Rolling state of the authentication tag. + * \param m Message to be authenticated. + * \param mlen Length of the message to be authenticated; must be >= 1. + * \param tweak1 Tweak value to use when the last block is full. + * \param tweak2 Tweak value to use when the last block is partial. + */ +static void estate_twegift_fcbc + (const gift128n_key_schedule_t *ks, unsigned char tag[16], + const unsigned char *m, unsigned long long mlen, + uint32_t tweak1, uint32_t tweak2) +{ + while (mlen > 16) { + lw_xor_block(tag, m, 16); + gift128n_encrypt(ks, tag, tag); + m += 16; + mlen -= 16; + } + if (mlen == 16) { + lw_xor_block(tag, m, 16); + gift128t_encrypt(ks, tag, tag, tweak1); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block(tag, m, temp); + tag[temp] ^= 0x01; + gift128t_encrypt(ks, tag, tag, tweak2); + } +} + +/** + * \brief Generates the MAC for a packet using ESTATE_TweGIFT-128. + * + * \param ks The key schedule for TweGIFT-128. + * \param tag Rolling state of the authentication tag. + * \param m Message to be authenticated. + * \param mlen Length of the message to be authenticated. + * \param ad Associated data to be authenticated. + * \param adlen Length of the associated data to be authenticated. + */ +static void estate_twegift_authenticate + (const gift128n_key_schedule_t *ks, unsigned char tag[16], + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen) +{ + /* Handle the case where both the message and associated data are empty */ + if (mlen == 0 && adlen == 0) { + gift128t_encrypt(ks, tag, tag, GIFT128T_TWEAK_8); + return; + } + + /* Encrypt the nonce */ + gift128t_encrypt(ks, tag, tag, GIFT128T_TWEAK_1); + + /* Compute the FCBC MAC over the associated data */ + if (adlen != 0) { + if (mlen != 0) { + estate_twegift_fcbc + (ks, tag, ad, adlen, GIFT128T_TWEAK_2, GIFT128T_TWEAK_3); + } else { + estate_twegift_fcbc + (ks, tag, ad, adlen, GIFT128T_TWEAK_6, GIFT128T_TWEAK_7); + } + } + + /* Compute the FCBC MAC over the message data */ + if (mlen != 0) { + estate_twegift_fcbc + (ks, tag, m, mlen, GIFT128T_TWEAK_4, GIFT128T_TWEAK_5); + } +} + +/** + * \brief Encrypts (or decrypts) a payload using ESTATE_TweGIFT-128. + * + * \param ks The key schedule for TweGIFT-128. + * \param tag Pre-computed authentication tag for the packet. + * \param c Ciphertext after encryption. + * \param m Plaintext to be encrypted. + * \param mlen Length of the plaintext to be encrypted. + */ +static void estate_twegift_encrypt + (const gift128n_key_schedule_t *ks, const unsigned char tag[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[16]; + memcpy(block, tag, 16); + while (mlen >= 16) { + gift128n_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, 16); + c += 16; + m += 16; + mlen -= 16; + } + if (mlen > 0) { + gift128n_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, (unsigned)mlen); + } +} + +int estate_twegift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift128n_key_schedule_t ks; + unsigned char tag[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ESTATE_TWEGIFT_TAG_SIZE; + + /* Set up the key schedule and copy the nonce into the tag */ + gift128n_init(&ks, k); + memcpy(tag, npub, 16); + + /* Authenticate the associated data and plaintext */ + estate_twegift_authenticate(&ks, tag, m, mlen, ad, adlen); + + /* Encrypt the plaintext to generate the ciphertext */ + estate_twegift_encrypt(&ks, tag, c, m, mlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, tag, 16); + return 0; +} + +int estate_twegift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift128n_key_schedule_t ks; + unsigned char tag[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ESTATE_TWEGIFT_TAG_SIZE) + return -1; + *mlen = clen - ESTATE_TWEGIFT_TAG_SIZE; + + /* Set up the key schedule and copy the nonce into the tag */ + gift128n_init(&ks, k); + memcpy(tag, npub, 16); + + /* Decrypt the ciphertext to generate the plaintext */ + estate_twegift_encrypt(&ks, c + *mlen, m, c, *mlen); + + /* Authenticate the associated data and plaintext */ + estate_twegift_authenticate(&ks, tag, m, *mlen, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, tag, c + *mlen, 16); +} diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.h new file mode 100644 index 0000000..d38ee16 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/estate.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ESTATE_H +#define LWCRYPTO_ESTATE_H + +#include "aead-common.h" + +/** + * \file estate.h + * \brief ESTATE authenticated encryption algorithm. + * + * ESTATE_TweGIFT-128 is an authenticated encryption algorithm with a + * 128-bit key, a 128-bit nonce, and a 128-bit tag. It is a two-pass + * algorithm that is built around a tweaked version of the GIFT-128 block + * cipher, the FCBC authentication mode, and the OFB encryption mode. + * + * ESTATE is resistant against nonce reuse as long as the combination + * of the associated data and plaintext is unique. + * + * If a nonce is reused then two packets with the same nonce, associated data, + * and plaintext will encrypt to the same ciphertext. This will leak that + * the same plaintext has been sent for a second time but will not reveal + * the plaintext itself. + * + * The ESTATE family also includes variants build around tweaked versions + * of the AES block cipher. We do not implement those variants in this + * library. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ESTATE_TweGIFT-128. + */ +#define ESTATE_TWEGIFT_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for ESTATE_TweGIFT-128. + */ +#define ESTATE_TWEGIFT_TAG_SIZE 16 + +/** + * \brief Size of the nonce for ESTATE_TweGIFT-128. + */ +#define ESTATE_TWEGIFT_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the ESTATE_TweGIFT-128 cipher. + */ +extern aead_cipher_t const estate_twegift_cipher; + +/** + * \brief Encrypts and authenticates a packet with ESTATE_TweGIFT-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa estate_twegift_aead_decrypt() + */ +int estate_twegift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ESTATE_TweGIFT-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa estate_twegift_aead_encrypt() + */ +int estate_twegift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128-config.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.c b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-avr.S b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-avr.S new file mode 100644 index 0000000..2aae304 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-avr.S @@ -0,0 +1,4712 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +302: + rcall 455f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 455f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 455f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 455f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 302b + rjmp 804f +455: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +804: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +370: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + cpse r16,r1 + rjmp 370b + rjmp 867f +522: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +867: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r19,r1 + mov r26,r1 +307: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + movw r20,r2 + movw r22,r4 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + mov r0,r8 + and r0,r22 + eor r12,r0 + mov r0,r9 + and r0,r23 + eor r13,r0 + movw r2,r14 + movw r4,r24 + movw r14,r20 + movw r24,r22 + bst r2,1 + bld r0,0 + bst r2,4 + bld r2,1 + bst r4,0 + bld r2,4 + bst r2,2 + bld r4,0 + bst r3,0 + bld r2,2 + bst r2,3 + bld r3,0 + bst r3,4 + bld r2,3 + bst r4,3 + bld r3,4 + bst r3,6 + bld r4,3 + bst r5,3 + bld r3,6 + bst r3,5 + bld r5,3 + bst r4,7 + bld r3,5 + bst r5,6 + bld r4,7 + bst r5,1 + bld r5,6 + bst r2,5 + bld r5,1 + bst r4,4 + bld r2,5 + bst r4,2 + bld r4,4 + bst r3,2 + bld r4,2 + bst r3,3 + bld r3,2 + bst r3,7 + bld r3,3 + bst r5,7 + bld r3,7 + bst r5,5 + bld r5,7 + bst r4,5 + bld r5,5 + bst r4,6 + bld r4,5 + bst r5,2 + bld r4,6 + bst r3,1 + bld r5,2 + bst r2,7 + bld r3,1 + bst r5,4 + bld r2,7 + bst r4,1 + bld r5,4 + bst r2,6 + bld r4,1 + bst r5,0 + bld r2,6 + bst r0,0 + bld r5,0 + bst r6,0 + bld r0,0 + bst r6,1 + bld r6,0 + bst r6,5 + bld r6,1 + bst r8,5 + bld r6,5 + bst r8,7 + bld r8,5 + bst r9,7 + bld r8,7 + bst r9,6 + bld r9,7 + bst r9,2 + bld r9,6 + bst r7,2 + bld r9,2 + bst r7,0 + bld r7,2 + bst r0,0 + bld r7,0 + bst r6,2 + bld r0,0 + bst r7,1 + bld r6,2 + bst r6,4 + bld r7,1 + bst r8,1 + bld r6,4 + bst r6,7 + bld r8,1 + bst r9,5 + bld r6,7 + bst r8,6 + bld r9,5 + bst r9,3 + bld r8,6 + bst r7,6 + bld r9,3 + bst r9,0 + bld r7,6 + bst r0,0 + bld r9,0 + bst r6,3 + bld r0,0 + bst r7,5 + bld r6,3 + bst r8,4 + bld r7,5 + bst r8,3 + bld r8,4 + bst r7,7 + bld r8,3 + bst r9,4 + bld r7,7 + bst r8,2 + bld r9,4 + bst r7,3 + bld r8,2 + bst r7,4 + bld r7,3 + bst r8,0 + bld r7,4 + bst r0,0 + bld r8,0 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r10,2 + bld r10,0 + bst r11,2 + bld r10,2 + bst r11,1 + bld r11,2 + bst r10,5 + bld r11,1 + bst r12,6 + bld r10,5 + bst r13,0 + bld r12,6 + bst r10,3 + bld r13,0 + bst r11,6 + bld r10,3 + bst r13,1 + bld r11,6 + bst r10,7 + bld r13,1 + bst r13,6 + bld r10,7 + bst r13,3 + bld r13,6 + bst r11,7 + bld r13,3 + bst r13,5 + bld r11,7 + bst r12,7 + bld r13,5 + bst r13,4 + bld r12,7 + bst r12,3 + bld r13,4 + bst r11,4 + bld r12,3 + bst r12,1 + bld r11,4 + bst r10,4 + bld r12,1 + bst r12,2 + bld r10,4 + bst r11,0 + bld r12,2 + bst r10,1 + bld r11,0 + bst r10,6 + bld r10,1 + bst r13,2 + bld r10,6 + bst r11,3 + bld r13,2 + bst r11,5 + bld r11,3 + bst r12,5 + bld r11,5 + bst r12,4 + bld r12,5 + bst r12,0 + bld r12,4 + bst r0,0 + bld r12,0 + bst r14,0 + bld r0,0 + bst r14,3 + bld r14,0 + bst r15,7 + bld r14,3 + bst r25,6 + bld r15,7 + bst r25,0 + bld r25,6 + bst r0,0 + bld r25,0 + bst r14,1 + bld r0,0 + bst r14,7 + bld r14,1 + bst r25,7 + bld r14,7 + bst r25,4 + bld r25,7 + bst r24,0 + bld r25,4 + bst r0,0 + bld r24,0 + bst r14,2 + bld r0,0 + bst r15,3 + bld r14,2 + bst r15,6 + bld r15,3 + bst r25,2 + bld r15,6 + bst r15,0 + bld r25,2 + bst r0,0 + bld r15,0 + bst r14,4 + bld r0,0 + bst r24,3 + bld r14,4 + bst r15,5 + bld r24,3 + bst r24,6 + bld r15,5 + bst r25,1 + bld r24,6 + bst r0,0 + bld r25,1 + bst r14,5 + bld r0,0 + bst r24,7 + bld r14,5 + bst r25,5 + bld r24,7 + bst r24,4 + bld r25,5 + bst r24,1 + bld r24,4 + bst r0,0 + bld r24,1 + bst r14,6 + bld r0,0 + bst r25,3 + bld r14,6 + bst r15,4 + bld r25,3 + bst r24,2 + bld r15,4 + bst r15,1 + bld r24,2 + bst r0,0 + bld r15,1 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldd r20,Y+13 + ldd r21,Y+14 + ldd r22,Y+15 + ldd r23,Y+16 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + ldd r0,Y+1 + std Y+1,r20 + ldd r20,Y+5 + std Y+5,r0 + ldd r0,Y+9 + std Y+9,r20 + std Y+13,r0 + ldd r0,Y+2 + std Y+2,r21 + ldd r21,Y+6 + std Y+6,r0 + ldd r0,Y+10 + std Y+10,r21 + std Y+14,r0 + ldd r0,Y+3 + std Y+3,r22 + ldd r22,Y+7 + std Y+7,r0 + ldd r0,Y+11 + std Y+11,r22 + std Y+15,r0 + ldd r0,Y+4 + std Y+4,r23 + ldd r23,Y+8 + std Y+8,r0 + ldd r0,Y+12 + std Y+12,r23 + std Y+16,r0 + ldi r20,128 + eor r25,r20 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + inc r19 + cpi r19,40 + breq 727f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 307b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 307b +727: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +375: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 791f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 375b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 375b +791: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-full-avr.S b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-full-avr.S new file mode 100644 index 0000000..3a7e6fb --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-full-avr.S @@ -0,0 +1,8173 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rjmp 1021f +283: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +1021: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rjmp 1024f +286: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1024: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + rjmp 1049f +311: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +1049: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,160 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + rjmp 1052f +314: + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + mov r0,r1 + lsr r4 + ror r0 + lsr r4 + ror r0 + or r4,r0 + mov r0,r1 + lsr r5 + ror r0 + lsr r5 + ror r0 + or r5,r0 + swap r6 + swap r7 + swap r8 + swap r9 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + com r2 + com r3 + com r4 + com r5 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + com r2 + com r3 + com r4 + com r5 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,119 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r25 + ror r24 + ror r15 + ror r14 + lsr r25 + ror r24 + ror r15 + ror r14 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,17 + and r14,r16 + and r15,r16 + andi r24,17 + andi r25,17 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + ret +1052: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-small-avr.S b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-small-avr.S new file mode 100644 index 0000000..6f2d68b --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-small-avr.S @@ -0,0 +1,9331 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 329f + rcall 329f + rjmp 1541f +329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +1067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +934: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + cpse r16,r1 + rjmp 934b + rjmp 1431f +1086: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1431: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r19,20 +1: + ld r2,Z+ + ld r3,Z+ + ld r4,Z+ + ld r5,Z+ + std Y+1,r2 + std Y+2,r3 + std Y+3,r4 + std Y+4,r5 + adiw r28,4 + dec r19 + brne 1b + subi r28,80 + sbc r29,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,20 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,40 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,60 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,80 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,100 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,120 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 357f + rjmp 1570f +357: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +1095: + movw r30,r26 + sbiw r30,40 + push r5 + push r4 + push r3 + push r2 + push r9 + push r8 + push r7 + push r6 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,68 + andi r21,68 + andi r22,85 + andi r23,85 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + st Z,r26 + std Z+1,r27 + std Z+2,r16 + std Z+3,r17 + movw r20,r2 + movw r22,r4 + andi r20,51 + andi r21,51 + andi r22,51 + andi r23,51 + ldi r19,204 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + or r4,r23 + or r5,r20 + or r2,r21 + or r3,r22 + movw r20,r4 + movw r22,r2 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r4 + eor r21,r5 + eor r22,r2 + eor r23,r3 + mov r20,r1 + andi r21,17 + andi r22,85 + andi r23,85 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + std Z+4,r4 + std Z+5,r5 + std Z+6,r2 + std Z+7,r3 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r16 + adc r16,r1 + lsl r16 + adc r16,r1 + swap r17 + std Z+8,r26 + std Z+9,r27 + std Z+10,r16 + std Z+11,r17 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + std Z+12,r2 + std Z+13,r3 + std Z+14,r4 + std Z+15,r5 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r16,Z+22 + ldd r17,Z+23 + movw r20,r26 + movw r22,r16 + andi r20,170 + andi r21,170 + andi r22,170 + andi r23,170 + andi r26,85 + andi r27,85 + andi r16,85 + andi r17,85 + or r26,r21 + or r27,r22 + or r16,r23 + or r17,r20 + std Z+16,r16 + std Z+17,r17 + std Z+18,r26 + std Z+19,r27 + movw r20,r2 + movw r22,r4 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + ldi r19,170 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + or r2,r20 + or r3,r21 + or r4,r22 + or r5,r23 + std Z+20,r5 + std Z+21,r2 + std Z+22,r3 + std Z+23,r4 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r16,Z+30 + ldd r17,Z+31 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,120 + andi r21,120 + andi r22,120 + andi r23,120 + movw r6,r20 + movw r8,r22 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldi r19,8 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r26,15 + andi r27,15 + andi r16,15 + andi r17,15 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r16 + std Z+27,r17 + movw r20,r4 + lsr r21 + ror r20 + lsr r21 + ror r20 + andi r20,48 + andi r21,48 + movw r26,r2 + movw r16,r4 + andi r26,1 + andi r27,1 + andi r16,1 + andi r17,1 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + or r26,r20 + or r27,r21 + movw r20,r4 + lsl r20 + rol r21 + lsl r20 + rol r21 + andi r20,192 + andi r21,192 + or r26,r20 + or r27,r21 + movw r20,r2 + andi r20,224 + andi r21,224 + lsr r21 + ror r20 + or r16,r20 + or r17,r21 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,7 + andi r21,7 + andi r22,7 + andi r23,7 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + ldi r19,16 + and r2,r19 + and r3,r19 + lsl r2 + rol r3 + lsl r2 + rol r3 + lsl r2 + rol r3 + or r16,r2 + or r17,r3 + std Z+28,r26 + std Z+29,r27 + std Z+30,r16 + std Z+31,r17 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r16,Z+38 + ldd r17,Z+39 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r16 + std Z+35,r17 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r4 + mov r4,r5 + mov r5,r0 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + pop r6 + pop r7 + pop r8 + pop r9 + pop r2 + pop r3 + pop r4 + pop r5 + movw r26,r30 + ret +1570: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r26,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +939: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 1355f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 939b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 939b +1355: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-tiny-avr.S b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-tiny-avr.S new file mode 100644 index 0000000..dd1f7b9 --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-gift128n-tiny-avr.S @@ -0,0 +1,9480 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1585f + rcall 1585f + rjmp 2797f +1585: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2323: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2797: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +370: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + cpse r16,r1 + rjmp 370b + rjmp 867f +522: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +867: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + ldd r10,Z+8 + ldd r11,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + ldd r14,Z+12 + ldd r15,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + st Z+,r24 + st Z+,r25 + ldi r19,4 +35: + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + mov r0,r4 + mov r4,r8 + mov r8,r0 + mov r0,r5 + mov r5,r9 + mov r9,r0 + st Z+,r14 + st Z+,r15 + st Z+,r24 + st Z+,r25 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + mov r0,r12 + mov r12,r24 + mov r24,r0 + mov r0,r13 + mov r13,r25 + mov r25,r0 + dec r19 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r19,2 +121: + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + st Z,r5 + std Z+1,r3 + std Z+2,r4 + std Z+3,r2 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+4,r5 + std Z+5,r3 + std Z+6,r4 + std Z+7,r2 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+8,r5 + std Z+9,r3 + std Z+10,r4 + std Z+11,r2 + ldd r2,Z+12 + ldd r3,Z+13 + ldd r4,Z+14 + ldd r5,Z+15 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+12,r5 + std Z+13,r3 + std Z+14,r4 + std Z+15,r2 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r21 + rol r22 + rol r23 + rol r0 + movw r20,r22 + mov r22,r0 + mov r23,r1 + eor r20,r2 + eor r21,r3 + andi r20,170 + andi r21,170 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r0,r1 + lsr r22 + ror r21 + ror r20 + ror r0 + movw r22,r20 + mov r21,r0 + mov r20,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+16,r5 + std Z+17,r3 + std Z+18,r4 + std Z+19,r2 + ldd r2,Z+20 + ldd r3,Z+21 + ldd r4,Z+22 + ldd r5,Z+23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r21 + rol r22 + rol r23 + rol r0 + movw r20,r22 + mov r22,r0 + mov r23,r1 + eor r20,r2 + eor r21,r3 + andi r20,170 + andi r21,170 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r0,r1 + lsr r22 + ror r21 + ror r20 + ror r0 + movw r22,r20 + mov r21,r0 + mov r20,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+20,r5 + std Z+21,r3 + std Z+22,r4 + std Z+23,r2 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,10 + andi r21,10 + andi r22,10 + andi r23,10 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,204 + mov r21,r1 + andi r22,204 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+24,r5 + std Z+25,r3 + std Z+26,r4 + std Z+27,r2 + ldd r2,Z+28 + ldd r3,Z+29 + ldd r4,Z+30 + ldd r5,Z+31 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,10 + andi r21,10 + andi r22,10 + andi r23,10 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,204 + mov r21,r1 + andi r22,204 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+28,r5 + std Z+29,r3 + std Z+30,r4 + std Z+31,r2 + dec r19 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,20 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,60 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,100 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 1613f + rjmp 2826f +1613: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +2351: + movw r30,r26 + sbiw r30,40 + push r5 + push r4 + push r3 + push r2 + push r9 + push r8 + push r7 + push r6 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,68 + andi r21,68 + andi r22,85 + andi r23,85 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + st Z,r26 + std Z+1,r27 + std Z+2,r16 + std Z+3,r17 + movw r20,r2 + movw r22,r4 + andi r20,51 + andi r21,51 + andi r22,51 + andi r23,51 + ldi r19,204 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + or r4,r23 + or r5,r20 + or r2,r21 + or r3,r22 + movw r20,r4 + movw r22,r2 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r4 + eor r21,r5 + eor r22,r2 + eor r23,r3 + mov r20,r1 + andi r21,17 + andi r22,85 + andi r23,85 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + std Z+4,r4 + std Z+5,r5 + std Z+6,r2 + std Z+7,r3 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r16 + adc r16,r1 + lsl r16 + adc r16,r1 + swap r17 + std Z+8,r26 + std Z+9,r27 + std Z+10,r16 + std Z+11,r17 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + std Z+12,r2 + std Z+13,r3 + std Z+14,r4 + std Z+15,r5 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r16,Z+22 + ldd r17,Z+23 + movw r20,r26 + movw r22,r16 + andi r20,170 + andi r21,170 + andi r22,170 + andi r23,170 + andi r26,85 + andi r27,85 + andi r16,85 + andi r17,85 + or r26,r21 + or r27,r22 + or r16,r23 + or r17,r20 + std Z+16,r16 + std Z+17,r17 + std Z+18,r26 + std Z+19,r27 + movw r20,r2 + movw r22,r4 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + ldi r19,170 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + or r2,r20 + or r3,r21 + or r4,r22 + or r5,r23 + std Z+20,r5 + std Z+21,r2 + std Z+22,r3 + std Z+23,r4 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r16,Z+30 + ldd r17,Z+31 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,120 + andi r21,120 + andi r22,120 + andi r23,120 + movw r6,r20 + movw r8,r22 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldi r19,8 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r26,15 + andi r27,15 + andi r16,15 + andi r17,15 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r16 + std Z+27,r17 + movw r20,r4 + lsr r21 + ror r20 + lsr r21 + ror r20 + andi r20,48 + andi r21,48 + movw r26,r2 + movw r16,r4 + andi r26,1 + andi r27,1 + andi r16,1 + andi r17,1 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + or r26,r20 + or r27,r21 + movw r20,r4 + lsl r20 + rol r21 + lsl r20 + rol r21 + andi r20,192 + andi r21,192 + or r26,r20 + or r27,r21 + movw r20,r2 + andi r20,224 + andi r21,224 + lsr r21 + ror r20 + or r16,r20 + or r17,r21 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,7 + andi r21,7 + andi r22,7 + andi r23,7 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + ldi r19,16 + and r2,r19 + and r3,r19 + lsl r2 + rol r3 + lsl r2 + rol r3 + lsl r2 + rol r3 + or r16,r2 + or r17,r3 + std Z+28,r26 + std Z+29,r27 + std Z+30,r16 + std Z+31,r17 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r16,Z+38 + ldd r17,Z+39 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r16 + std Z+35,r17 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r4 + mov r4,r5 + mov r5,r0 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + pop r6 + pop r7 + pop r8 + pop r9 + pop r2 + pop r3 + pop r4 + pop r5 + movw r26,r30 + ret +2826: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r26,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +375: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 791f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 375b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 375b +791: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-util.h b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/estate/Implementations/crypto_aead/estatetwegift128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/api.h new file mode 100644 index 0000000..3818b25 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 6 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..3741901 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t192n48v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/api.h new file mode 100644 index 0000000..6c701b5 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 14 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..be76f9b --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t256n112v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/api.h new file mode 100644 index 0000000..500c2c7 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 13 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..b23be7f --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_288_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_128_288_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb128t288n104v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/api.h new file mode 100644 index 0000000..f04cc58 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 6 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..275b77e --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_64_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_paef_64_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/paefforkskinnyb64t192n48v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/api.h new file mode 100644 index 0000000..40ffe7c --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 7 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..5cbb412 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_saef_128_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_saef_128_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t192n56v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/api.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/api.h new file mode 100644 index 0000000..86e276c --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 15 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/encrypt.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..7d59b31 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "forkae.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_saef_128_256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return forkae_saef_128_256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.c new file mode 100644 index 0000000..4a9671a --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "forkae.h" +#include "internal-forkskinny.h" +#include "internal-util.h" +#include + +aead_cipher_t const forkae_paef_64_192_cipher = { + "PAEF-ForkSkinny-64-192", + FORKAE_PAEF_64_192_KEY_SIZE, + FORKAE_PAEF_64_192_NONCE_SIZE, + FORKAE_PAEF_64_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_64_192_aead_encrypt, + forkae_paef_64_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_192_cipher = { + "PAEF-ForkSkinny-128-192", + FORKAE_PAEF_128_192_KEY_SIZE, + FORKAE_PAEF_128_192_NONCE_SIZE, + FORKAE_PAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_192_aead_encrypt, + forkae_paef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_256_cipher = { + "PAEF-ForkSkinny-128-256", + FORKAE_PAEF_128_256_KEY_SIZE, + FORKAE_PAEF_128_256_NONCE_SIZE, + FORKAE_PAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_256_aead_encrypt, + forkae_paef_128_256_aead_decrypt +}; + +aead_cipher_t const forkae_paef_128_288_cipher = { + "PAEF-ForkSkinny-128-288", + FORKAE_PAEF_128_288_KEY_SIZE, + FORKAE_PAEF_128_288_NONCE_SIZE, + FORKAE_PAEF_128_288_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_paef_128_288_aead_encrypt, + forkae_paef_128_288_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_192_cipher = { + "SAEF-ForkSkinny-128-192", + FORKAE_SAEF_128_192_KEY_SIZE, + FORKAE_SAEF_128_192_NONCE_SIZE, + FORKAE_SAEF_128_192_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_192_aead_encrypt, + forkae_saef_128_192_aead_decrypt +}; + +aead_cipher_t const forkae_saef_128_256_cipher = { + "SAEF-ForkSkinny-128-256", + FORKAE_SAEF_128_256_KEY_SIZE, + FORKAE_SAEF_128_256_NONCE_SIZE, + FORKAE_SAEF_128_256_TAG_SIZE, + AEAD_FLAG_NONE, + forkae_saef_128_256_aead_encrypt, + forkae_saef_128_256_aead_decrypt +}; + +/* PAEF-ForkSkinny-64-192 */ +#define FORKAE_ALG_NAME forkae_paef_64_192 +#define FORKAE_BLOCK_SIZE 8 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_64_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_64_192 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_paef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_192_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_paef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_256_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 2 +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-paef.h" + +/* PAEF-ForkSkinny-128-288 */ +#define FORKAE_ALG_NAME forkae_paef_128_288 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_PAEF_128_288_NONCE_SIZE +#define FORKAE_COUNTER_SIZE 7 +#define FORKAE_TWEAKEY_SIZE 48 +#define FORKAE_BLOCK_FUNC forkskinny_128_384 +#include "internal-forkae-paef.h" + +/* SAEF-ForkSkinny-128-192 */ +#define FORKAE_ALG_NAME forkae_saef_128_192 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_192_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 24 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" + +/* SAEF-ForkSkinny-128-256 */ +#define FORKAE_ALG_NAME forkae_saef_128_256 +#define FORKAE_BLOCK_SIZE 16 +#define FORKAE_NONCE_SIZE FORKAE_SAEF_128_256_NONCE_SIZE +#define FORKAE_TWEAKEY_SIZE 32 +#define FORKAE_TWEAKEY_REDUCED_SIZE 32 +#define FORKAE_BLOCK_FUNC forkskinny_128_256 +#include "internal-forkae-saef.h" diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.h new file mode 100644 index 0000000..3e27b50 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/forkae.h @@ -0,0 +1,551 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_FORKAE_H +#define LWCRYPTO_FORKAE_H + +#include "aead-common.h" + +/** + * \file forkae.h + * \brief ForkAE authenticated encryption algorithm family. + * + * ForkAE is a family of authenticated encryption algorithms based on a + * modified version of the SKINNY tweakable block cipher. The modifications + * introduce "forking" where each input block produces two output blocks + * for use in encryption and authentication. There are six members in + * the ForkAE family: + * + * \li PAEF-ForkSkinny-64-192 has a 128-bit key, a 48-bit nonce, and a + * 64-bit authentication tag. The associated data and plaintext are + * limited to 216 bytes. + * \li PAEF-ForkSkinny-128-192 has a 128-bit key, a 48-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-256 has a 128-bit key, a 112-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 217 bytes. + * \li PAEF-ForkSkinny-128-288 has a 128-bit key, a 104-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext are + * limited to 257 bytes. This is the primary member of the family. + * \li SAEF-ForkSkinny-128-192 has a 128-bit key, a 56-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * \li SAEF-ForkSkinny-128-256 has a 128-bit key, a 120-bit nonce, and a + * 128-bit authentication tag. The associated data and plaintext may be + * unlimited in size. + * + * The PAEF variants support parallel encryption and decryption for + * higher throughput. The SAEF variants encrypt or decrypt blocks + * sequentially. + * + * ForkAE is designed to be efficient on small packet sizes so most of + * the PAEF algorithms have a limit of 64k or 128k on the amount of + * payload in a single packet. Obviously the input can be split into + * separate packets for larger amounts of data. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_TAG_SIZE 8 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-64-192. + */ +#define FORKAE_PAEF_64_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-192. + */ +#define FORKAE_PAEF_128_192_NONCE_SIZE 6 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-256. + */ +#define FORKAE_PAEF_128_256_NONCE_SIZE 14 + +/** + * \brief Size of the key for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PAEF-ForkSkinny-128-288. + */ +#define FORKAE_PAEF_128_288_NONCE_SIZE 13 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-192. + */ +#define FORKAE_SAEF_128_192_NONCE_SIZE 7 + +/** + * \brief Size of the key for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SAEF-ForkSkinny-128-256. + */ +#define FORKAE_SAEF_128_256_NONCE_SIZE 15 + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-64-192 cipher. + */ +extern aead_cipher_t const forkae_paef_64_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_paef_128_192_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_paef_128_256_cipher; + +/** + * \brief Meta-information block for the PAEF-ForkSkinny-128-288 cipher. + */ +extern aead_cipher_t const forkae_paef_128_288_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-192 cipher. + */ +extern aead_cipher_t const forkae_saef_128_192_cipher; + +/** + * \brief Meta-information block for the SAEF-ForkSkinny-128-256 cipher. + */ +extern aead_cipher_t const forkae_saef_128_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_64_192_aead_decrypt() + */ +int forkae_paef_64_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-64-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_64_192_aead_encrypt() + */ +int forkae_paef_64_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_192_aead_decrypt() + */ +int forkae_paef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 6 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_192_aead_encrypt() + */ +int forkae_paef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_256_aead_decrypt() + */ +int forkae_paef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 14 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_256_aead_encrypt() + */ +int forkae_paef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_paef_128_288_aead_decrypt() + */ +int forkae_paef_128_288_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PAEF-ForkSkinny-128-288. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 13 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_paef_128_288_aead_encrypt() + */ +int forkae_paef_128_288_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_192_aead_decrypt() + */ +int forkae_saef_128_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 7 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_192_aead_encrypt() + */ +int forkae_saef_128_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa forkae_saef_128_256_aead_decrypt() + */ +int forkae_saef_128_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SAEF-ForkSkinny-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 15 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa forkae_saef_128_256_aead_encrypt() + */ +int forkae_saef_128_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-paef.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-paef.h new file mode 100644 index 0000000..6f57b2b --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-paef.h @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE PAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_paef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_COUNTER_SIZE Size of the counter value for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Limit on the amount of data we can process based on the counter size */ +#define FORKAE_PAEF_DATA_LIMIT \ + ((unsigned long long)((1ULL << (FORKAE_COUNTER_SIZE * 8)) * \ + (FORKAE_BLOCK_SIZE / 8)) - FORKAE_BLOCK_SIZE) + +/* Processes the associated data in PAEF mode */ +STATIC_INLINE void FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter) + (unsigned char tweakey[FORKAE_TWEAKEY_SIZE], + unsigned long long counter, unsigned char domain) +{ + unsigned posn; + counter |= (((unsigned long long)domain) << (FORKAE_COUNTER_SIZE * 8 - 3)); + for (posn = 0; posn < FORKAE_COUNTER_SIZE; ++posn) { + tweakey[16 + FORKAE_NONCE_SIZE + FORKAE_COUNTER_SIZE - 1 - posn] = + (unsigned char)counter; + counter >>= 8; + } +} + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned long long counter; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || mlen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + counter = 1; + while (mlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, m); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned long long counter; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Validate the size of the associated data and plaintext as there + * is a limit on the size of the PAEF counter field */ + if (adlen > FORKAE_PAEF_DATA_LIMIT || clen > FORKAE_PAEF_DATA_LIMIT) + return -2; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + + /* Tag value starts at zero. We will XOR this with all of the + * intermediate tag values that are calculated for each block */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + counter = 1; + while (adlen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 0); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + ++counter; + } + if (adlen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 1); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, ad); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, sizeof(block) - temp - 1); + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 3); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, block, block); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + counter = 1; + while (clen > FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 4); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, c); + lw_xor_block(tag, block, FORKAE_BLOCK_SIZE); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + ++counter; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 5); + lw_xor_block_2_src(m, c, tag, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, m); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, sizeof(tag)); + } else { + unsigned temp = (unsigned)clen; + unsigned char block2[FORKAE_BLOCK_SIZE]; + int check; + FORKAE_CONCAT(FORKAE_ALG_NAME,_set_counter)(tweakey, counter, 7); + lw_xor_block_2_src(block2, tag, c, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, block2, block, block2); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (block2 + temp, FORKAE_BLOCK_SIZE - temp); + memcpy(m, block2, temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE PAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT +#undef FORKAE_PAEF_DATA_LIMIT diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-saef.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-saef.h new file mode 100644 index 0000000..768bba4 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkae-saef.h @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ForkAE SAEF variant. + * + * FORKAE_ALG_NAME Name of the FORKAE algorithm; e.g. forkae_saef_128_256 + * FORKAE_BLOCK_SIZE Size of the block for the cipher (8 or 16 bytes). + * FORKAE_NONCE_SIZE Size of the nonce for the cipher in bytes. + * FORKAE_TWEAKEY_SIZE Size of the tweakey for the underlying forked cipher. + * FORKAE_REDUCED_TWEAKEY_SIZE Size of the reduced tweakey without padding. + * FORKAE_BLOCK_FUNC Name of the block function; e.g. forkskinny_128_256 + */ +#if defined(FORKAE_ALG_NAME) + +#define FORKAE_CONCAT_INNER(name,suffix) name##suffix +#define FORKAE_CONCAT(name,suffix) FORKAE_CONCAT_INNER(name,suffix) + +/* Check that the last block is padded correctly; -1 if ok, 0 if not */ +STATIC_INLINE int FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (const unsigned char *block, unsigned len) +{ + int check = block[0] ^ 0x80; + while (len > 1) { + --len; + check |= block[len]; + } + return (check - 1) >> 8; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + FORKAE_BLOCK_SIZE; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || mlen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (mlen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || mlen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then generate the tag and we are done */ + if (!mlen) { + memcpy(c, tag, sizeof(tag)); + return 0; + } + + /* Encrypt all plaintext blocks except the last */ + while (mlen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + mlen -= FORKAE_BLOCK_SIZE; + } + + /* Encrypt the last block and generate the final authentication tag */ + if (mlen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, m, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)mlen; + memcpy(block, tag, FORKAE_BLOCK_SIZE); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, c, block, block); + lw_xor_block(c, tag, FORKAE_BLOCK_SIZE); + memcpy(c + FORKAE_BLOCK_SIZE, block, temp); + } + return 0; +} + +int FORKAE_CONCAT(FORKAE_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char tweakey[FORKAE_TWEAKEY_SIZE]; + unsigned char tag[FORKAE_BLOCK_SIZE]; + unsigned char block[FORKAE_BLOCK_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < FORKAE_BLOCK_SIZE) + return -1; + clen -= FORKAE_BLOCK_SIZE; + *mlen = clen; + + /* Format the initial tweakey with the key and nonce */ + memcpy(tweakey, k, 16); + memcpy(tweakey + 16, npub, FORKAE_NONCE_SIZE); + memset(tweakey + 16 + FORKAE_NONCE_SIZE, 0, + FORKAE_TWEAKEY_SIZE - 16 - FORKAE_NONCE_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] = 0x08; + + /* Tag value starts at zero */ + memset(tag, 0, sizeof(tag)); + + /* Process the associated data */ + if (adlen > 0 || clen == 0) { + while (adlen > FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + ad += FORKAE_BLOCK_SIZE; + adlen -= FORKAE_BLOCK_SIZE; + } + if (clen == 0) + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x02; + if (adlen == FORKAE_BLOCK_SIZE) { + lw_xor_block(tag, ad, FORKAE_BLOCK_SIZE); + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } else if (adlen != 0 || clen == 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(tag, ad, temp); + tag[temp] ^= 0x80; + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_encrypt)(tweakey, 0, tag, tag); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + } + } + + /* If there is no message payload, then check the tag and we are done */ + if (!clen) + return aead_check_tag(m, clen, tag, c, sizeof(tag)); + + /* Decrypt all ciphertext blocks except the last */ + while (clen > FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x01; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + memcpy(tag, block, FORKAE_BLOCK_SIZE); + memset(tweakey + 16, 0, FORKAE_TWEAKEY_SIZE - 16); + c += FORKAE_BLOCK_SIZE; + m += FORKAE_BLOCK_SIZE; + clen -= FORKAE_BLOCK_SIZE; + } + + /* Decrypt the last block and check the final authentication tag */ + if (clen == FORKAE_BLOCK_SIZE) { + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x04; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt)(tweakey, m, block, block); + lw_xor_block(m, tag, FORKAE_BLOCK_SIZE); + return aead_check_tag + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, FORKAE_BLOCK_SIZE); + } else { + unsigned temp = (unsigned)clen; + unsigned char mblock[FORKAE_BLOCK_SIZE]; + int check; + lw_xor_block_2_src(block, c, tag, FORKAE_BLOCK_SIZE); + tweakey[FORKAE_TWEAKEY_REDUCED_SIZE - 1] ^= 0x05; + FORKAE_CONCAT(FORKAE_BLOCK_FUNC,_decrypt) + (tweakey, mblock, block, block); + lw_xor_block(mblock, tag, FORKAE_BLOCK_SIZE); + memcpy(m, mblock, temp); + check = FORKAE_CONCAT(FORKAE_ALG_NAME,_is_padding) + (mblock + temp, FORKAE_BLOCK_SIZE - temp); + return aead_check_tag_precheck + (mtemp, *mlen, block, c + FORKAE_BLOCK_SIZE, temp, check); + } +} + +#endif /* FORKAE_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ForkAE SAEF algorithm */ +#undef FORKAE_ALG_NAME +#undef FORKAE_BLOCK_SIZE +#undef FORKAE_NONCE_SIZE +#undef FORKAE_COUNTER_SIZE +#undef FORKAE_TWEAKEY_SIZE +#undef FORKAE_TWEAKEY_REDUCED_SIZE +#undef FORKAE_BLOCK_FUNC +#undef FORKAE_CONCAT_INNER +#undef FORKAE_CONCAT diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.c b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.c new file mode 100644 index 0000000..b050ff1 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.c @@ -0,0 +1,988 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-forkskinny.h" +#include "internal-skinnyutil.h" + +/** + * \brief 7-bit round constants for all ForkSkinny block ciphers. + */ +static unsigned char const RC[87] = { + 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0x7d, + 0x7b, 0x77, 0x6f, 0x5f, 0x3e, 0x7c, 0x79, 0x73, + 0x67, 0x4f, 0x1e, 0x3d, 0x7a, 0x75, 0x6b, 0x57, + 0x2e, 0x5c, 0x38, 0x70, 0x61, 0x43, 0x06, 0x0d, + 0x1b, 0x37, 0x6e, 0x5d, 0x3a, 0x74, 0x69, 0x53, + 0x26, 0x4c, 0x18, 0x31, 0x62, 0x45, 0x0a, 0x15, + 0x2b, 0x56, 0x2c, 0x58, 0x30, 0x60, 0x41, 0x02, + 0x05, 0x0b, 0x17, 0x2f, 0x5e, 0x3c, 0x78, 0x71, + 0x63, 0x47, 0x0e, 0x1d, 0x3b, 0x76, 0x6d, 0x5b, + 0x36, 0x6c, 0x59, 0x32, 0x64, 0x49, 0x12, 0x25, + 0x4a, 0x14, 0x29, 0x52, 0x24, 0x48, 0x10 +}; + +/** + * \brief Number of rounds of ForkSkinny-128-256 before forking. + */ +#define FORKSKINNY_128_256_ROUNDS_BEFORE 21 + +/** + * \brief Number of rounds of ForkSkinny-128-256 after forking. + */ +#define FORKSKINNY_128_256_ROUNDS_AFTER 27 + +/** + * \brief State information for ForkSkinny-128-256. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_256_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-256. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); +} + +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_BEFORE; ++round) { + forkskinny_128_256_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-256 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_256_inv_round + (forkskinny_128_256_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_256_state_t state; + forkskinny_128_256_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_256_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_256_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_256_ROUNDS_BEFORE; + round < (FORKSKINNY_128_256_ROUNDS_BEFORE + + FORKSKINNY_128_256_ROUNDS_AFTER); ++round) { + forkskinny_128_256_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-128-384 before forking. + */ +#define FORKSKINNY_128_384_ROUNDS_BEFORE 25 + +/** + * \brief Number of rounds of ForkSkinny-128-384 after forking. + */ +#define FORKSKINNY_128_384_ROUNDS_AFTER 31 + +/** + * \brief State information for ForkSkinny-128-384. + */ +typedef struct +{ + uint32_t TK1[4]; /**< First part of the tweakey */ + uint32_t TK2[4]; /**< Second part of the tweakey */ + uint32_t TK3[4]; /**< Third part of the tweakey */ + uint32_t S[4]; /**< Current block state */ + +} forkskinny_128_384_state_t; + +/** + * \brief Applies one round of ForkSkinny-128-384. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(state->TK1); + skinny128_permute_tk(state->TK2); + skinny128_permute_tk(state->TK3); + skinny128_LFSR2(state->TK2[0]); + skinny128_LFSR2(state->TK2[1]); + skinny128_LFSR3(state->TK3[0]); + skinny128_LFSR3(state->TK3[1]); +} + +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_BEFORE; ++round) { + forkskinny_128_384_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint32_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x08040201U; /* Branching constant */ + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&state, round); + } + le_store_word32(output_right, state.S[0]); + le_store_word32(output_right + 4, state.S[1]); + le_store_word32(output_right + 8, state.S[2]); + le_store_word32(output_right + 12, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-128-384 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_128_384_inv_round + (forkskinny_128_384_state_t *state, unsigned round) +{ + uint32_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1 and TK2 for the next round */ + skinny128_inv_LFSR2(state->TK2[0]); + skinny128_inv_LFSR2(state->TK2[1]); + skinny128_inv_LFSR3(state->TK3[0]); + skinny128_inv_LFSR3(state->TK3[1]); + skinny128_inv_permute_tk(state->TK1); + skinny128_inv_permute_tk(state->TK2); + skinny128_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left, which moves the cell + * values down closer to the LSB. That is, we do a right + * rotate on the word to rotate the cells in the word left */ + s1 = rightRotate8(s1); + s2 = rightRotate16(s2); + s3 = rightRotate24(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + (rc & 0x0F) ^ 0x00020000; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_128_384_state_t state; + forkskinny_128_384_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = le_load_word32(key); + state.TK1[1] = le_load_word32(key + 4); + state.TK1[2] = le_load_word32(key + 8); + state.TK1[3] = le_load_word32(key + 12); + state.TK2[0] = le_load_word32(key + 16); + state.TK2[1] = le_load_word32(key + 20); + state.TK2[2] = le_load_word32(key + 24); + state.TK2[3] = le_load_word32(key + 28); + state.TK3[0] = le_load_word32(key + 32); + state.TK3[1] = le_load_word32(key + 36); + state.TK3[2] = le_load_word32(key + 40); + state.TK3[3] = le_load_word32(key + 44); + state.S[0] = le_load_word32(input); + state.S[1] = le_load_word32(input + 4); + state.S[2] = le_load_word32(input + 8); + state.S[3] = le_load_word32(input + 12); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); ++round) { + skinny128_permute_tk(state.TK1); + skinny128_permute_tk(state.TK2); + skinny128_permute_tk(state.TK3); + skinny128_LFSR2(state.TK2[0]); + skinny128_LFSR2(state.TK2[1]); + skinny128_LFSR3(state.TK3[0]); + skinny128_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER * 2); + round > (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x08040201U; + state.S[1] ^= 0x82412010U; + state.S[2] ^= 0x28140a05U; + state.S[3] ^= 0x8844a251U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_128_384_ROUNDS_AFTER; ++round) { + skinny128_inv_LFSR2(state.TK2[0]); + skinny128_inv_LFSR2(state.TK2[1]); + skinny128_inv_LFSR3(state.TK3[0]); + skinny128_inv_LFSR3(state.TK3[1]); + skinny128_inv_permute_tk(state.TK1); + skinny128_inv_permute_tk(state.TK2); + skinny128_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_128_384_inv_round(&state, round - 1); + } + le_store_word32(output_left, state.S[0]); + le_store_word32(output_left + 4, state.S[1]); + le_store_word32(output_left + 8, state.S[2]); + le_store_word32(output_left + 12, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_128_384_ROUNDS_BEFORE; + round < (FORKSKINNY_128_384_ROUNDS_BEFORE + + FORKSKINNY_128_384_ROUNDS_AFTER); ++round) { + forkskinny_128_384_round(&fstate, round); + } + le_store_word32(output_right, fstate.S[0]); + le_store_word32(output_right + 4, fstate.S[1]); + le_store_word32(output_right + 8, fstate.S[2]); + le_store_word32(output_right + 12, fstate.S[3]); +} + +/** + * \brief Number of rounds of ForkSkinny-64-192 before forking. + */ +#define FORKSKINNY_64_192_ROUNDS_BEFORE 17 + +/** + * \brief Number of rounds of ForkSkinny-64-192 after forking. + */ +#define FORKSKINNY_64_192_ROUNDS_AFTER 23 + +/** + * \brief State information for ForkSkinny-64-192. + */ +typedef struct +{ + uint16_t TK1[4]; /**< First part of the tweakey */ + uint16_t TK2[4]; /**< Second part of the tweakey */ + uint16_t TK3[4]; /**< Third part of the tweakey */ + uint16_t S[4]; /**< Current block state */ + +} forkskinny_64_192_state_t; + +/** + * \brief Applies one round of ForkSkinny-64-192. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + * + * Note: The cells of each row are order in big-endian nibble order + * so it is easiest to manage the rows in bit-endian byte order. + */ +static void forkskinny_64_192_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Apply the S-box to all cells in the state */ + skinny64_sbox(s0); + skinny64_sbox(s1); + skinny64_sbox(s2); + skinny64_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Shift the cells in the rows right */ + s1 = rightRotate4_16(s1); + s2 = rightRotate8_16(s2); + s3 = rightRotate12_16(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_permute_tk(state->TK1); + skinny64_permute_tk(state->TK2); + skinny64_permute_tk(state->TK3); + skinny64_LFSR2(state->TK2[0]); + skinny64_LFSR2(state->TK2[1]); + skinny64_LFSR3(state->TK3[0]); + skinny64_LFSR3(state->TK3[1]); +} + +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Run all of the rounds before the forking point */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_BEFORE; ++round) { + forkskinny_64_192_round(&state, round); + } + + /* Determine which output blocks we need */ + if (output_left && output_right) { + /* We need both outputs so save the state at the forking point */ + uint16_t F[4]; + F[0] = state.S[0]; + F[1] = state.S[1]; + F[2] = state.S[2]; + F[3] = state.S[3]; + + /* Generate the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + + /* Restore the state at the forking point */ + state.S[0] = F[0]; + state.S[1] = F[1]; + state.S[2] = F[2]; + state.S[3] = F[3]; + } + if (output_left) { + /* Generate the left output block */ + state.S[0] ^= 0x1249U; /* Branching constant */ + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + } else { + /* We only need the right output block */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&state, round); + } + be_store_word16(output_right, state.S[0]); + be_store_word16(output_right + 2, state.S[1]); + be_store_word16(output_right + 4, state.S[2]); + be_store_word16(output_right + 6, state.S[3]); + } +} + +/** + * \brief Applies one round of ForkSkinny-64-192 in reverse. + * + * \param state State to apply the round to. + * \param round Number of the round to apply. + */ +static void forkskinny_64_192_inv_round + (forkskinny_64_192_state_t *state, unsigned round) +{ + uint16_t s0, s1, s2, s3, temp; + uint8_t rc; + + /* Load the state into local variables */ + s0 = state->S[0]; + s1 = state->S[1]; + s2 = state->S[2]; + s3 = state->S[3]; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny64_inv_LFSR2(state->TK2[0]); + skinny64_inv_LFSR2(state->TK2[1]); + skinny64_inv_LFSR3(state->TK3[0]); + skinny64_inv_LFSR3(state->TK3[1]); + skinny64_inv_permute_tk(state->TK1); + skinny64_inv_permute_tk(state->TK2); + skinny64_inv_permute_tk(state->TK3); + + /* Inverse mix of the columns */ + temp = s0; + s0 = s1; + s1 = s2; + s2 = s3; + s3 = temp ^ s2; + s2 ^= s0; + s1 ^= s2; + + /* Shift the cells in the rows left */ + s1 = leftRotate4_16(s1); + s2 = leftRotate8_16(s2); + s3 = leftRotate12_16(s3); + + /* XOR the round constant and the subkey for this round */ + rc = RC[round]; + s0 ^= state->TK1[0] ^ state->TK2[0] ^ state->TK3[0] ^ + ((rc & 0x0F) << 12) ^ 0x0020; + s1 ^= state->TK1[1] ^ state->TK2[1] ^ state->TK3[1] ^ + ((rc & 0x70) << 8); + s2 ^= 0x2000; + + /* Apply the inverse of the S-box to all cells in the state */ + skinny64_inv_sbox(s0); + skinny64_inv_sbox(s1); + skinny64_inv_sbox(s2); + skinny64_inv_sbox(s3); + + /* Save the local variables back to the state */ + state->S[0] = s0; + state->S[1] = s1; + state->S[2] = s2; + state->S[3] = s3; +} + +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input) +{ + forkskinny_64_192_state_t state; + forkskinny_64_192_state_t fstate; + unsigned round; + + /* Unpack the tweakey and the input */ + state.TK1[0] = be_load_word16(key); + state.TK1[1] = be_load_word16(key + 2); + state.TK1[2] = be_load_word16(key + 4); + state.TK1[3] = be_load_word16(key + 6); + state.TK2[0] = be_load_word16(key + 8); + state.TK2[1] = be_load_word16(key + 10); + state.TK2[2] = be_load_word16(key + 12); + state.TK2[3] = be_load_word16(key + 14); + state.TK3[0] = be_load_word16(key + 16); + state.TK3[1] = be_load_word16(key + 18); + state.TK3[2] = be_load_word16(key + 20); + state.TK3[3] = be_load_word16(key + 22); + state.S[0] = be_load_word16(input); + state.S[1] = be_load_word16(input + 2); + state.S[2] = be_load_word16(input + 4); + state.S[3] = be_load_word16(input + 6); + + /* Fast-forward the tweakey to the end of the key schedule */ + for (round = 0; round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); ++round) { + skinny64_permute_tk(state.TK1); + skinny64_permute_tk(state.TK2); + skinny64_permute_tk(state.TK3); + skinny64_LFSR2(state.TK2[0]); + skinny64_LFSR2(state.TK2[1]); + skinny64_LFSR3(state.TK3[0]); + skinny64_LFSR3(state.TK3[1]); + } + + /* Perform the "after" rounds on the input to get back + * to the forking point in the cipher */ + for (round = (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER * 2); + round > (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + + /* Remove the branching constant */ + state.S[0] ^= 0x1249U; + state.S[1] ^= 0x36daU; + state.S[2] ^= 0x5b7fU; + state.S[3] ^= 0xec81U; + + /* Roll the tweakey back another "after" rounds */ + for (round = 0; round < FORKSKINNY_64_192_ROUNDS_AFTER; ++round) { + skinny64_inv_LFSR2(state.TK2[0]); + skinny64_inv_LFSR2(state.TK2[1]); + skinny64_inv_LFSR3(state.TK3[0]); + skinny64_inv_LFSR3(state.TK3[1]); + skinny64_inv_permute_tk(state.TK1); + skinny64_inv_permute_tk(state.TK2); + skinny64_inv_permute_tk(state.TK3); + } + + /* Save the state and the tweakey at the forking point */ + fstate = state; + + /* Generate the left output block after another "before" rounds */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; round > 0; --round) { + forkskinny_64_192_inv_round(&state, round - 1); + } + be_store_word16(output_left, state.S[0]); + be_store_word16(output_left + 2, state.S[1]); + be_store_word16(output_left + 4, state.S[2]); + be_store_word16(output_left + 6, state.S[3]); + + /* Generate the right output block by going forward "after" + * rounds from the forking point */ + for (round = FORKSKINNY_64_192_ROUNDS_BEFORE; + round < (FORKSKINNY_64_192_ROUNDS_BEFORE + + FORKSKINNY_64_192_ROUNDS_AFTER); ++round) { + forkskinny_64_192_round(&fstate, round); + } + be_store_word16(output_right, fstate.S[0]); + be_store_word16(output_right + 2, fstate.S[1]); + be_store_word16(output_right + 4, fstate.S[2]); + be_store_word16(output_right + 6, fstate.S[3]); +} diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.h new file mode 100644 index 0000000..0c1a707 --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-forkskinny.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_FORKSKINNY_H +#define LW_INTERNAL_FORKSKINNY_H + +/** + * \file internal-forkskinny.h + * \brief ForkSkinny block cipher family. + * + * ForkSkinny is a modified version of the SKINNY block cipher that + * supports "forking": half-way through the rounds the cipher is + * forked in two different directions to produce two different outputs. + * + * References: https://www.esat.kuleuven.be/cosic/forkae/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-192 also uses this function with a padded tweakey. + */ +void forkskinny_128_256_encrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-256. + * + * \param key 256-bit tweakey for ForkSkinny-128-256. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_256_decrypt + (const unsigned char key[32], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of plaintext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 128-bit input plaintext block. + * + * ForkSkinny-128-288 also uses this function with a padded tweakey. + */ +void forkskinny_128_384_encrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-128-384. + * + * \param key 384-bit tweakey for ForkSkinny-128-384. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 128-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_128_384_decrypt + (const unsigned char key[48], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Encrypts a block of input with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left First output block, or NULL if left is not required. + * \param output_right Second output block, or NULL if right is not required. + * \param input 64-bit input block. + */ +/** + * \brief Encrypts a block of plaintext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block for the ciphertext, or NULL if + * the left output is not required. + * \param output_right Right output block for the authentication tag, + * or NULL if the right output is not required. + * \param input 64-bit input plaintext block. + */ +void forkskinny_64_192_encrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +/** + * \brief Decrypts a block of ciphertext with ForkSkinny-64-192. + * + * \param key 192-bit tweakey for ForkSkinny-64-192. + * \param output_left Left output block, which is the plaintext. + * \param output_right Right output block for the authentication tag. + * \param input 64-bit input ciphertext block. + * + * Both output blocks will be populated; neither is optional. + */ +void forkskinny_64_192_decrypt + (const unsigned char key[24], unsigned char *output_left, + unsigned char *output_right, const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-skinnyutil.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-util.h b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/forkae/Implementations/crypto_aead/saefforkskinnyb128t256n120v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/LWC_AEAD_KAT_128_128.txt b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/LWC_AEAD_KAT_128_128.txt index c697cce..66918b8 100644 --- a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/LWC_AEAD_KAT_128_128.txt +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/LWC_AEAD_KAT_128_128.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = -CT = 368965836D36614DE2FC24D0F801B9AF - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00 -CT = AE5DCDD1285D5177FE251DEB99D727DC - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001 -CT = C4879E1B355D97DEA42CB661B2C1F9CA - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102 -CT = 059FE55D95148D4C1C485DDBF54D13CE - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203 -CT = 142CC1CDA6763A7D00DBEAC3428B32C5 - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001020304 -CT = 6ECA633CA9A7FCDE6405D6E58013FA84 - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405 -CT = 0438D3F55F865830BE95FDDBB0A7E87B - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203040506 -CT = C2E069E719F1BA1D5365FDA235FB0D87 - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001020304050607 -CT = AC7AD95573311214661E84A6D3038E41 - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708 -CT = A51CD94FCB75546450013F090E811EAE - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203040506070809 -CT = E8C2F8E67B44F9D7B18F693164B5D770 - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A -CT = AB90B02D62B3CB751BDF8EF83BB0D99C - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B -CT = 0BB2578F84FE2C44632B77FE9EBBE8A9 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C -CT = FD0D5692AEF0586B823EB8EBC2115EFF - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D -CT = 51EAB7523279C19C4ED743CBC2236832 - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E -CT = A85D987FC0BFAE45A351F236C65C0B9B - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = 709657D81DDC509AA20DC66F18FF9907 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6591AB7E3CACB1A5B0BE50633E735296 - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 872A74EF1A0A154AC03193A0E5F102BA - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 04A9C25803344D4492DC1B904DA1BB57 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = DA9BD7B18D1B3D2EDB4FBF09D4E57220 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B05B707C1124707B162A08FAA50B9422 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = CC8AAD64D5D49C093B8116614C3B7735 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E874561CE6FD1CEDC4B31F02258969E3 - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 71804CB26338625F1B75D86C2CCF8299 - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B7597FA5D5FD44E33FF9B5C822930614 - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 4C4986EA5E14B33DB84F153EEE28E07C - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 48630643B25D44119DCD293BA4A6BE64 - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 2A4260459974E7047BBFE89568CA6B8C - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = B746E916D03A0EF127D8C7843204796B - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6020335133C61586E214ECF980021ACC - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = AEBB30E1FE26D2768A58747B3F07D380 - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F4938D33A80FB4E4443695F60244969B - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = -CT = 5DF96DB329E92688242EF4E06F94FE1BD9 - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00 -CT = 2673FA1A8B8A87C239FA9122BE845864F9 - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001 -CT = 23553FBB2E7AAC2D9776804296258CEF50 - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102 -CT = 4A96AE33E2CE34B43B65F01FBBAD520F53 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203 -CT = ACA607799D59571E4AE951EA51C2994A02 - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001020304 -CT = C4B746BF4E5B2AAD95F82B30D4A74E8AAB - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405 -CT = 82D5DD3B5394AE09F72105337EB1976086 - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203040506 -CT = 51DCD53E68E4BFD9F0D32B1AC394110302 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001020304050607 -CT = 1FF90F25065AFBDBC85235D80C67D42A62 - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708 -CT = FC3B05B13416E41A184C26D3FD1038899B - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203040506070809 -CT = D668E9F18CCBE99CFA58EBAB53AB6AC722 - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A -CT = AB99B8424F6EB52D9EBDCD246B956480E6 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B -CT = F9D77FAE3684CAD07F28EFF71F87B8F11A - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C -CT = 7E9DFE88F158170F42974EA5372FF8E3AB - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 7B71CB2CD05FAAB5D5D64CE863AA93C1E0 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = 63D904DEFD19420B9A40B250B86D4054CE - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3B8A85662005A9B2A2A4108E12CF589288 - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54DB1359B547037B764A936FF71E88F178 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E943BADC0D679D2543121908242DC116F - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2C8B6172DB8B18D54AF410C0ACA7A60D27 - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0B254C399D0B3564FD9040115C11CAA5F3 - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B679D8B6ADDAC56A5BC0631A23181DC0F9 - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 300EC7D2F02F27887C0445DE62E0E84A3A - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A56B65DFC67CE9379851984848BFBF92E - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 37BE702B119B4397D8A81863DE2096C3CD - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 64E870F2C5E3E024C9B68ACDE9F33FD6C2 - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9E80DD965CDCA171BA9EF8A79536B2E556 - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8627169D7FFDA160EEDDC7A1235A6922C7 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F78AC9C7C5D132C3FFFF085C83C9FF984 - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 88F647A0D1CF1C54A2ADF794CE4C94F8AD - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2EEE4128127EAB1E3F6EED919421332D2E - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4627A07ED15E8C805980F83A378AD58149 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BA4BBAA4FFB4EBFF61ADD4D1DC4E136C8D - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = -CT = 5D59EF390B190BC473EF06E2762D61913F09 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00 -CT = 26E9DC5DED846431CF3F55160D8B07C54404 - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001 -CT = 23F2A81BFC133E3943508EFB83F08ED7B455 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102 -CT = 4ACAC6EB27F1E25028C79126442AA953F235 - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203 -CT = ACA00E04CB5F72845DEBF622AAE79A2299FD - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001020304 -CT = C439E8423E2707410956CC3B3A1E07AC6EE2 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405 -CT = 827C7D2D6D00069E9A19A615204EE82A182E - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203040506 -CT = 5115C9CF7414F4A04F81119C6562F0800A7E - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001020304050607 -CT = 1F132A6D4440388C101591DDAA90B7315C7B - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708 -CT = FC40775296EDA49F49C791048B4073DFAF6D - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203040506070809 -CT = D6E7E931557386F39FEF2C5238FDEF6AD456 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A -CT = ABC329950C970D2478FE1AF43A8025C2F3AA - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B -CT = F94541053CB870A2272E67969B11F8096F72 - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 7E2024CC11D898506AD720F616A8214D7068 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = 7BBC1DFA3B037F1FBF68E638E2B9FD853A83 - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 63C266FA0B0CF26A79B3B73BE7B20774F27C - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFFABE3E17291BF48A87A4CB8D6F751AD8A - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B6A8A235DAE21615461E2878B752C2669D - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E3982D9D1AFF650FB786C4437CD93B3B660 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB071D5D62EE385A6EB2C4176AA18E13AD - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3448E7F60DEAF425E77B6FB5B554781EA - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B66997C8981D3AD518FAF91536F59343C504 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C04EC30AE606B465F81927B226238CAEF6 - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C014DE2E3CF11A4F9A7465ED2CCAE76B4 - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774E758A42621923D16ABB339B32A3C8BEA - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642EA654BA87CCE80D9E063C55522D09B1A3 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0CCAA65D118B0D5085A0FF4DD97C85151 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 86625805AC7AA1E9207DCC60222413E99077 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8419BDDCD10DB2148B3D8CD7C657798270 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 88388E8278DDE21B055E92C452C10105806A - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E05478E6B215C87A8068D57AAAA35B69A78 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B505A03728DDB7920F73C7F0FC30A23350 - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF5D8C42C1C089414CAFEE130ADEEB9207C - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = -CT = 5D595FCA542F0B0074829E35D04E327E6CE091 - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00 -CT = 26E9E18BD799087A40BA583018AAF2F6A1EE47 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001 -CT = 23F207F951B9CE40E403084ACDACDECAF9FF58 - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102 -CT = 4ACAC227A04E7A569EFE944414931354BF090B - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203 -CT = ACA0E41D29F768CF6CB07F3992EB85535CC989 - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001020304 -CT = C4391448EC166A39FED84C743BC6DECAD72D77 - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405 -CT = 827CD55A1D961030254B4C73E26B23E8C89924 - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203040506 -CT = 51154C16B37BC34EDF1EA23A38B0F6964BA1ED - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001020304050607 -CT = 1F13E7F9EC6990AECA5E906E133F69E81C5E83 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708 -CT = FC4099BA5B9B101E367B68C2998D8DE030A43E - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203040506070809 -CT = D6E7A75BC285633714A9B58DE9D637D9FF864F - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A -CT = ABC392908CEE121C55ABE60380FB063010D72A - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B -CT = F945FD4EF7068447130E8033655F3F3F5368BE - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C -CT = 7E20B01F8578BF1B6D3393C3FA58C881CCF9DE - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47FE108D91C796E4C5F479F743AE6002F5 - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244CF302D862CE650CB6DB5EAC857A638C0 - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF71E1E1A327FD79110B31015BD16936A136 - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B630A5FE6B4ADA79252E322D79225ADDD14F - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B52CE39260CE40453EB1FFC53003B63891 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2EE658DB8E1F9F28727B0C8DAB85CC2779 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C985B7D3250C591AB49E36B546DDF34DF6 - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AE85221D5B44AFBF8D9D33725135214120 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092456865F8152DDAD2F3DB5494329AE234 - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16A90C49B53F17DC2721E66DDC1F13E295 - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F17EEF4CB187747F42D9839BF285554AE8 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07C5E7D7E49C3FCD4928691B14EC1F0A7E - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E6CF165020E4DFEA37F1E78A2A984D2A4F - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D33F4F25417FEFD1E0F69D047CED7C8C62 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F84702B178D705758EC035B2919DE4F720B67 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B47D5DB869BF9D9F0AF1602955BF48D800 - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E05613BBA02F5167B65ACD5B4E7D34B9DA1F5 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584A3AA34CFC919B6D75C5C6510FF54BA24 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF5634FFDA6125464B1DA8851218A015C2E5F - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = -CT = 5D595FC008620A1ED4FC7C9484F3A99C2D29961C - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00 -CT = 26E9E1E6EBE1AF67A0A337B2F0ACA5A59589C3DE - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001 -CT = 23F20757C3EAB5AB434950D23BDEF828059C0116 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102 -CT = 4ACAC27B201BF8CCB8E9F85FEEF6236F57159B6B - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203 -CT = ACA0E4DAA2F7C53C377BD7B30FFC434CD892F909 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001020304 -CT = C4391456E56D7123ACC7D2D595D57CD130284858 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405 -CT = 827CD57C2BB55BDA95C0A65A6363570F4AB87FD9 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203040506 -CT = 51154C400EDBFFF74F345BD53F4BF897465A1640 - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001020304050607 -CT = 1F13E72898A5F101939B39DB817C3746F93A1173 - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708 -CT = FC4099B8029D5C830707FD35AC3E2EB12706F936 - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203040506070809 -CT = D6E7A7EB2A4CB29FB93B0980B93E66B29861AD7C - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A -CT = ABC39241E171DE83DFF7F2F025EB6D865591E14D - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B -CT = F945FD846D2608C9910AC412809B43FC2D32569A - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 7E20B012D0573E93D316615F5851A0A8B7068C15 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D0B1C5DA586D4437DF7A6B58D1C11763CA - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A182D36322269C19C6083643FFE2CB856C - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A127DFC412F41CC213B7D8FCB9F0A9C95 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B630429DAE85CF15AB22D213F78ABCB99124BE - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59FF9C2D05F9D5FB430A174EED6EDBDD312 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E54977BDAEEDB71DF3677EEE007CB9245CC - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FE29272359DBF35A9346770A524EF3AD98 - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECFCF872745C8A06380FF4E36E6F450B2E6 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85E3B225EEF4885E8C77165D93536C083 - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD21CE4621705DF5CD8129EEE5188AE33F - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177294E5B985040EE8ACE3897F4CB056FCC - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E3B8B9C65DBC0170232ACE3C6CCC856D3D - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E621DA94BC2F4363BD8BBDCEEA2356CAE6A1 - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8ED21456EFD2F25E1BE1A42814BB74128 - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7D97B844E2FE0130339E47796B76DDBE8 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C697B108274910D4E46A704DF78410620 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD5456E7690C9D8A2041392D684D6F8FB7 - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FEB367F682D7B124814F46BD9575958B03 - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C6F6858C763F53D03FD47559837BAEF0C7 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = -CT = 5D595FC00A6F220F6461BD5708E491B01DDEB512DA - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00 -CT = 26E9E1E6CAE41E4B3116008CD10EF03ADE1B60503A - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001 -CT = 23F20757EE1B11314960F81A3076D908D8721C04CF - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102 -CT = 4ACAC27BDCC430B04231B4CB7A92935C83889152DC - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203 -CT = ACA0E4DAF391CC9CFE4D8CAD96AB759A2DEFE9FFD4 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001020304 -CT = C4391456A1C3A67F3FE36A30CA090BF3DABA3E0659 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405 -CT = 827CD57C82F77D6057E11372BDE1493DE8008EFCDE - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203040506 -CT = 51154C40A62FDAD62CBA7A61E72F79A4F2E2BBB214 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001020304050607 -CT = 1F13E728A91551ECF6595E4649EB66DCB473CE51C1 - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708 -CT = FC4099B87E850B8DD268FBF71970E6311BBC5F800E - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203040506070809 -CT = D6E7A7EBF7C49EC425EFE1A93AC5BEA88A73470EF5 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A -CT = ABC3924173320982B62E4E4211BFD69F02F4E58FCB - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B -CT = F945FD84A0D07925C5504F4341FD951ED10F3A0448 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = 7E20B012B7A7AD01E6C9B209F715DF9722B0CF44CA - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D0286DA491F74DEBD6C231B39AD1EBDBA1E8 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171094F557FDB86CA09864B0EAB961D3AF9 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A565C53E3FE3AAD9C5FB4415128BAEA33BF - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B72D2188F070FFCE4EEDECE9288FB5EFDD - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F58ACF7F9F89A2032DF578CED278C642BB7 - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E54665B5F58818D85BE94E9AD64A52E32087D - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8BE76D11BBAAA746163BE7DB77B383893 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3EAF82F7BD8775106EFE8BDF07614AF95A - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F857BF43D25544764C92CA75D7A2ADC81232 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD9265F2ADF2D57453F73A6034C07031EF41 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDD255B2F764BD4E7B8B3122092A6A9DE4 - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E3114C9647BC53230DC4E7830025468B9D89 - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E6212609440773F4C7E88FD194FE78B3CC008F - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F74D850398C549084392DF14A6C40E0BDB - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C708E9238189D553F1CD30517A382D063604 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9E1284FA551999B8DD30F74D843483CEEB - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD54FB429C4824075946797F454764CE9F2D - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE6789C048DDD9C3F8B74FECC49C40979669 - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60F2D58C52840E1003D6D6B18723631A015 - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = -CT = 5D595FC00A307F51E562ACA37C088693561D0AD0DFA6 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00 -CT = 26E9E1E6CA700ACBA559D41EA27DC35702938D8DB72C - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001 -CT = 23F20757EED9E818EC1C6E85514D54C8FE5E23967FAC - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102 -CT = 4ACAC27BDC76DB37264AC087C7226D9E3655DACCE8F7 - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203 -CT = ACA0E4DAF3CE4535BF26514EFD0889CBABEA160A9270 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001020304 -CT = C4391456A101E86893265E5E2AC3D4A52C9C9A974FDD - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405 -CT = 827CD57C82F75B39A9625B0638767494A33DD040A089 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203040506 -CT = 51154C40A6825664E6FFFCF5D17DA237F0AB9B139090 - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001020304050607 -CT = 1F13E728A9AA05B3A318AB523A956DC88F62EF171518 - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708 -CT = FC4099B87E0BB8F0075BA4C38986C41510D3ED807672 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203040506070809 -CT = D6E7A7EBF79E9E28038263E1E934E6F152DFC19BA7BC - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A -CT = ABC3924173982BD6396EEDCF1BC04957B6B78DCFDCBF - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B -CT = F945FD84A00305B0A0AAFEBD974C04ECEADE1EEFEFE4 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A025097F7B9E6B51F8362243A221F16C6 - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FF6A5AB509C698FAA361E284C8ACF4C130 - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6DEFFDD4C8A648617CD87B0024FC946B4 - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CB14D897F1DF603D7B8E9E1204A9D72DAB - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B76863FFE743E85922F9CFF69A979FEC2617 - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582180D5C54263AB90AB638EA8E40F35A392 - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BCC78862E00B96A930170CCA33FFCFF9DB - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8628211897CDF2BD9C91A5722B0882A8B3A - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52205B4CCF3EF38225537502678331CAFD - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F8575027FC44C030D408AA8237122C24803D92 - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FC7C00CFBB7B8F4B14084CB9710D7C9295 - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0C40C1CD0E77098E4750700D629B87CAF - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A8159B747F7C8C17EE8F42C652EA56F493 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED50C57CB67B8E330B9423D8DA5AE82D6C - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719A0E093A52F640E28003AAE384E96BE4F - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082B3DF2D23730A3641032F3664F89072E60 - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBAF5469C969406FD5C3EB8D1AA4C16410F - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540BF1D8799B564724771523AE84DE12A3D2 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C0117D14A7D88B0864EEF752E172C067D - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEF1B449C4CDE214DC1281A678CE42D8B8 - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = -CT = 5D595FC00A3093FE8E61FFAAE2C70A92B8DCEBF6EEA9CA - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00 -CT = 26E9E1E6CA70A356C20CCF0BBB655F31ED0B5C1F3F9BB7 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001 -CT = 23F20757EED9BDE4523A9A045D90E7F09160773701CE03 - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102 -CT = 4ACAC27BDC76D90975D9BA1CB4885D0ABCEE9A973E69F5 - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203 -CT = ACA0E4DAF3CEAED35138786C777A33EFF21808D502FF0A - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001020304 -CT = C4391456A101A0297E9939C82D60D36A0EFD174D26C34F - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405 -CT = 827CD57C82F771033B652C835B37AC3ECB053C5D4B5FBD - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203040506 -CT = 51154C40A682CABFAFBCD9CEEF649E50EFB4692179D4BB - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001020304050607 -CT = 1F13E728A9AADB7E42B4FAD307EEEFE7B352EDF2B4A684 - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708 -CT = FC4099B87E0BD6ABDA52563831CAAE6A0CFE3646EB6973 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF90F85AD9AE07AD73F33677B860E79A399 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A -CT = ABC3924173986D8D81C2D74D054B87E83A354182E7E1D6 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = F945FD84A0036548A8A8C5241628B25CD35837FD12CC5D - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A047FC1EE8DFF44F2D69426A4E7D80C6B80 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9D763C8748CF60BFFD14DE7C867B9E628 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F76E1E5F4C73E930248F67032962291974 - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA48F820D94576746B1CA6E91E6338498E1 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680DDC1D3D5A31DADD43A3A8497C558A4A95 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F5821735F43D3306B3927C7891A986EC116B701 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C09AF17F1A3EA49BF5D38F01A021E4A78 - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE86262E243268D9671F62E3D9765F14EFDED4E - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E5219FD99690155300111DF8ABEF5AD81C1FD - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750865B12D01668C5CB56B151905565D2C812 - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA4D83DF65CD0F857C488AB1C3FDB060D3 - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0982050FB8FA44AF386C839FD72F79E4D2D - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A8262FE80407C3C86D04D34FD3B429D42B90 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4E84FB0A60E73970642DC8FA729F5A5A4F - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F920BF902B980D17B5587DC239865B3EA5 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFB200B365C5D5F94B9DA9B671E84F4D5D - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D5066E7034E81563856F8CA40B7FB4B25 - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6F792115C81E74B3D72186C89D09B78F40 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BEFFB80E50551B7FF0756947C56ECB809 - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDA1BCDDCD98634D101ED50E0AC9A0E9E5 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = -CT = 5D595FC00A3093015367713A293D5314CFB60FB0A17A0222 - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00 -CT = 26E9E1E6CA70A3AAE1EFE12F446F6F9E106267709C60738D - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001 -CT = 23F20757EED9BD2373F278398844EA8F77EBA193B44BD66E - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102 -CT = 4ACAC27BDC76D9EC9CD918EBEE7D2C867FE0E0612E9B1D66 - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBFA87C2A358E364DDF3D3676E719E040F - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001020304 -CT = C4391456A101A0E3D6D00682B1742E4FA754EC00216F6AB6 - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405 -CT = 827CD57C82F771D6C9C6E33B28B32010591D226F6D8107C1 - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203040506 -CT = 51154C40A682CA589438185A5271D64AA6FB4367AB187B98 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001020304050607 -CT = 1F13E728A9AADB9BB8CEEAD4752B5A062F1BC9386EF2B40F - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708 -CT = FC4099B87E0BD6C77B95E0EB807ACDAE876799CF6FD23D97 - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94B0F4D41CFCCC2AAB0D27B5CE2034A857D - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A -CT = ABC3924173986D9E5035E7EAD971B5A10A67025359EA2784 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = F945FD84A00365BFFD711C2E11A799FC2AB3AB37D36B1D1D - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A0483D180D0625C3D87E0C1D4666C0EEE12EB - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCFCAE71F0D2A7C9C56317A62BD7589734 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A470A4CB5957EF551F662F647DAFCF148C - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D4962B8C3CD7BA9B19FD00C5B9DDED5DC - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D2204A4BA2CC66C62C2904CF32E9A88ED19 - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0F845293AD8C2493C48B1C896C52763F4 - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2F03FBC06F1DC94A8AA17D62CDE76BB2FD - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275CC93D983ABA29018889C3B536CCDD371 - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190DDC7D459B0D8AD3050BB5B6FD1E23FDB5 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867AA1277921CD90646A2E88AC3F06E586A8 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E935C5CCF66B50546654D089B85C1C054 - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC09811A0867C492A09A34A3A4BFC7E90C43A1F - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4CD39751653739B78D1853BB0C35D067A - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8D9CDB2764952A3459D57169F863DCDED - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940EA6EBA10DEAF52F56A30005AA06C2CC1 - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFF908CCAF7E288324681D0925DBFFA971 - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B2CF584C0F9FB944D446A0973C78EEAAD - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB59AC1B36BB172AF0480D2CE926D3BFFE0 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA1E3ABA8517596BE12407960A7AEB2D927 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5F1B7AD0A6FE762709B58150618957A48 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = -CT = 5D595FC00A30930171A6B090DDAB76C3E43BD07649E677CA9C - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00 -CT = 26E9E1E6CA70A3AAEE843E923BED7601DD77C129146D4E9579 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001 -CT = 23F20757EED9BD23441B95F02EC293536BE5F3674054791E00 - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102 -CT = 4ACAC27BDC76D9ECB0B5DA54731CF44C01578F724EF3346D04 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2A69C69F20F80722467CFB2B37118FB32 - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001020304 -CT = C4391456A101A0E34E9BA5B7CDB8FFE3F03B6E22968134AAF9 - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405 -CT = 827CD57C82F771D6F7B3DF91623300C721207A072BAC96D1C6 - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203040506 -CT = 51154C40A682CA5890AF62EFDC315C06FB571BF980DD19F174 - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7C44BF3BC243910F545F8961970E554E36 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76B29F4BD2A10C7DDDDB1D8BFD1231FC4B2 - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7545F98DFCCC60FA0E4896C6E58B3E809 - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA2994F857E9CE781127108EDB08EEFD92 - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8FB77C995B6631DE1D5F16BB098240D7FB - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD0A86B68E7F26C3AB9714938953A796A - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB856F9144423A83456A17B2BD7A6DFBE8 - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A4072F8BA668FBD3826BA57DD2124E16F78B - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F75FF8FC0EA4BDCF59FE29DEDCCE16935 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D2282EC81364CC8949AF10ACD484C24E5C0A8 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D7F751D3C8746DC2DFEC0A705A11E2262F - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5778DF63C567B0EA56EC456577EE22EF3 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D1C4AA23713088DCE378FF97AF816EADD6 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D039515B20DFFCD5D6D4FE330ABC93BA3F2 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9DE49E107BD7B9236A91F33DD08C985B0C - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E8916D81C47F08D90E7600725DF5A839B85 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146A613E50EAD8A26DD2B09AB7612FE02FB - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB2426E97DFB4529948273549ABF8B404E - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE804DE6EC0E1E6FDF87418D157AAB4EC99E8 - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940742AA7853D9BCA04B0D84061CD7FDB1B15 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC2E7CB82A83EFF80CB7514D1776EB7DFD - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B769B8315BCDF025C3921F468383171D7EB - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB5271836D0ECE4AE203D95607D443879A78F - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA1617510130D18F12D2ED5824411BD4D3355 - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5661BC4F3B16BB5849194EB3D7D7863A971 - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = -CT = 5D595FC00A309301719B62E4EAD783B9C912C8EAB8904D0DDB29 - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEF332F995A25D2C6EC4EF12E3729BF87FC - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001 -CT = 23F20757EED9BD23444F62ED0B0125422F15767C71BE763865F1 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02EAE0D9A6B164DEBB01BB42119C5ADF43E - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2ADE53CF7817C063164262BB27396122866 - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001020304 -CT = C4391456A101A0E34EDA3E2FACD1EC2D47390FFFCA96D24ACE62 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405 -CT = 827CD57C82F771D6F75D6592F3E0D3906BD2FCB2C7F82207D2F2 - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203040506 -CT = 51154C40A682CA589070AC9E30430CB45E220C17F6C5075BB22F - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7A28A0AE537ED93325D357191055E75E3 - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEC1E96A52C8497A2C7422C3E78075AC4A - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F688387120BB3EC8412DAB7775528AD78B - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA163445D3D472083E3FD7541F74213FE3AF - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F41F835FB42EE21EFC7FF456B13E5921226 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7E0813ED75AD2DE666E91F9A5F1F7382C - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64B53745CB9AB11CAE41E87111417F1087 - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C804CEC1B0EDC1CD0D4E8C3D6592487174 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7ADB596B57E0A1E2F31155183F4CC3553D - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824E5C364044D521FABD84624C986E9D77F7 - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D757C26F252BCFA2DDEE2ECFF7E23758D08C - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB16ED0E71E21EC6F68ED18F61E5393DC8 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D1189B31594565C2E21644E3AC5DB2D844B5 - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFEC5161EE0D1A809D2CF09916E723DDA7 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D83212FB6AFE69EF49EA42629FA11CA584E - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896B9852AD1BF146098FBD91401D44413570 - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF4C1D46638319A6B839018004779C1446 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01325B73CE87452D9CA9EA6B77181D28A0 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E2339FA6142717EBFC05F5F567F40EF31 - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F4DD938699B610DE843E633145DDAEB5A - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D6538E101B1640F03F13601855BBF2DAE - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B7602FA9AFA454F7C979A96A2A1639E2E45DF - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7818D91981035014581CD763858E86C73 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C3017B5254D37761007E3E0A9AD749ABA6 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC56629BE4951DEF7FF350AD688D4C63308B0B8 - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = -CT = 5D595FC00A309301719B30CCDFB8F5C9020B0A9CC201E413407129 - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB1B6A2BBC5D785C1E7C097D9EF39FEC13 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001 -CT = 23F20757EED9BD23444F771337AE695A6F6B48273407CFFC0B6D8A - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E0BD30FA8B1F571D0315966785435E979 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD929AA80A35B082712F97E2DF7225ADF196 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001020304 -CT = C4391456A101A0E34EDACA492172B89339D77BDD352FB96624CF5D - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405 -CT = 827CD57C82F771D6F75DD1F34B834EA063F9D69CB5C4D17FD7CD39 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203040506 -CT = 51154C40A682CA589070213CC231A297663133724FA88F6AC6BFC9 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC782740A024BFC2E4F84CB181684E2072FB4 - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA01E4D1E63BEFEADCA6B76C085BF603EBC - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC68E008253B559B8E68A574A0C6F02532 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE4268A81923426016DB11FC4DB9FCB141 - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190AB53266A27CEDD477EB3B9DE529FF26D - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA64362B3DB8AAB2CE200E49085889B7B6 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB642978E157E0D23238B47041933F0B957CA0 - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8989D8669F547CF97463C807D587C738E - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC018BF7BC68AC0824254C4F76BF2B607BF - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFF976F3DE0212A4C7CEAC92456D1455CEB - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D7574463123C4099416F4AA7FD0671BD3016A7 - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6FD1D386567DD425B63390AFEB19889349 - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD9833766CF7636C901976CAEC48081E0B - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA023AF73CE95F285601D2B55AA7D087913 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839FAEFA976C04E1176FD970AE81E5129359 - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBCB9650D8D09CFBEA82F256C709F3FB0BB - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3FE6E66534F790D3ED325F98F4713CC026 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4C3772067BD71FBEA31CF410330C923DC - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9AF6DA2276A28FE67396B6FA9C7BE84459 - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F633D18782B53A9F9EC6864FAD3A3A00419 - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3E36EF92646D1C27B1373687998A8B7 - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254DB07C4CF23548D3B96E87DA82FCE1AB6 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E191406C3FDD5B3917A2746F6F527BC55D - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F10FC1F53FA544244516D513E72E67272 - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995CA713B535311BE7BCBF5BCAF805221C9 - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = -CT = 5D595FC00A309301719B30ADF382AFA6F4A925758355F4187F0F4517 - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32C2465B319CC98685C35A15F361BA945B - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001 -CT = 23F20757EED9BD23444F77CF64B8EEAD2EE22C0550FBE67F88760AED - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E013823B7CB617D14913C3C78AD87CE0A35 - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211BD06EF43B8F61080A39A4C8FAF5A306E - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001020304 -CT = C4391456A101A0E34EDACA52BBF393E7D7E19CCD78D649F064AD3DE1 - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14C4FF79C8A85C2805CB08FC13CCC810DAA - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = 51154C40A682CA589070211F95BA5EA3581A8F841F37B186FF1C718D - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC78207830DA3C88AC411C267993A1B93123331 - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB58C7D392129B43CACE28A341E745D648 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC4719B9DAD9B9D4B940BD38777E256DF643 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D569A337B2F6BC452C0DF1510F436B25C - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE9AC33586EE87BE0B04337A1CA4574329 - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817EDC323C7F64397ADED324828555639E - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB642907D03AB5CD29C4C61A6012D8A4D3F96E99 - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F9F42CD0F6A9356CFB562573A3F73646E0 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0696ADE456C191B2C4326EBC1512242B79D - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE35CBC8F9A3766A07AFF342CC036B0E47E - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B054CE58A27BC0ECE74584DF24ADE9666D - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F039A1C2B6A7300B56BCA8C081E14E4794C - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD28BA2106A1E155AC43CEB3E8AB4222F1EE - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5E0D45B04882DA4320E3D8E0832D06F16 - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F3372917BA934B73093F42C0BEB78F46E95 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9A51CC557625E7C500BDC4FFBFB069C43A - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F283FD85694380B376443659C7A6C090AB4 - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA1130D777CE5131213EA499AA196D2033 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A423A912E946B8E51CC0C37DB57142DDC30 - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63AC68642E6FBFF32B329629E1D98038496E - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC36FDD66003A1EE4D4AE15535F6CFB69F6 - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB0F084781E8CCC9E5219142464A90756A - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D17DED4EB95A5027F60CADF0AA1A9C9BFC - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9E590F4CEFA90CE3D5B69BC2A161451DCE - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F419FBCD3541EDB9B6BEEF4D5AAF895CB0 - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = -CT = 5D595FC00A309301719B30AD9E571D4020C5D8413C24A4184F059C05C9 - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4258456E6FE8C567BCD43DEC0DF6EEF25 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001 -CT = 23F20757EED9BD23444F77CF5768D20ECD6C5BC800157AE1E800D0BE3A - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A63E0D78211BC5B076909490367C5EAE1B - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FFB529A830226EE359E1C16CAD6B546B96 - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = C4391456A101A0E34EDACA527A6CC3E7C4ABD518F8519D9BE8944A9C56 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB9BBD27C8AD9BDECFABBC91BC9F7CF2D86 - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = 51154C40A682CA589070211F761A9A2DEABA2907B2B94040E1F5E6017D - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795866D6F81502DA40E17D02ABF5BA6F685 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB98BD18DD3E9685052E08CB9DED5B74EE67 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C55532C2937AC765CEF07AF0D98A26EF1C - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01248742D7F006201E93D771C67D6BCFE2 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE57C752D6EFC8FFD8E0F108F1ABA2803B8C - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817A417AAD51846E56290DB91B9D0B12F275 - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB6429075889864AAA7513F3522F4EEA874BF0D5CB - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DF74A49F61F0282CC8A8B53236ABC06A0 - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A5F4BB0DC57A59FB73B5226C5C181C2A3 - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DACA2AE1F5532D5B5D18F268ED2EDD3E9A - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B99A6238B8A46DB63AF4E8EF92DD4C56D8 - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D6DC56BF9B60A641F266A2E388FA90A305 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280B3B6558167E01A2810F5FD315144B434B - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C24ED14CD8F99D664061A1549E2A57A38D - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EEB57263E835638E614D640C3E568E6834 - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC8D309652B5BEED50BB222589498A980FD - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CCCC53F56A3312E479641DC9766F192EE - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA86B22DC35EE480F721A9EFFCE7F1321A75 - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FDC9EF74A6A6DD685A51097C5FEDD64406 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDABDD40BDEBC88F80C41E3AF05031E3B23 - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F78EEB583F13D4B0E3C78AFB565BA5F8E7 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB24BE5F942FAD5BC87C2452601FAD335176 - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B78BB7477C023133B69FA8180059C2015 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5C9BCBE359BCBD33CD935A6E16AF91E8B - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C62FCE28E9979E20FEBBCA89A242F06C2E - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = -CT = 5D595FC00A309301719B30AD9E6D5C66695652D0B82A4855FFB8C8FBF2E8 - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FFD4D82EE711A189DB3751502BF4951DBF - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = 23F20757EED9BD23444F77CF570F33DF545D4EC4FD810F04FFFDBB0A2DB7 - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A2F3F8BC9F36828AEB7E1F97F19DAA22E - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CDBE70BBDF825E1A0274F7139B78DAEC4 - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC7DB73E7D6AE23AA4319AD1DA91DC3F272 - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FB74A8AE1F4F74790C9F2F56F515EC393 - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E4366FF0CADC0243ABE1DA2E9B7A6A4C09 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A31FC7D2F0CBA7C2B734A16CD63940AF17 - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB98508E417155B2871C8A55F79B54EB3323CE - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51724F7F882F13BA9BC8694D08574F04FC1 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E9EB80A887FC80A25B6E3B066260661EE5 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE57518412C9AA2691B8F2A91CC5397AA3B453 - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFDBE8577C661628A51787CAF3BC6B59ED6 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E55D803C17A41236613721559B977EAD7B - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCDBECCFE9F181F5129908CFB6723DCA04D - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A96395C5E29C87AF067D1720034E1A534B9 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23BF48834E0EB1375D224E3609C17E3502 - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AEA9A954E881725D838BAC8303B776F98E - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66F22CB7BCA30209A0EB286CC62832F64F6 - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA58E64AF2408BBFF61125FAE35501F93E4 - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208FC913B1C439FE61FA44DE91FACC9B799 - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18F4BB0F726E473A3C92F0758D6D279B40 - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FDEF226F0A0AD1E67E8A35962E6F65402 - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF759C0F1BD31A7FEF4682344A97D92EC96 - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D14962C1579D29C23D517507B451D2E59 - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06E586FF2CE3C5C9482CCA123685164E96 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA75EA45EED58D7001387622243DF3AEB5A1 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F7077568D47506554F8CEEF7971B1E5EFC4F - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB24394CD1803863E7D4AB14093A9802C95522 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B2EAF0CDFFA117E672C34FC71E3BB060C - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5628C4857C8DF368279E08A9B8E01221C87 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C6781C5BB73FCF0C1C0DAD1408FE4B5E0384 - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 5D595FC00A309301719B30AD9E6D72FE5BEADD2F1ED86BD9C2A12FCE96E241 - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D7C58FF46AA8CDC81B3F6BF8FAAC9D3E9 - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBABC68935661149FDB9F1FA38DE70FEE92 - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86B4057D9EAB54651C8BDC57C188F46733 - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC7FA943B99D5703A8364A4B55B3DFDC665 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73EDE0B9365C9B3B16BEBD88F6BD412A399 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA70E2FB943B025AC18799E505DECBD11C9 - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422C505CEA6A578E279D79C06B957244A6C - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35236EC7B267DE20306D51891F5FD6006D6 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF48FA3D830C61BAEC1CFEAC183895D3FB - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753EE09BEDD2380C27138FC005DCEF3F4FB - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E9230C9C10F72E8EA214A6462EC22EFEFD45 - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D420D238C8EAD5058FAB7A4D8DD2E3DAAE - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD086D56A9D5E962D84D9729A415C28300A0 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52F13335CAEFBDEB38291E4C1E6E852C555 - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FC86529409B0787BE227808DDAC2AA6F7 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966F6AD6103517C6E7B3F7E360951BDF5243 - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA231633D225F19A47EE016970CA62C0F42AF0 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE786343D51BA4E93743ABAAE2F344CFEEB7 - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1099619BA1C63F1D8C1503541D92EFB54 - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF306A9A98CD744635F1F3D24E5946E977 - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5ABE6D13F2AF98251049DA7253C730ABC - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC6E8BFFFA4B140805B8050BFDC5083FCC - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD0EDE9FC463D84235C254AB619A3FA341B - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795F381BBAAAD06A0DE5A8D5020D9E05C1D - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D0282F277FF568041723C767BE861432144 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD069009931287999E342B028877F781BB3AF0 - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA752432BF067DC290D12498740AF1EFA97392 - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5E20D2ADE1EF5504A54DF5C1352EC057E - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC0C6C767D5EAC4EE0DC85029EBA30D46F - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C24255913A1C328A4D9768E2846F05D32 - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D5F8D19C58DEE107F10889A9C73353F1D - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE0A39D1B8C598569E27503809CA912889 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 5D595FC00A309301719B30AD9E6D720FEDE74D8C9D1332ADA0413FC514E14918 - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D5840CF17E201BE49B1206CFA841C406828 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D72186F03887334FE22BDA616431650EE - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86414005AB71784DC89B6EBE430651B69927 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70D51859C4EBBBD8B170CC8BAE67490194C - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2FA665185DC85CEF11C79F28DBCB20DBB - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA798842F7FE695861D7CC6BE87CD2BE23DEF - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E42276A1A4E34C315971EA2890F96880B3DF55 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A352628110584F9B2606D235E75CF64B1BD55F - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5DA3F49957095E020D7BF1BE205D250BE5 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9A39D9FFD3C99F454DD2C320744982B29 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E51983516C08FF89DEC6A75A702CA355E5 - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D45962EBF776D74754831A427471D6E9A025 - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E16AE4696891A52CBC4579046E74974125 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF9C3160BA68670FC0F4C471B648DA9547 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB7892992810EF72C43B50EBC88F8E95403 - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDCBF77814044BF3FC9A9DEBBD393F545D4 - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161CA2E3E1916817F57F447EEC9A2A5FCAE0 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C8FE334156DC92E05735F7E7E6B67E1E67 - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1323254DE449925082F428D1B787DB7205B - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF3813BA66F0863BFDBA456AE5E8F7343582 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D979E00278021F6660081359D18C5DE16A - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F8BA7E929DDD3F27256212A573F859CAE - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DAEF5D07F919012084B2FBE1B3FEAEBC1 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF79519AF9DBC4E079D5CAD8E3A82B1BE20E92C - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D0249F83FD3FBD745EDA2886F3364A9F2C8F6 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904669F3034E3BE36C659FB9AB5E196AF88D - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA752452E832AACCF63816B84BD1141C259A362D - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B7B68038CF8F77934C2E08D52F47330B52 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7AE2876A85172E621C3EF0C2C7A9AD8363 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74B4F83CD85835516AF1CC223F71C9AC4D - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D293C3548BDFBB01245DD805FEB550BCF96 - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80060DC4F72E4874F0DEE3AE1A3CE089DC - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F9E8040A87C62FAAB95DBD115C4F87315 - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D962073589E5611C6E3450A3383E6BF487 - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5FF0C7CAC04C868AF50C8CC423EC9487E4 - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F0FFAE855079C9FB3234DE3E9556C1D25 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB9F578CCF08DE274BA57D076E5EB424BAD - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B85FEE9B3CACFA3F8EBE2176458C6776B5 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888B8B8B18702289BB94B561C3C22284ABD - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760420FF585C1E3EFE28E583D01BC6B2AF1F - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A3526205B73EF9734A5701FC5C1BF5D893E34687 - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D785AE2231E628013DF9D4F0F43F436A601 - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B6FF901217DB158D7936D1E5BD583FDC0A - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6A6D35F18CD6A3274ABD3A06D6F9E8798 - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A563C93DBB70B8D1A7D29965869E150EDB - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA5F515CC49E35F033A1B5D1FD4D16B391 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF03A9A54AF206C71938CC23006088F3CAE7 - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B99DF630E90EAF15FC6291637D4395942 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89E861A103A63DE41978D70D6D1FD03B31 - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D82C5C511B0433543A0DA30559C079228 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BB100FA2ED5B9CB22EFB65F29B7E6F217 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB13273C944DC5F201C83BD5A0D03F7C969DA65 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A67A166BA484A5B61BE27CC85A2ECAF2FE - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92B3C4788D8023CF667C4D9DD2F372B4454 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9002048299FF7611556547CAB33BF9A31D - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC280CB979D970A140E933A43DB7E349618 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E5FB02DF1A9094C9817C44EE6490B0BA3 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928CBEF4AE6E20CE176E2EF7D6F86B2E6A8 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD069046871DEE9E1C3F44C3182C6B032B79216AB4 - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521D27C573BEE6DD8AA45BC2DB084BA42D14 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72DF87FC012D47A776DC9A50D3ACBB0EFC6 - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A82B56EE88FCF1044EC65068CFD9243AC65 - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED1BD36204B47CA756D33A1178C45DDB81 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D291827251B0C90AF242B3D6ABF5DAD433274 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A72530445D5F7768550210500738AC62B8 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F3DF100E8B3F9C68122A306438D3E1BFD - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2DE4B325ADB9415DFE0D00D41F58E1E9C - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C621E81D43C90EF89DF55000458A76DCC - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F577F087F2CE528B7FCFC5C5B4671D83FB6 - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95F88FA0B9E6FFF85DFA5F4191232BF8C92 - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842169ACDDB99B00DD02511131E4F917792 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C0B7034631979CA316F175727C27C1D6F9 - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E4227604431B61510389EA637261EF11C68DBAD473 - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EEA478FA59EDA464086868AC171624FB4 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E46804537994FF6EE9CC0FA4D653A250E6 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685211E72C342D940E9F9E6BDB291F28467 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B219E227E942A1E0601D7E92CCAE04216D - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C11F83FCFA9EA2692C51243A83B10DFF3B - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA849E2721659AD32AC398C7D5F2D46477B3 - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034060ECD9F9384F2988A3E47B3A42BB05CA - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B2300870E355566DABF60F6928D47A64533 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B97F3FF60EBD48D8A33EAC81799554DC32 - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D899B2C993ABA79D2F8140B6D2F8813CAB3 - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDF256C27A0FA442F4B2FD1BCBF8E053DD - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB13273936DA20430D05C702246BEC84C7CF83230 - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A66998AA2F44812E8ADE28A609687D53DD32 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEF24BA17041932BFDB6716BD1EB99FDAF - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096040D454253BAD8CFE60CDD91B98E498D - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B167310B810CDF93C780BFEF71B7D0711D - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E7764DEA66825C36D1950F121BAC7590F47 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AA89A1B8F41AC65B802A90B616FC2D7C1D - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4E41A67605E6BFA44F94D2B19FB4A57B9 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA280524D29ACC339B81B9E497540275974 - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D58597463203C2821D8EABD33DA81CB1BE9 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825EE0B4EE59D6B8D0720E1BE88D0C079B1D - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED786204B5071584C6DBDB7A9B0FDFC3B1E5 - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F18FAFD65482E3183A4BE728CC0955F821 - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7E06B3A81E6479AF6774A0AC08E120840 - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4728EEA6177420E289559990DB4DFABBC1 - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F86DA9EF7AEDC5981A1D6C927180718159 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3CA38142C5E81F6392939483422A21E993 - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570E832B888C01E72CC1EEE0B0D7DA449C9B - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDBCC4BE72F1F6F7A1665B4F6D1AC0B785B - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7C130A184895C35B84009441327AB5AE0 - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B4436E4F7E850C411DE1A5CD0D69E9E73 - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A17D86E355464E864A7C75494DD2F2D426 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF3C0C1CF5E9A895714B4D1B6C2258C35D1 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E458C5145A6E0C0CBF212639731AF13BA7B7 - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9A8096922D77242656CD14039B23AEA8A - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DF9014227C4B28E3600B742F470A8F76A - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19B3F5D577196B31677CE43968DDD4C7068 - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D9C6C2EF2FE595A8C7D220A53234C29E53 - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043F7384D82FA6DE07D893FA29D8619C610 - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236DEDD023785421FD42F684DFCCEB52155A - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947A2B0BA3DAF725C5EC98D3A7C740C2430 - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984ACD3141005F56D602B6B21F7DF0F0C1C - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC87918ACCAED05A9AD726CE49CF6F1B62 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A5ABB1B2E64BB1081BCED81EC04C567638 - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CDFEEEC4E26CFE6D3F1E5B1344DEA2045 - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA007BB30CF0F1D75AA25A87B0312AE8A6 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F435B1B7413133D0C5F67AF9BC85DDF0CF - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0316E2D2B07A69DEE3F50B9FB1AEBEAFD - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775D23B5E36F1E1324AC89F3C3F4E396C909 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACF367D8319FA5D7C387480A5B9A270F1C4 - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A460A3F94CC17B25F571904DB5E523525FB2 - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211E8562755E721B354C866C3768112A079 - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834F098025F332FD529B6349A9DCFCC949F - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E352AD8C2981351A254E089D36B719ED417 - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788102A6E4B80D42FAEF869D0948F3820EAC - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1707696CAC493C3C7EFEADC699EBB313F9C - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE431486E07248CD54E31622C6C2787626 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759D6A80FCCAA21E9EB8519BAE6273AB0FA - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DF96A7E6F1E1D00391ED8740365B28F011 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7B5AA823692CD1AAC422734F4D479F2F5F - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAA6D23E8B1A14BC5D2040B7BE07B6BDACB - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9D9CDBCA657FAD1F6602649F8C0A2D4E26 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A188313DDCE07854881B79A76452F3A67D - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3EC8D452AC8AD170DDDA8DDC6F747D228E - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13ABB37091AE12C30FCEEBB5B161A3BF27F - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347F8926EFC9C416C864E2190800E174314 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862A6964E3871FF855720F4499E9D172226 - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E920BFF555135C4BA69459449335BA87CE60 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC72EE52F97DD83058ED93B81D8C4D732E5 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA260065D1FE155CB4393C86E8E84E34388 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C5B15A3534269041B171A41C1A419E54C - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D03A6D701C42FFF304859C84D6E36C5CD5 - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D3939E8AD7308746C02F7EF8F19515642F6 - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC286EC36CD6DD6B66581566AE093C746F - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984739DD2F3BCC12043AA04F653C7BDA8480A - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3B16B3E23103E2251022DEA7E35E80C704 - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A50836FF8F22ED1846A2553BC00395363A0F - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9FD1F54D02BBEB71D9B4BE3777109D80A - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA866E4A1F7265D4C09716C09370B2528AA5 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F4406E89D8F106639DC91D00CCF31AA2BD79 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0951E6864108846C0FE1C3F3B2847336374 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC42C790E760EADF5E359E98FB2F6F8F6E1 - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCD0FA87373D0F45A6CB42D7EE2F0F2FD3D - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A4D05575C1F2F0C14E1EB66850229AD7E - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA21181B2C134E44D38A420371DD33C0DFF0A78 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D58349690F4AB6F0ABBF6CD27AE504FF100F1DD - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E35338D9B58B7CD3BA9061E75265E62819080 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED7881432277B15011EDCAC2295B505A077DE060 - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F170373ACC9AAE926884C63AA4346E57BFBF00 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B35F3AA10D6239102551A7EA4817CB25D - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A2A4CC37031509A014834EB19776ABF057 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE94ECCFAED631434B0417F410205742071 - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD2B4B77075714F152A25AC7DC1EB9CBD70 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABE526DE45AE4B326C323036A331C2EAAFA - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD66837804EAF0F9779D209022993957C63 - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F92281A6E019AE8FE120B13A55A913075 - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B742492B8E367A53A125036086D049FB1 - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF7012CB8FEFA11E89023473ABB5CB959CD - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347ED13EA9F9E1885C52B49E09B563DB527B0 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D3B3C023853E39E3B9F7880B55660C040F - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008043BD1B903580CE29ACE4F4CCEB081F2 - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E273DD7ABC6E33F2F595E56213B673BDB - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F7DCA914C4E1ED804CCE8541B6C47B009A - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C6278E79DBC8A4CAA2D291BB63D6A3785F5 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D062BCB627ABB2D2B295948FA4AE82A5A45A - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A936875401B30DF75AF0BB5090D1A4E2B - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC661A0AF4CAAA0DAADDDDBCE23DBBB56181 - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731F88E9C69C834568B3144D9288BD85AA27 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCD3DBDA649F2B12395A47DA6AC41DF188B - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A1FD35DA1D855DEC40C1DF48E490A8ACA2 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432E3C1798E25E9C6F3842CF798E994C15 - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E37BD43CE0EA1269C45A530F0E83C38902 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A5CA7B88A3E8D61A766EAF664DAB417783 - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C09523081C2F9EB0EDC92263A29EF5981B8101 - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A836DE8CB288FA54711E46D7E41D3721FA - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFC9D7103F6F9CCA4F987B0CB7D5CA4A95 - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A117CE5BBB92B93E8D5247B71F58D8810B3 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816E93FEA1A7E819E37738047B7B264778AF - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B3CC4B1AA5BC226AB619A9F2451DF8F48 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F6DB1D42B49C26A4495FAA82571879691F - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143601710FC507C36BBBFE9CFC43C6650A93E - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F17037841C23895279DCB9FB1D4E41A0DBBC0423 - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AC2AB0D91CD797807FB5DADA8C9F3F6BA - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224755FFB17370C658AFD8B60B481034DBD - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DB0EC100DF51794E23D7233752C51956D - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213B6BE23D20E5F75BFF436A74C824175EC - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFBCB4194983650CF68F54C6A35B574C8B2 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668EC92AB704FF83077052FD0D84EBFBAD9 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F371C745224AC1218B69F25829B9BD648 - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B548D4228D28703D879F2A981BC2B80EA3E - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF7209A9D198174DA1B3B347BDE896C3BCB5E - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB05DB63AB5CE5DB45FD16E83F3D5006D46 - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C8EAABF560D3DAB29AC34B698EE4BCBCA - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E920084550796F4E14EA7D0CB2BA19CB508979B8 - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E2110583EF3A521102F3ECDC494C3491CBB - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F7674AA5211E8637F29A1DBBF676F4783CFC - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B58CE26793C990A4EECE5625DAE2078E5B - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D0621707303C63EDE4579451086F9283886E98 - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A988B658B03A105ED6470715F0B7171A8A9 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662F71B29DDE44BB29F1790115B1887EFD68 - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE8234184B6729EFCE7D085B4AEA845D41 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7739140EDAA925D1CC2E5A76C0D816EDB - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A14218E7C160154B4957FC1975087B9532E9 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB94326EE995A92D451F5264F6D840DE96DF9CB - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C75DF76C00F316788AE660EE0D2127C749 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A5413083A5C27D4CA75F79CA3810359C5759 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C09523836C2C80D540778692B76AF2915C5CC3AD - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833FD10C5F3FD0CD9E6F37793E011A8D946 - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE037778346FD3DA9AE1D31A5DF86468BCC - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B26B9D063F3DF7C9560F00D95A6DFB0E3 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EAC884D97E4AEA9E83581FA4E68E4817849 - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61C0AC57181C2DE420A33DF268370C5B43 - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F66302C224FEB6EAF7DDA753A06985A5B71B - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600AB5983BCF96EDB6BBD74552720618E7AF - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3A6BEDAAEB694D5B2FAE080477EEC179F - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8D6EB25439225DE8F371AFEFE872FD870 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9069149416E8965C09FBF623D66E9FD3C - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE62E554D6156CB0E226D11BF1188662D7C - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BEFE77FE0BB06ED0A39FA7B3990E242FCF - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14F6C5E5821EAC9333F9078A06D79F93E3 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D001DB20B8BED67EDDAEAACA45E3F022E3 - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F46FC112DCF868EA891FA10D04173B617FB - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5052704B52E65D0850204589EB567A454 - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B2627C64941EF34D8B641541871EE0EEF5 - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04AE4EB7002CFD837A2C8954D99405631EF - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C2498DB9ABACE7BC785E7F4C525237D1B98 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008453386D46C0C5DC26CC66F1E9EB8C926B653 - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E2190FB0E95FF754FF1A6943770CA3C04958A - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D861ED3FC6CEFA8FCF6D643F7DC8FE5DD8 - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9A0C9A4F766EDA63079D4F276C92CB24D - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D0621720E2EFCE115A7239DABDB771B1CEBED6B8 - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A984686DD4B177831C6DD85AB98B65A195F09 - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA2E629D2AFA25BBBC050439ABA14E3B788 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C91FBCDD494FED348FDC6BCCE77A4B328 - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A785E7B303E2318D644B4E1B0A3A43B32B - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAC36E8FFFB8E45AE8A7A47F72AC35AA37 - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB94326318AC57792758FC8004AC2510853DD16F2 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715E1BD64844319FF029A47B6A400E48F10 - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB0A66DFF5171BF2DEC149A4ABECACBFD - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EA5886085E890095683E41A308911C5EC4 - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C78CE81570AADF48243A6570FD48FBA611 - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D5A2982158D937C970F803A7DAA0A76320 - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D36FA248B83D2C443C7BFFEF9E9C551A0 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB51CDAA64DFAAD616E2F6E0D6846B5CCAF - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612835BAF3929513D2FD906F3931F1F6F911 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EBEE4C6E12C5D77B42E060973E76C7C292 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABACCC077B14BE78604D9E98FC3431E652D - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C268A00001669A960BEA546D0D25EC0382 - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C9B61143F7EA190C40C94EDB117DAC5EF5 - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9686D1B7570D00D2B8DE630017E7E780059 - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676E1B43EC32D4BF534D317969A904816E6 - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE20D9D206F5AFC46B5213B8C3603A77F8C1 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D9FA5771CCB1C0C208F91662E8538BB775 - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04A09000CF7E2639EF48876909CAD78EA3E - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F46445436FB4AD49D2E41694FA271CB3ACD7F - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E89F85777737B9BD550D415E4F6035F3F0 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D7745764FE767ABB91315AD1C2DD2DDEA - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3F7AA24CE5E5D5015DD3233C314FDC5EDB - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D08B8AB646AF5402F4E0D5FECA7A98A0E - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334267061CD264E3CE751A7A6453EC1CE7C1 - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C25DF7FA4EDD84E31066AC63493792CF0 - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AD23063F5D4062BCF28D6ACF293D9007A - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0AB972FF46647140C97D330E471C68AE0 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DE54F89B913A1196E2DC7D930ABF8CC4F - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464EBD684D5656D3388750EDEA2AE174189E - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA275A5C9E14C827995A9F8D0C190EB360B30 - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C627CE5B76E7F27C62FB3ACF2BE5534D6 - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7347AFC39253EEA8D440AFCBF6C4A23FB4B - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA353F3322DAAB6FB60CF74F3AFC532D099 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3016B3B0B240D5FBC0ED329736070BF0C - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C71550EA094AF2C5E3750A0FAE402BB489E23D - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CECA4E63A028F2F226CBF57FBEE8C345 - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB18761A64C5296992A121B128D4B7DB0C4 - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E8DCDE253D9243CB7EB00C27A41FF445B0 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53515603CE72442AADAC8F6360490265330 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A7B593ABBB086DE3E6D1D95FF14C6FA13 - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF8E9525146DC73DF6DC86E85EC108AB08 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612812F7B65A7223EFCDD0951FA64A8CF12C25 - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB11B9BB98AE328408F6DC5C76549170B72E - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC91FBD19562B57ACE1A7FC0489DE51A309 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B56E9B290F7ED07E2A08783F0F075FE3F6 - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97A5804E7BF85C71F6407A660FD5FE99AF0 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688E0CDAA34AE5E78B3D2AB6AE8CE81DA65A - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE6763143E5D7EA4FC7D76B415CC99F2DE17933 - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207815561A404DF450B878D2F755E1709E94 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D9846DB7D5545B33971AA4B9306AAC57E632 - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFF5CF09166EC9D47321B743F8BD11B9D9 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E41613AD260A2E949BBA8963B16AAB6D98 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D03483991616BF6F512EAC1BE7B9A9A465 - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D90AF5E0C484F2FC7DB2B9ECD4735D19011 - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCF36169737A1FDFFABF5984022609816B - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D079703CBF253C98F1AB2E0AC071713D71F - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008453342876B118D159DBC7A76B6B273E7B1492938 - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6111947C4A1A379BB54A5E6B6D78739C35 - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4AFC693BF93B5546DD945BD7ED404BB2A - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E625795A97AC50879107195EB1EBC6C3C0 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9332E6D1E42D7953466FB830598B4E130 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4B57ECF8B97DCE0AE7A8A1EDDEBB4787 - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528DE31A495B6E6DF6EB44C26E2882C14E4 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C60DC91B143A628557CCD373E8B59F64684 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A73408E7E9CDE88D3D64EE86D60F72E0DF88F0 - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35B53DBF3306A85A27389494280E3D32631 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C3F66AACB3181607B9A86D5EF2A5447DAC - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506AE6ACC83D34132022BAB3BBA46DAC14EC - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CCB159D70194A96629E66F740D7D9D0878 - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB1186758168E65F97EF4E7EB535D2F8A152F - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E81593EED65D8D03FDF294C1E1CCE467CF14 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521B04F84D9CACFC42DFF06F4F67F366062 - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A65CA102F32CAB08BC88EF4BD52F14CACB5 - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF500890FE8E09630A5776F00F2983AF40DA - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612812175BFF43428FDAF03E8F433E92C4351500 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177AE98570D137DCE3A27E99DC3C74DBFF2 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC929F6CE121DC2B4058E8C4DC58E98CA432B - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B5304EAE89F1BC378395B1FC1116CA09E044 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6075BB883F37636D3490747441EE7DCDD - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4167A496C151F4C132BBD9D57FF7C5340 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE67631049555BBBB40C3667D06643E8DA13B930F - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870281AF93E6D90D26E4D52326CAB7850A3 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D984420D7FEA221368F24C164714792A9DDD80 - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB181CD52F0677792877F9AB565B218425E - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E49317DBAFBBF7855C9480A2E4C1689BDA6B - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00EE1CE7D36F78CF1F35DCEB931F84B2B0F - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008ACBCA752221FA049CB5B8C64D35954FD - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEB2464C04EFA54F015DECB730DE8F58C0 - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A79C2741383EB5F79CC947EA6A83B8BAE1 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F1F9D7A615FD45C0F0ADB48ADD377CC5BA - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131C61EDF62F16C5CA01E55C0735A8790EC - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FED8E75B9ED1656B8F94F2A6BD7C29EBCA - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621F34735D125057453D9D64BE358158AED - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC91260BF1647BD3169ED3331513A8D107287 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4CE2CB3747842AFD0EEB221D45149AEDCB - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D10DA8A7D62C5B6E0CCAEBA2621C0FB2C5 - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609D2EE31245E1B6C5341A146647081BF0E7 - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868B07F7E3228E9C2A921A1E53CB01D9102 - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD2044AB2EC799F99058F7AFBC61AFA0459 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35B134DF0D5C2E00D6EAF91620823E7DBB8 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45CC0E3A7DA2F85D20D013891AD8A24AA3 - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC032FCFB059AEB96A96D79F7648420A0FB6 - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB11843D455338E0354E13CAFB828B96603887D - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5F91F3D05C182248AF4D649517A3A0C34 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D535216882A253BAFCAEA2B8E43865FA3B49A7BA - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654BA401C238D56909ED5318F1C69EC3BF6E - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E8EFACE36371B74AE73835097088C76B7E - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB1E7C233C42E9A012397966928A89DA1C - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A1DD63849DE661875DEBDA6EE3ED3E5A22 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910A9E23B80E8366005C4AB9627C488921B - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530409661683E7A037DD27ABED0D27FCF765C - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA45413F503CECF6F4CA21B12EBFBEB8B1 - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C788950B824C6410BA0A471149F3E44A5D - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410BB2E4BC239E49328CE71C75514EAA9E6 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870591B7B0D0E564676BC597B9181D7912CE1 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C41FC9099D9D9156DED361EE6C4F3D392E - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB108CDC255B29691D74FA48D0661187672BB - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE7B2772F7714A70189507A3FF7913D6AC - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E9216844777B699692BDEC3EEC6089F5E35 - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1F60AE090E00F59EA76CD9E72A729CB40 - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEA4E840A54D24E500854ABA38DF28B6290 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7763AF2F14BA6372E318990F117FDA6F84B - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F170151F8A3424D5C4C4321467436F87B87B - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F2C39F29322D3F5E7513704CC78848E3D2 - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE312EBC48E50FBB372165CA42D9499AFCE1 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E6213763CBAB49CEA2B16A8141260B1761553E - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121D378CF52EFDCDDFFF05AC89AD407C6DB3 - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92BA8B6B3A37422AD1C8A59D855FE04EE1 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1ACCF77FF2DD178325EFAA49A9EAE6DEBB9 - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAF79F45C3506E6504BCE311FB2BA9C97E - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E01C5C3DE7357F8CD226E5793C0C3617D4 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B08E7CBD670955A083B9CA5984B9DC1BA - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF8554CABC5C4A4E1E05114D265F84DFDAC - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7037DB404091A3E58D2D40E8E0440FDE3 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C1AFF34E81069211E2D5FA2105E0AA13F3 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB1184370AFA0517385321B661911D8C6205E8384 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA7A47BFF58707949FCFC9A6B5A6E8814A - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686F164C36C66E48439EA60975D04F92F62F - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1FE660CAF6F80C49185072EE86D0083CE3 - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88ADED44742AF474B026419853EFE024BC3 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A784DD3BC94A2BD738E82DC6340D98842 - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A12641C60E2CBCAFBF181A9D169ED7D2A299 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F12FBF7D84941AAE70462453B7A49E653C - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E35314ED6A4719DB1F5C9E399693A802A - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17F598AA7EFCD64964675D24A565D00493 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C756435408B2C0856C4199AE11F31EA662ED - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D683A48FFAA726A543C590DB8161F7454F - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870599392061D2033BCA510B4279BBFD8393397 - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FB953DF04D89437419FB6988BFEA95246E - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800EDFDE0B971E3F4A8C1AFA5ADDC0B0A81 - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F2A2BDCACE61D50C7E50BBD5E59E8C878 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EAA1791BF0B1778C5BC895E17DC3E5DAE - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1804A45EE13F6B0CF8320A03F668B3939E6 - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD0B3A85BA9FEEA671B893E815DB8A9B2A2 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F98EF5ED1340BCE092FFC298518F57982 - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F170082CCD7E602BB35B0F3BBE0AD61BCEA89C - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29005BF24B9BA21E3BBD5D1ECA4B813F5E5 - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DD792EB3EADEFA1134C091FBFC55B5AC83 - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C45696998E3D00B2800F1B0B6D2A15626 - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F9469A9378C5347AEC16A8406FACAB7B - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C85BC2708E4B0DFEA050F1853685D482B7 - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC307A66521AC54E31E68C4D6FFC396C1456 - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE1DEDE3E73A188266B83222D02F18FB7BF - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AEBB090B3A1B72FAF7503A0E9976D5247 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D1E27B95BECEE7620B2525008227C9A6 - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880C70AA140FD58081CBBF536499170E078 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F87F92F678D59638779651535E54AA3CC5 - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EEC301F30062367087196802150808075 - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048678F478B63B53EFF069F96091CF55FE6 - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA29EDD3FE5032BFD1F515E22E8C89316FD0 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA4C92660C422C4CB44683C1D84988D5942 - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A8305365ADB7CD88348A81A98AB9F4D7B - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5FA3880D2DCE9CBF399C27B85E3CA082C - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7826387ABA0798DB7C9C9E39AE872E1557 - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A3D4672636B95CEEAD4D2302937BE43FCD - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14D56F0C8BC4C72FAD3112249A7191A9EBE - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6FC883B1C155C9D32C8DE04FC9B9832C9B - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA1701549545A251159A158FA7EFAD1DB9A24F - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C7568625CBC0F9CC1AF9305FD5C2E7756BB71E - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B0700CBFD3F00AB6125442F7E65E5E9A0D - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870599365BF238AE8D6F878A9CAB5F375F3023B7C - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBC6D4A9511F32D9C839D2898E664F86F51 - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E39105C8CEAB76DC22346F35725E6E9A54 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F6375B25F26490FB9729613AA156E9CDC09 - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE1C4858650E794F061ACE5C88947F1356E - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B72345A5D982890D534B3A0E637FCA9B0 - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD04168603E6E4A8D425655420EF52B9695F1 - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F11B9080708BD6A129DCE1B84A0A41C5FEA - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F1700800E746283990C00230CCF8CBC7CCDC29BF - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F290013DF8E2568342A0ACF13D174BFDC96744 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC173CAB49763ECCB4D1B5F76C92A0BAB27 - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E35C2A6864B8BF2A80C2F87D46426E467 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1877CB9F646EC9D81226C5D9EFB84D23F - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C839B1E7505092A93C896EC71EA2A8DEC129 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC3053F22D96B459572934E280E7A9CB10CE78 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12DA7BC2BEF13B83C056D8A7D3BA23B9B3E - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE819507DD270D96A1292FA78F8662961B9 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D3BB9CFCF3898D0BD6804D19BBBECB0891 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BAC142A149EC02E00F725FCB37272AB510 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84FD3725A18173A77BDAC40A061921C8184 - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE219CAA4F185C15C1354BBD8EC498D5C8 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C447FD2E0B0349132F06C5154A77CAF0E1 - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296DB7D8D924A7D091321ACFFAC5DD330E9D - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA442D9AE200FC7504FD305944F594B36AC61 - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A478C66B48BBDB632083A0002882A897858 - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DF2E28B325DDD186B947356203EB65800E - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A78204CABE719A57F058B045A11B6829D67AD - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36766FED51BA686A5422E0B089BD8BD37A0 - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7D998D4BE5E0F75A499C65C1E04CE05A0 - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B5ABE26FF26AB1DF8BF0F590965A05449 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016DBB7A7F80B06BC40910BD61610E2093B0 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A197C6570E80F70C17B3101C96C17441CB - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B0895624C8115F614D8EC1D3005CEBEB1B51 - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657C7AB16A3D0516F89AB354BC633CFBAF34 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB944CED71E7236F58B42CE271EBCD9A89C - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E3507018162630198AA754943574D2FF9066 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BE84CC36894163647FAE56072A236FD9B - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18C6F54DA327A975FD4B029850D5D166F62 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15293E73CC2AC3327A87ABF8FEE73B9B69 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD04125AEBCB352ACB3587EA51826AB6EA0B1E1 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118CB6BC6078F334AF97219B336860E3D41E - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B7D13345255CF92801A9A3D5DC4171B0A - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D1D97E52A6B403213A107244093E0484E4 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16A167BE655DE61783AED326EF55C721A5F - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E6406A682CA732E0A6343F3972A7A5D0A5D - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1569A99E822F0CAC39712A2A64C98C4D6AF - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395ADF18226D6D19CE23FCC627AFB7C6C3E2 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC305343AAA2D6F5BA3639A7D9D0A4D7D92DC8CD - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D768E36CFDE4A4024F36147D4A58D19D1FF - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FCBCC2B1D46679034875DD246EA8D48FC5 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D3817211241CDB68B4CBF51BD8C96A32DD83 - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD5D63D548FF76B64DD3A5285DBB18DFA9 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F819DD52EB8D6769F85188EFAF4B2338A4C - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EE46009F3E77070C26B33C1EC759161AD - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C41778E4F42A21E2F0AE73B6E1B3B8329BEB - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6C1BF6BE08AF1FFC1CF8D4A19EE3807311 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247402586228465BB002D7B922ECD81AEA6 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B156BFBDFCCCF6766F1904F1A1C312B613 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF2F630AB3997AE3D77B29119AFB72F0DFF - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D89E30FFA811B016E849B2C36D434B6DEB - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A367961E6574D790B66E7CC9EBB59B98126848 - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEBE93B6B354B70E3441ADC7B984B289E5 - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B038D5D7060A8A963EDE9633301C208E967 - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2A8D1F3FAE1DFDA6E58B9A1E282D89A6CF - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A1B8B3C2D418160B075C1D96B44E39135B17 - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B089AACF7996B1E8DA274D271C8B3FAF58EE4A - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657CE3C393212A76E0D530B7A7484027CC68B8 - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB9E1AD8C999819A31547AC88977714CCC621 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E350F3AABCF1B3257ECA12FECCBA04218041B5 - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BF94329A0A9CF7770A75A624FDDB6DBDF11 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18CC65F7E1F5C7FF605DE1201AEF4997B51A0 - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15CDB18E269F5FE4AD1A7D76B754C594374B - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD0412587291923FC174379862D8948DE128B3D5B - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118C63A5A3A01D520A8D225D4050CB3F82DA51 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B932E6BC3517995DF2147931020613A2A71 - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D163C086F00E66CB4D46B0DE409B52FFDF1D - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16AD57674A344872F1B9BA11AEDF8EFD67087 - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E643638C47B1B9CD22876495243731C28E544 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1568F5DB27872ADE446B5D77646C3F8EEE051 - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395AB80BB44948A449C10528091B3B48C24DDA - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC30534303B825CF81BCB170C3E2DD9F0C9291B38E - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D761C17D36D90C9B688A4AE823711C1113EAF - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FC7D5A30ED8E9650C085E26770C3CE871010 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D381DD015B91A47268BDBC8E5DE46EB1622764 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD6FBFDF71E04D475B68A55F94C822E5DA1F - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F8113675C5E1441182B7A093A7C114FF6318F - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EAE8FBB19CBBC343A474A909BD6D9517BBE - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C41732BE00A74F26E4977EDD14175C0450F946 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6CD5ACB995ED8C42AC7861ED3AD1AB805E44 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247AE2A57BECAB6C48EB820598077D92D5383 - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B12D5A351568E8E8C677DE44765EA049135B - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF23A3D7D25609C16A140DC20624A62B76DDC - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D834F843EC4C1B18185E102021702756071C - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36796D32416C23DDC9F31EEFA35AB90F389BBF5 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEF8B133F875DBB9ABDF5C781FAE27A567FE - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B03A94045083794E1A78FA226A354AB8CC80B - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2AE61C3EBBF92FE3B9C48797B1063407E816 - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A1B801660053CFDC1CC57345FD8E411FEB6E52 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B089AA360D073EA98E48B3652225E7DE03D82928 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657CE3718918A04D294E13C22B664F4BDF44446F - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB9E1653A2E7B400B45079B7E80705658D8388C - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E350F356BA31FA1700224E6A3A53706152D6A4B3 - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BF90C0909DCAFFDCFCE67CE39159D9C040515 - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18CC630D93EB5FF1C83D094B7821E7D49EB1114 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15CDE060C1E89F25F15C13FFD1A0FD918EF307 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD041258752AEEB0B02978E1D36E5663017B35339C7 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118C630CCD4A9BBF7EC22EB9A71F33A11B4309C6 - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B9391417A58BD7677D802A14FD57306615EA5 - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D163B168125D1A48CBF7C726DC5AD8A0F536D5 - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16AD5D78FFC6707821C563420178B56618A77E6 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E6436B224CF885EDEE87C831739063CF127774F - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1568FDFDAEFA7590625B1D898B5420AE3E5D1C8 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395AB8710EA7734A02B93011ECFFEFAC35B3EA5F - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC30534303332F79D09D518693F6F813B935D60EF641 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D761CDCFBC3CBB7E6ED73AE25F7A5C93CD9C34E - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FC7D26BB86CA85AB5E30FCBBAF04AF11890149 - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D381DDA47DC2B9F95E1C29A98E6B50CF94167164 - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD6F5809BAD19BF4D3E48DFB9635D6AA31492C - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F8113363D6D3C528897A97975753465479309A2 - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EAEDF76CD16742773A5FD176F23081D0EB733 - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C417325B695FF53252C931FF41BB22849ABCE88A - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6CD5881CA73398668453C2DA1258574F29104C - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247AEB4B086C356C448A7D1596FADCA91D2BED0 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B12D3A59572F5D48CBCFCDA17295B4C1F482FE - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF23A68A97C05988441BE9AD9D171D8C7E55025 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D834DF06A190A02541DA4D1A60CD60F120326F - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36796D3B9794635E895ACEB43F1859D828CFF4ABB - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEF8B57F08243215BDF745B3352E951B0FBCDF - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B03A9B5C51E1008D904A4B785124E1FDDCBABB8 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2AE6508E6FB3F79B412A1627AB7DFA755E0A22 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = +CT = 368965836D36614DE2FC24D0F801B9AF + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00 +CT = AE5DCDD1285D5177FE251DEB99D727DC + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001 +CT = C4879E1B355D97DEA42CB661B2C1F9CA + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102 +CT = 059FE55D95148D4C1C485DDBF54D13CE + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203 +CT = 142CC1CDA6763A7D00DBEAC3428B32C5 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304 +CT = 6ECA633CA9A7FCDE6405D6E58013FA84 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405 +CT = 0438D3F55F865830BE95FDDBB0A7E87B + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506 +CT = C2E069E719F1BA1D5365FDA235FB0D87 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304050607 +CT = AC7AD95573311214661E84A6D3038E41 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708 +CT = A51CD94FCB75546450013F090E811EAE + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506070809 +CT = E8C2F8E67B44F9D7B18F693164B5D770 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A +CT = AB90B02D62B3CB751BDF8EF83BB0D99C + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B +CT = 0BB2578F84FE2C44632B77FE9EBBE8A9 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C +CT = FD0D5692AEF0586B823EB8EBC2115EFF + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D +CT = 51EAB7523279C19C4ED743CBC2236832 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E +CT = A85D987FC0BFAE45A351F236C65C0B9B + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 709657D81DDC509AA20DC66F18FF9907 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6591AB7E3CACB1A5B0BE50633E735296 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 872A74EF1A0A154AC03193A0E5F102BA + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 04A9C25803344D4492DC1B904DA1BB57 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA9BD7B18D1B3D2EDB4FBF09D4E57220 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B05B707C1124707B162A08FAA50B9422 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CC8AAD64D5D49C093B8116614C3B7735 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E874561CE6FD1CEDC4B31F02258969E3 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 71804CB26338625F1B75D86C2CCF8299 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B7597FA5D5FD44E33FF9B5C822930614 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4C4986EA5E14B33DB84F153EEE28E07C + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 48630643B25D44119DCD293BA4A6BE64 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 2A4260459974E7047BBFE89568CA6B8C + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B746E916D03A0EF127D8C7843204796B + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6020335133C61586E214ECF980021ACC + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AEBB30E1FE26D2768A58747B3F07D380 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F4938D33A80FB4E4443695F60244969B + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = +CT = 5DF96DB329E92688242EF4E06F94FE1BD9 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00 +CT = 2673FA1A8B8A87C239FA9122BE845864F9 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001 +CT = 23553FBB2E7AAC2D9776804296258CEF50 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102 +CT = 4A96AE33E2CE34B43B65F01FBBAD520F53 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203 +CT = ACA607799D59571E4AE951EA51C2994A02 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304 +CT = C4B746BF4E5B2AAD95F82B30D4A74E8AAB + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405 +CT = 82D5DD3B5394AE09F72105337EB1976086 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506 +CT = 51DCD53E68E4BFD9F0D32B1AC394110302 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304050607 +CT = 1FF90F25065AFBDBC85235D80C67D42A62 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708 +CT = FC3B05B13416E41A184C26D3FD1038899B + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506070809 +CT = D668E9F18CCBE99CFA58EBAB53AB6AC722 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A +CT = AB99B8424F6EB52D9EBDCD246B956480E6 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B +CT = F9D77FAE3684CAD07F28EFF71F87B8F11A + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C +CT = 7E9DFE88F158170F42974EA5372FF8E3AB + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 7B71CB2CD05FAAB5D5D64CE863AA93C1E0 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 63D904DEFD19420B9A40B250B86D4054CE + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3B8A85662005A9B2A2A4108E12CF589288 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54DB1359B547037B764A936FF71E88F178 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E943BADC0D679D2543121908242DC116F + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2C8B6172DB8B18D54AF410C0ACA7A60D27 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0B254C399D0B3564FD9040115C11CAA5F3 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B679D8B6ADDAC56A5BC0631A23181DC0F9 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 300EC7D2F02F27887C0445DE62E0E84A3A + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A56B65DFC67CE9379851984848BFBF92E + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 37BE702B119B4397D8A81863DE2096C3CD + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 64E870F2C5E3E024C9B68ACDE9F33FD6C2 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9E80DD965CDCA171BA9EF8A79536B2E556 + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8627169D7FFDA160EEDDC7A1235A6922C7 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F78AC9C7C5D132C3FFFF085C83C9FF984 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 88F647A0D1CF1C54A2ADF794CE4C94F8AD + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2EEE4128127EAB1E3F6EED919421332D2E + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4627A07ED15E8C805980F83A378AD58149 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BA4BBAA4FFB4EBFF61ADD4D1DC4E136C8D + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = +CT = 5D59EF390B190BC473EF06E2762D61913F09 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00 +CT = 26E9DC5DED846431CF3F55160D8B07C54404 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001 +CT = 23F2A81BFC133E3943508EFB83F08ED7B455 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102 +CT = 4ACAC6EB27F1E25028C79126442AA953F235 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203 +CT = ACA00E04CB5F72845DEBF622AAE79A2299FD + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304 +CT = C439E8423E2707410956CC3B3A1E07AC6EE2 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405 +CT = 827C7D2D6D00069E9A19A615204EE82A182E + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506 +CT = 5115C9CF7414F4A04F81119C6562F0800A7E + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304050607 +CT = 1F132A6D4440388C101591DDAA90B7315C7B + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708 +CT = FC40775296EDA49F49C791048B4073DFAF6D + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506070809 +CT = D6E7E931557386F39FEF2C5238FDEF6AD456 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A +CT = ABC329950C970D2478FE1AF43A8025C2F3AA + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B +CT = F94541053CB870A2272E67969B11F8096F72 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 7E2024CC11D898506AD720F616A8214D7068 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 7BBC1DFA3B037F1FBF68E638E2B9FD853A83 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 63C266FA0B0CF26A79B3B73BE7B20774F27C + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFFABE3E17291BF48A87A4CB8D6F751AD8A + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B6A8A235DAE21615461E2878B752C2669D + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E3982D9D1AFF650FB786C4437CD93B3B660 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB071D5D62EE385A6EB2C4176AA18E13AD + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3448E7F60DEAF425E77B6FB5B554781EA + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B66997C8981D3AD518FAF91536F59343C504 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C04EC30AE606B465F81927B226238CAEF6 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C014DE2E3CF11A4F9A7465ED2CCAE76B4 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774E758A42621923D16ABB339B32A3C8BEA + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642EA654BA87CCE80D9E063C55522D09B1A3 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0CCAA65D118B0D5085A0FF4DD97C85151 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 86625805AC7AA1E9207DCC60222413E99077 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8419BDDCD10DB2148B3D8CD7C657798270 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 88388E8278DDE21B055E92C452C10105806A + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E05478E6B215C87A8068D57AAAA35B69A78 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B505A03728DDB7920F73C7F0FC30A23350 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF5D8C42C1C089414CAFEE130ADEEB9207C + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = +CT = 5D595FCA542F0B0074829E35D04E327E6CE091 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00 +CT = 26E9E18BD799087A40BA583018AAF2F6A1EE47 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001 +CT = 23F207F951B9CE40E403084ACDACDECAF9FF58 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102 +CT = 4ACAC227A04E7A569EFE944414931354BF090B + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203 +CT = ACA0E41D29F768CF6CB07F3992EB85535CC989 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304 +CT = C4391448EC166A39FED84C743BC6DECAD72D77 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405 +CT = 827CD55A1D961030254B4C73E26B23E8C89924 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506 +CT = 51154C16B37BC34EDF1EA23A38B0F6964BA1ED + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304050607 +CT = 1F13E7F9EC6990AECA5E906E133F69E81C5E83 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708 +CT = FC4099BA5B9B101E367B68C2998D8DE030A43E + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506070809 +CT = D6E7A75BC285633714A9B58DE9D637D9FF864F + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A +CT = ABC392908CEE121C55ABE60380FB063010D72A + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B +CT = F945FD4EF7068447130E8033655F3F3F5368BE + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 7E20B01F8578BF1B6D3393C3FA58C881CCF9DE + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47FE108D91C796E4C5F479F743AE6002F5 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244CF302D862CE650CB6DB5EAC857A638C0 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF71E1E1A327FD79110B31015BD16936A136 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B630A5FE6B4ADA79252E322D79225ADDD14F + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B52CE39260CE40453EB1FFC53003B63891 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2EE658DB8E1F9F28727B0C8DAB85CC2779 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C985B7D3250C591AB49E36B546DDF34DF6 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AE85221D5B44AFBF8D9D33725135214120 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092456865F8152DDAD2F3DB5494329AE234 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16A90C49B53F17DC2721E66DDC1F13E295 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F17EEF4CB187747F42D9839BF285554AE8 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07C5E7D7E49C3FCD4928691B14EC1F0A7E + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E6CF165020E4DFEA37F1E78A2A984D2A4F + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D33F4F25417FEFD1E0F69D047CED7C8C62 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F84702B178D705758EC035B2919DE4F720B67 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B47D5DB869BF9D9F0AF1602955BF48D800 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E05613BBA02F5167B65ACD5B4E7D34B9DA1F5 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584A3AA34CFC919B6D75C5C6510FF54BA24 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF5634FFDA6125464B1DA8851218A015C2E5F + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = +CT = 5D595FC008620A1ED4FC7C9484F3A99C2D29961C + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00 +CT = 26E9E1E6EBE1AF67A0A337B2F0ACA5A59589C3DE + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001 +CT = 23F20757C3EAB5AB434950D23BDEF828059C0116 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102 +CT = 4ACAC27B201BF8CCB8E9F85FEEF6236F57159B6B + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203 +CT = ACA0E4DAA2F7C53C377BD7B30FFC434CD892F909 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304 +CT = C4391456E56D7123ACC7D2D595D57CD130284858 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405 +CT = 827CD57C2BB55BDA95C0A65A6363570F4AB87FD9 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506 +CT = 51154C400EDBFFF74F345BD53F4BF897465A1640 + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304050607 +CT = 1F13E72898A5F101939B39DB817C3746F93A1173 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708 +CT = FC4099B8029D5C830707FD35AC3E2EB12706F936 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506070809 +CT = D6E7A7EB2A4CB29FB93B0980B93E66B29861AD7C + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A +CT = ABC39241E171DE83DFF7F2F025EB6D865591E14D + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B +CT = F945FD846D2608C9910AC412809B43FC2D32569A + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 7E20B012D0573E93D316615F5851A0A8B7068C15 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D0B1C5DA586D4437DF7A6B58D1C11763CA + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A182D36322269C19C6083643FFE2CB856C + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A127DFC412F41CC213B7D8FCB9F0A9C95 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B630429DAE85CF15AB22D213F78ABCB99124BE + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59FF9C2D05F9D5FB430A174EED6EDBDD312 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E54977BDAEEDB71DF3677EEE007CB9245CC + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FE29272359DBF35A9346770A524EF3AD98 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECFCF872745C8A06380FF4E36E6F450B2E6 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85E3B225EEF4885E8C77165D93536C083 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD21CE4621705DF5CD8129EEE5188AE33F + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177294E5B985040EE8ACE3897F4CB056FCC + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E3B8B9C65DBC0170232ACE3C6CCC856D3D + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E621DA94BC2F4363BD8BBDCEEA2356CAE6A1 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8ED21456EFD2F25E1BE1A42814BB74128 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7D97B844E2FE0130339E47796B76DDBE8 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C697B108274910D4E46A704DF78410620 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD5456E7690C9D8A2041392D684D6F8FB7 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FEB367F682D7B124814F46BD9575958B03 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C6F6858C763F53D03FD47559837BAEF0C7 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = +CT = 5D595FC00A6F220F6461BD5708E491B01DDEB512DA + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00 +CT = 26E9E1E6CAE41E4B3116008CD10EF03ADE1B60503A + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001 +CT = 23F20757EE1B11314960F81A3076D908D8721C04CF + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102 +CT = 4ACAC27BDCC430B04231B4CB7A92935C83889152DC + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203 +CT = ACA0E4DAF391CC9CFE4D8CAD96AB759A2DEFE9FFD4 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304 +CT = C4391456A1C3A67F3FE36A30CA090BF3DABA3E0659 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405 +CT = 827CD57C82F77D6057E11372BDE1493DE8008EFCDE + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506 +CT = 51154C40A62FDAD62CBA7A61E72F79A4F2E2BBB214 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304050607 +CT = 1F13E728A91551ECF6595E4649EB66DCB473CE51C1 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708 +CT = FC4099B87E850B8DD268FBF71970E6311BBC5F800E + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506070809 +CT = D6E7A7EBF7C49EC425EFE1A93AC5BEA88A73470EF5 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A +CT = ABC3924173320982B62E4E4211BFD69F02F4E58FCB + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B +CT = F945FD84A0D07925C5504F4341FD951ED10F3A0448 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 7E20B012B7A7AD01E6C9B209F715DF9722B0CF44CA + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D0286DA491F74DEBD6C231B39AD1EBDBA1E8 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171094F557FDB86CA09864B0EAB961D3AF9 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A565C53E3FE3AAD9C5FB4415128BAEA33BF + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B72D2188F070FFCE4EEDECE9288FB5EFDD + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F58ACF7F9F89A2032DF578CED278C642BB7 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E54665B5F58818D85BE94E9AD64A52E32087D + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8BE76D11BBAAA746163BE7DB77B383893 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3EAF82F7BD8775106EFE8BDF07614AF95A + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F857BF43D25544764C92CA75D7A2ADC81232 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD9265F2ADF2D57453F73A6034C07031EF41 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDD255B2F764BD4E7B8B3122092A6A9DE4 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E3114C9647BC53230DC4E7830025468B9D89 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E6212609440773F4C7E88FD194FE78B3CC008F + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F74D850398C549084392DF14A6C40E0BDB + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C708E9238189D553F1CD30517A382D063604 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9E1284FA551999B8DD30F74D843483CEEB + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD54FB429C4824075946797F454764CE9F2D + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE6789C048DDD9C3F8B74FECC49C40979669 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60F2D58C52840E1003D6D6B18723631A015 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = +CT = 5D595FC00A307F51E562ACA37C088693561D0AD0DFA6 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00 +CT = 26E9E1E6CA700ACBA559D41EA27DC35702938D8DB72C + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001 +CT = 23F20757EED9E818EC1C6E85514D54C8FE5E23967FAC + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102 +CT = 4ACAC27BDC76DB37264AC087C7226D9E3655DACCE8F7 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203 +CT = ACA0E4DAF3CE4535BF26514EFD0889CBABEA160A9270 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304 +CT = C4391456A101E86893265E5E2AC3D4A52C9C9A974FDD + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405 +CT = 827CD57C82F75B39A9625B0638767494A33DD040A089 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506 +CT = 51154C40A6825664E6FFFCF5D17DA237F0AB9B139090 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304050607 +CT = 1F13E728A9AA05B3A318AB523A956DC88F62EF171518 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708 +CT = FC4099B87E0BB8F0075BA4C38986C41510D3ED807672 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506070809 +CT = D6E7A7EBF79E9E28038263E1E934E6F152DFC19BA7BC + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A +CT = ABC3924173982BD6396EEDCF1BC04957B6B78DCFDCBF + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B +CT = F945FD84A00305B0A0AAFEBD974C04ECEADE1EEFEFE4 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A025097F7B9E6B51F8362243A221F16C6 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FF6A5AB509C698FAA361E284C8ACF4C130 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6DEFFDD4C8A648617CD87B0024FC946B4 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CB14D897F1DF603D7B8E9E1204A9D72DAB + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B76863FFE743E85922F9CFF69A979FEC2617 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582180D5C54263AB90AB638EA8E40F35A392 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BCC78862E00B96A930170CCA33FFCFF9DB + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8628211897CDF2BD9C91A5722B0882A8B3A + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52205B4CCF3EF38225537502678331CAFD + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F8575027FC44C030D408AA8237122C24803D92 + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FC7C00CFBB7B8F4B14084CB9710D7C9295 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0C40C1CD0E77098E4750700D629B87CAF + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A8159B747F7C8C17EE8F42C652EA56F493 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED50C57CB67B8E330B9423D8DA5AE82D6C + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719A0E093A52F640E28003AAE384E96BE4F + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082B3DF2D23730A3641032F3664F89072E60 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBAF5469C969406FD5C3EB8D1AA4C16410F + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540BF1D8799B564724771523AE84DE12A3D2 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C0117D14A7D88B0864EEF752E172C067D + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEF1B449C4CDE214DC1281A678CE42D8B8 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = +CT = 5D595FC00A3093FE8E61FFAAE2C70A92B8DCEBF6EEA9CA + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00 +CT = 26E9E1E6CA70A356C20CCF0BBB655F31ED0B5C1F3F9BB7 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001 +CT = 23F20757EED9BDE4523A9A045D90E7F09160773701CE03 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102 +CT = 4ACAC27BDC76D90975D9BA1CB4885D0ABCEE9A973E69F5 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203 +CT = ACA0E4DAF3CEAED35138786C777A33EFF21808D502FF0A + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304 +CT = C4391456A101A0297E9939C82D60D36A0EFD174D26C34F + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405 +CT = 827CD57C82F771033B652C835B37AC3ECB053C5D4B5FBD + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506 +CT = 51154C40A682CABFAFBCD9CEEF649E50EFB4692179D4BB + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304050607 +CT = 1F13E728A9AADB7E42B4FAD307EEEFE7B352EDF2B4A684 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708 +CT = FC4099B87E0BD6ABDA52563831CAAE6A0CFE3646EB6973 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF90F85AD9AE07AD73F33677B860E79A399 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A +CT = ABC3924173986D8D81C2D74D054B87E83A354182E7E1D6 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = F945FD84A0036548A8A8C5241628B25CD35837FD12CC5D + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A047FC1EE8DFF44F2D69426A4E7D80C6B80 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9D763C8748CF60BFFD14DE7C867B9E628 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F76E1E5F4C73E930248F67032962291974 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA48F820D94576746B1CA6E91E6338498E1 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680DDC1D3D5A31DADD43A3A8497C558A4A95 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F5821735F43D3306B3927C7891A986EC116B701 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C09AF17F1A3EA49BF5D38F01A021E4A78 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE86262E243268D9671F62E3D9765F14EFDED4E + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E5219FD99690155300111DF8ABEF5AD81C1FD + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750865B12D01668C5CB56B151905565D2C812 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA4D83DF65CD0F857C488AB1C3FDB060D3 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0982050FB8FA44AF386C839FD72F79E4D2D + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A8262FE80407C3C86D04D34FD3B429D42B90 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4E84FB0A60E73970642DC8FA729F5A5A4F + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F920BF902B980D17B5587DC239865B3EA5 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFB200B365C5D5F94B9DA9B671E84F4D5D + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D5066E7034E81563856F8CA40B7FB4B25 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6F792115C81E74B3D72186C89D09B78F40 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BEFFB80E50551B7FF0756947C56ECB809 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDA1BCDDCD98634D101ED50E0AC9A0E9E5 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = +CT = 5D595FC00A3093015367713A293D5314CFB60FB0A17A0222 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00 +CT = 26E9E1E6CA70A3AAE1EFE12F446F6F9E106267709C60738D + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001 +CT = 23F20757EED9BD2373F278398844EA8F77EBA193B44BD66E + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102 +CT = 4ACAC27BDC76D9EC9CD918EBEE7D2C867FE0E0612E9B1D66 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBFA87C2A358E364DDF3D3676E719E040F + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304 +CT = C4391456A101A0E3D6D00682B1742E4FA754EC00216F6AB6 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405 +CT = 827CD57C82F771D6C9C6E33B28B32010591D226F6D8107C1 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506 +CT = 51154C40A682CA589438185A5271D64AA6FB4367AB187B98 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304050607 +CT = 1F13E728A9AADB9BB8CEEAD4752B5A062F1BC9386EF2B40F + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708 +CT = FC4099B87E0BD6C77B95E0EB807ACDAE876799CF6FD23D97 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94B0F4D41CFCCC2AAB0D27B5CE2034A857D + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A +CT = ABC3924173986D9E5035E7EAD971B5A10A67025359EA2784 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = F945FD84A00365BFFD711C2E11A799FC2AB3AB37D36B1D1D + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A0483D180D0625C3D87E0C1D4666C0EEE12EB + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCFCAE71F0D2A7C9C56317A62BD7589734 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A470A4CB5957EF551F662F647DAFCF148C + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D4962B8C3CD7BA9B19FD00C5B9DDED5DC + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D2204A4BA2CC66C62C2904CF32E9A88ED19 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0F845293AD8C2493C48B1C896C52763F4 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2F03FBC06F1DC94A8AA17D62CDE76BB2FD + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275CC93D983ABA29018889C3B536CCDD371 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190DDC7D459B0D8AD3050BB5B6FD1E23FDB5 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867AA1277921CD90646A2E88AC3F06E586A8 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E935C5CCF66B50546654D089B85C1C054 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC09811A0867C492A09A34A3A4BFC7E90C43A1F + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4CD39751653739B78D1853BB0C35D067A + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8D9CDB2764952A3459D57169F863DCDED + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940EA6EBA10DEAF52F56A30005AA06C2CC1 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFF908CCAF7E288324681D0925DBFFA971 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B2CF584C0F9FB944D446A0973C78EEAAD + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB59AC1B36BB172AF0480D2CE926D3BFFE0 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA1E3ABA8517596BE12407960A7AEB2D927 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5F1B7AD0A6FE762709B58150618957A48 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = +CT = 5D595FC00A30930171A6B090DDAB76C3E43BD07649E677CA9C + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00 +CT = 26E9E1E6CA70A3AAEE843E923BED7601DD77C129146D4E9579 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001 +CT = 23F20757EED9BD23441B95F02EC293536BE5F3674054791E00 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102 +CT = 4ACAC27BDC76D9ECB0B5DA54731CF44C01578F724EF3346D04 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2A69C69F20F80722467CFB2B37118FB32 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304 +CT = C4391456A101A0E34E9BA5B7CDB8FFE3F03B6E22968134AAF9 + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405 +CT = 827CD57C82F771D6F7B3DF91623300C721207A072BAC96D1C6 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506 +CT = 51154C40A682CA5890AF62EFDC315C06FB571BF980DD19F174 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7C44BF3BC243910F545F8961970E554E36 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76B29F4BD2A10C7DDDDB1D8BFD1231FC4B2 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7545F98DFCCC60FA0E4896C6E58B3E809 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA2994F857E9CE781127108EDB08EEFD92 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8FB77C995B6631DE1D5F16BB098240D7FB + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD0A86B68E7F26C3AB9714938953A796A + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB856F9144423A83456A17B2BD7A6DFBE8 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A4072F8BA668FBD3826BA57DD2124E16F78B + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F75FF8FC0EA4BDCF59FE29DEDCCE16935 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D2282EC81364CC8949AF10ACD484C24E5C0A8 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D7F751D3C8746DC2DFEC0A705A11E2262F + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5778DF63C567B0EA56EC456577EE22EF3 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D1C4AA23713088DCE378FF97AF816EADD6 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D039515B20DFFCD5D6D4FE330ABC93BA3F2 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9DE49E107BD7B9236A91F33DD08C985B0C + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E8916D81C47F08D90E7600725DF5A839B85 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146A613E50EAD8A26DD2B09AB7612FE02FB + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB2426E97DFB4529948273549ABF8B404E + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE804DE6EC0E1E6FDF87418D157AAB4EC99E8 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940742AA7853D9BCA04B0D84061CD7FDB1B15 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC2E7CB82A83EFF80CB7514D1776EB7DFD + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B769B8315BCDF025C3921F468383171D7EB + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB5271836D0ECE4AE203D95607D443879A78F + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA1617510130D18F12D2ED5824411BD4D3355 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5661BC4F3B16BB5849194EB3D7D7863A971 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = +CT = 5D595FC00A309301719B62E4EAD783B9C912C8EAB8904D0DDB29 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEF332F995A25D2C6EC4EF12E3729BF87FC + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001 +CT = 23F20757EED9BD23444F62ED0B0125422F15767C71BE763865F1 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02EAE0D9A6B164DEBB01BB42119C5ADF43E + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2ADE53CF7817C063164262BB27396122866 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304 +CT = C4391456A101A0E34EDA3E2FACD1EC2D47390FFFCA96D24ACE62 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405 +CT = 827CD57C82F771D6F75D6592F3E0D3906BD2FCB2C7F82207D2F2 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506 +CT = 51154C40A682CA589070AC9E30430CB45E220C17F6C5075BB22F + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7A28A0AE537ED93325D357191055E75E3 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEC1E96A52C8497A2C7422C3E78075AC4A + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F688387120BB3EC8412DAB7775528AD78B + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA163445D3D472083E3FD7541F74213FE3AF + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F41F835FB42EE21EFC7FF456B13E5921226 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7E0813ED75AD2DE666E91F9A5F1F7382C + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64B53745CB9AB11CAE41E87111417F1087 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C804CEC1B0EDC1CD0D4E8C3D6592487174 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7ADB596B57E0A1E2F31155183F4CC3553D + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824E5C364044D521FABD84624C986E9D77F7 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D757C26F252BCFA2DDEE2ECFF7E23758D08C + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB16ED0E71E21EC6F68ED18F61E5393DC8 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D1189B31594565C2E21644E3AC5DB2D844B5 + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFEC5161EE0D1A809D2CF09916E723DDA7 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D83212FB6AFE69EF49EA42629FA11CA584E + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896B9852AD1BF146098FBD91401D44413570 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF4C1D46638319A6B839018004779C1446 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01325B73CE87452D9CA9EA6B77181D28A0 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E2339FA6142717EBFC05F5F567F40EF31 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F4DD938699B610DE843E633145DDAEB5A + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D6538E101B1640F03F13601855BBF2DAE + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B7602FA9AFA454F7C979A96A2A1639E2E45DF + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7818D91981035014581CD763858E86C73 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C3017B5254D37761007E3E0A9AD749ABA6 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC56629BE4951DEF7FF350AD688D4C63308B0B8 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = +CT = 5D595FC00A309301719B30CCDFB8F5C9020B0A9CC201E413407129 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB1B6A2BBC5D785C1E7C097D9EF39FEC13 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001 +CT = 23F20757EED9BD23444F771337AE695A6F6B48273407CFFC0B6D8A + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E0BD30FA8B1F571D0315966785435E979 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD929AA80A35B082712F97E2DF7225ADF196 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304 +CT = C4391456A101A0E34EDACA492172B89339D77BDD352FB96624CF5D + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405 +CT = 827CD57C82F771D6F75DD1F34B834EA063F9D69CB5C4D17FD7CD39 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506 +CT = 51154C40A682CA589070213CC231A297663133724FA88F6AC6BFC9 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC782740A024BFC2E4F84CB181684E2072FB4 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA01E4D1E63BEFEADCA6B76C085BF603EBC + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC68E008253B559B8E68A574A0C6F02532 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE4268A81923426016DB11FC4DB9FCB141 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190AB53266A27CEDD477EB3B9DE529FF26D + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA64362B3DB8AAB2CE200E49085889B7B6 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB642978E157E0D23238B47041933F0B957CA0 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8989D8669F547CF97463C807D587C738E + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC018BF7BC68AC0824254C4F76BF2B607BF + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFF976F3DE0212A4C7CEAC92456D1455CEB + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D7574463123C4099416F4AA7FD0671BD3016A7 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6FD1D386567DD425B63390AFEB19889349 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD9833766CF7636C901976CAEC48081E0B + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA023AF73CE95F285601D2B55AA7D087913 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839FAEFA976C04E1176FD970AE81E5129359 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBCB9650D8D09CFBEA82F256C709F3FB0BB + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3FE6E66534F790D3ED325F98F4713CC026 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4C3772067BD71FBEA31CF410330C923DC + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9AF6DA2276A28FE67396B6FA9C7BE84459 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F633D18782B53A9F9EC6864FAD3A3A00419 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3E36EF92646D1C27B1373687998A8B7 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254DB07C4CF23548D3B96E87DA82FCE1AB6 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E191406C3FDD5B3917A2746F6F527BC55D + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F10FC1F53FA544244516D513E72E67272 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995CA713B535311BE7BCBF5BCAF805221C9 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = +CT = 5D595FC00A309301719B30ADF382AFA6F4A925758355F4187F0F4517 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32C2465B319CC98685C35A15F361BA945B + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001 +CT = 23F20757EED9BD23444F77CF64B8EEAD2EE22C0550FBE67F88760AED + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E013823B7CB617D14913C3C78AD87CE0A35 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211BD06EF43B8F61080A39A4C8FAF5A306E + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304 +CT = C4391456A101A0E34EDACA52BBF393E7D7E19CCD78D649F064AD3DE1 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14C4FF79C8A85C2805CB08FC13CCC810DAA + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 51154C40A682CA589070211F95BA5EA3581A8F841F37B186FF1C718D + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC78207830DA3C88AC411C267993A1B93123331 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB58C7D392129B43CACE28A341E745D648 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC4719B9DAD9B9D4B940BD38777E256DF643 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D569A337B2F6BC452C0DF1510F436B25C + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE9AC33586EE87BE0B04337A1CA4574329 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817EDC323C7F64397ADED324828555639E + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB642907D03AB5CD29C4C61A6012D8A4D3F96E99 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F9F42CD0F6A9356CFB562573A3F73646E0 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0696ADE456C191B2C4326EBC1512242B79D + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE35CBC8F9A3766A07AFF342CC036B0E47E + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B054CE58A27BC0ECE74584DF24ADE9666D + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F039A1C2B6A7300B56BCA8C081E14E4794C + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD28BA2106A1E155AC43CEB3E8AB4222F1EE + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5E0D45B04882DA4320E3D8E0832D06F16 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F3372917BA934B73093F42C0BEB78F46E95 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9A51CC557625E7C500BDC4FFBFB069C43A + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F283FD85694380B376443659C7A6C090AB4 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA1130D777CE5131213EA499AA196D2033 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A423A912E946B8E51CC0C37DB57142DDC30 + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63AC68642E6FBFF32B329629E1D98038496E + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC36FDD66003A1EE4D4AE15535F6CFB69F6 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB0F084781E8CCC9E5219142464A90756A + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D17DED4EB95A5027F60CADF0AA1A9C9BFC + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9E590F4CEFA90CE3D5B69BC2A161451DCE + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F419FBCD3541EDB9B6BEEF4D5AAF895CB0 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = +CT = 5D595FC00A309301719B30AD9E571D4020C5D8413C24A4184F059C05C9 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4258456E6FE8C567BCD43DEC0DF6EEF25 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 23F20757EED9BD23444F77CF5768D20ECD6C5BC800157AE1E800D0BE3A + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A63E0D78211BC5B076909490367C5EAE1B + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FFB529A830226EE359E1C16CAD6B546B96 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = C4391456A101A0E34EDACA527A6CC3E7C4ABD518F8519D9BE8944A9C56 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB9BBD27C8AD9BDECFABBC91BC9F7CF2D86 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 51154C40A682CA589070211F761A9A2DEABA2907B2B94040E1F5E6017D + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795866D6F81502DA40E17D02ABF5BA6F685 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB98BD18DD3E9685052E08CB9DED5B74EE67 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C55532C2937AC765CEF07AF0D98A26EF1C + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01248742D7F006201E93D771C67D6BCFE2 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE57C752D6EFC8FFD8E0F108F1ABA2803B8C + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817A417AAD51846E56290DB91B9D0B12F275 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB6429075889864AAA7513F3522F4EEA874BF0D5CB + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DF74A49F61F0282CC8A8B53236ABC06A0 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A5F4BB0DC57A59FB73B5226C5C181C2A3 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DACA2AE1F5532D5B5D18F268ED2EDD3E9A + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B99A6238B8A46DB63AF4E8EF92DD4C56D8 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D6DC56BF9B60A641F266A2E388FA90A305 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280B3B6558167E01A2810F5FD315144B434B + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C24ED14CD8F99D664061A1549E2A57A38D + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EEB57263E835638E614D640C3E568E6834 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC8D309652B5BEED50BB222589498A980FD + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CCCC53F56A3312E479641DC9766F192EE + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA86B22DC35EE480F721A9EFFCE7F1321A75 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FDC9EF74A6A6DD685A51097C5FEDD64406 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDABDD40BDEBC88F80C41E3AF05031E3B23 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F78EEB583F13D4B0E3C78AFB565BA5F8E7 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB24BE5F942FAD5BC87C2452601FAD335176 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B78BB7477C023133B69FA8180059C2015 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5C9BCBE359BCBD33CD935A6E16AF91E8B + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C62FCE28E9979E20FEBBCA89A242F06C2E + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = +CT = 5D595FC00A309301719B30AD9E6D5C66695652D0B82A4855FFB8C8FBF2E8 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FFD4D82EE711A189DB3751502BF4951DBF + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 23F20757EED9BD23444F77CF570F33DF545D4EC4FD810F04FFFDBB0A2DB7 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A2F3F8BC9F36828AEB7E1F97F19DAA22E + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CDBE70BBDF825E1A0274F7139B78DAEC4 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC7DB73E7D6AE23AA4319AD1DA91DC3F272 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FB74A8AE1F4F74790C9F2F56F515EC393 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E4366FF0CADC0243ABE1DA2E9B7A6A4C09 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A31FC7D2F0CBA7C2B734A16CD63940AF17 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB98508E417155B2871C8A55F79B54EB3323CE + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51724F7F882F13BA9BC8694D08574F04FC1 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E9EB80A887FC80A25B6E3B066260661EE5 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE57518412C9AA2691B8F2A91CC5397AA3B453 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFDBE8577C661628A51787CAF3BC6B59ED6 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E55D803C17A41236613721559B977EAD7B + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCDBECCFE9F181F5129908CFB6723DCA04D + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A96395C5E29C87AF067D1720034E1A534B9 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23BF48834E0EB1375D224E3609C17E3502 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AEA9A954E881725D838BAC8303B776F98E + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66F22CB7BCA30209A0EB286CC62832F64F6 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA58E64AF2408BBFF61125FAE35501F93E4 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208FC913B1C439FE61FA44DE91FACC9B799 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18F4BB0F726E473A3C92F0758D6D279B40 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FDEF226F0A0AD1E67E8A35962E6F65402 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF759C0F1BD31A7FEF4682344A97D92EC96 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D14962C1579D29C23D517507B451D2E59 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06E586FF2CE3C5C9482CCA123685164E96 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA75EA45EED58D7001387622243DF3AEB5A1 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F7077568D47506554F8CEEF7971B1E5EFC4F + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB24394CD1803863E7D4AB14093A9802C95522 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B2EAF0CDFFA117E672C34FC71E3BB060C + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5628C4857C8DF368279E08A9B8E01221C87 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C6781C5BB73FCF0C1C0DAD1408FE4B5E0384 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 5D595FC00A309301719B30AD9E6D72FE5BEADD2F1ED86BD9C2A12FCE96E241 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D7C58FF46AA8CDC81B3F6BF8FAAC9D3E9 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBABC68935661149FDB9F1FA38DE70FEE92 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86B4057D9EAB54651C8BDC57C188F46733 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC7FA943B99D5703A8364A4B55B3DFDC665 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73EDE0B9365C9B3B16BEBD88F6BD412A399 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA70E2FB943B025AC18799E505DECBD11C9 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422C505CEA6A578E279D79C06B957244A6C + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35236EC7B267DE20306D51891F5FD6006D6 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF48FA3D830C61BAEC1CFEAC183895D3FB + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753EE09BEDD2380C27138FC005DCEF3F4FB + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E9230C9C10F72E8EA214A6462EC22EFEFD45 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D420D238C8EAD5058FAB7A4D8DD2E3DAAE + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD086D56A9D5E962D84D9729A415C28300A0 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52F13335CAEFBDEB38291E4C1E6E852C555 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FC86529409B0787BE227808DDAC2AA6F7 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966F6AD6103517C6E7B3F7E360951BDF5243 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA231633D225F19A47EE016970CA62C0F42AF0 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE786343D51BA4E93743ABAAE2F344CFEEB7 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1099619BA1C63F1D8C1503541D92EFB54 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF306A9A98CD744635F1F3D24E5946E977 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5ABE6D13F2AF98251049DA7253C730ABC + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC6E8BFFFA4B140805B8050BFDC5083FCC + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD0EDE9FC463D84235C254AB619A3FA341B + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795F381BBAAAD06A0DE5A8D5020D9E05C1D + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D0282F277FF568041723C767BE861432144 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD069009931287999E342B028877F781BB3AF0 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA752432BF067DC290D12498740AF1EFA97392 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5E20D2ADE1EF5504A54DF5C1352EC057E + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC0C6C767D5EAC4EE0DC85029EBA30D46F + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C24255913A1C328A4D9768E2846F05D32 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D5F8D19C58DEE107F10889A9C73353F1D + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE0A39D1B8C598569E27503809CA912889 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 5D595FC00A309301719B30AD9E6D720FEDE74D8C9D1332ADA0413FC514E14918 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D5840CF17E201BE49B1206CFA841C406828 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D72186F03887334FE22BDA616431650EE + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86414005AB71784DC89B6EBE430651B69927 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70D51859C4EBBBD8B170CC8BAE67490194C + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2FA665185DC85CEF11C79F28DBCB20DBB + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA798842F7FE695861D7CC6BE87CD2BE23DEF + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E42276A1A4E34C315971EA2890F96880B3DF55 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A352628110584F9B2606D235E75CF64B1BD55F + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5DA3F49957095E020D7BF1BE205D250BE5 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9A39D9FFD3C99F454DD2C320744982B29 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E51983516C08FF89DEC6A75A702CA355E5 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D45962EBF776D74754831A427471D6E9A025 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E16AE4696891A52CBC4579046E74974125 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF9C3160BA68670FC0F4C471B648DA9547 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB7892992810EF72C43B50EBC88F8E95403 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDCBF77814044BF3FC9A9DEBBD393F545D4 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161CA2E3E1916817F57F447EEC9A2A5FCAE0 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C8FE334156DC92E05735F7E7E6B67E1E67 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1323254DE449925082F428D1B787DB7205B + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF3813BA66F0863BFDBA456AE5E8F7343582 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D979E00278021F6660081359D18C5DE16A + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F8BA7E929DDD3F27256212A573F859CAE + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DAEF5D07F919012084B2FBE1B3FEAEBC1 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF79519AF9DBC4E079D5CAD8E3A82B1BE20E92C + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D0249F83FD3FBD745EDA2886F3364A9F2C8F6 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904669F3034E3BE36C659FB9AB5E196AF88D + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA752452E832AACCF63816B84BD1141C259A362D + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B7B68038CF8F77934C2E08D52F47330B52 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7AE2876A85172E621C3EF0C2C7A9AD8363 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74B4F83CD85835516AF1CC223F71C9AC4D + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D293C3548BDFBB01245DD805FEB550BCF96 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80060DC4F72E4874F0DEE3AE1A3CE089DC + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F9E8040A87C62FAAB95DBD115C4F87315 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D962073589E5611C6E3450A3383E6BF487 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5FF0C7CAC04C868AF50C8CC423EC9487E4 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F0FFAE855079C9FB3234DE3E9556C1D25 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB9F578CCF08DE274BA57D076E5EB424BAD + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B85FEE9B3CACFA3F8EBE2176458C6776B5 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888B8B8B18702289BB94B561C3C22284ABD + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760420FF585C1E3EFE28E583D01BC6B2AF1F + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A3526205B73EF9734A5701FC5C1BF5D893E34687 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D785AE2231E628013DF9D4F0F43F436A601 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B6FF901217DB158D7936D1E5BD583FDC0A + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6A6D35F18CD6A3274ABD3A06D6F9E8798 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A563C93DBB70B8D1A7D29965869E150EDB + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA5F515CC49E35F033A1B5D1FD4D16B391 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF03A9A54AF206C71938CC23006088F3CAE7 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B99DF630E90EAF15FC6291637D4395942 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89E861A103A63DE41978D70D6D1FD03B31 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D82C5C511B0433543A0DA30559C079228 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BB100FA2ED5B9CB22EFB65F29B7E6F217 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB13273C944DC5F201C83BD5A0D03F7C969DA65 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A67A166BA484A5B61BE27CC85A2ECAF2FE + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92B3C4788D8023CF667C4D9DD2F372B4454 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9002048299FF7611556547CAB33BF9A31D + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC280CB979D970A140E933A43DB7E349618 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E5FB02DF1A9094C9817C44EE6490B0BA3 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928CBEF4AE6E20CE176E2EF7D6F86B2E6A8 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD069046871DEE9E1C3F44C3182C6B032B79216AB4 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521D27C573BEE6DD8AA45BC2DB084BA42D14 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72DF87FC012D47A776DC9A50D3ACBB0EFC6 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A82B56EE88FCF1044EC65068CFD9243AC65 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED1BD36204B47CA756D33A1178C45DDB81 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D291827251B0C90AF242B3D6ABF5DAD433274 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A72530445D5F7768550210500738AC62B8 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F3DF100E8B3F9C68122A306438D3E1BFD + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2DE4B325ADB9415DFE0D00D41F58E1E9C + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C621E81D43C90EF89DF55000458A76DCC + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F577F087F2CE528B7FCFC5C5B4671D83FB6 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95F88FA0B9E6FFF85DFA5F4191232BF8C92 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842169ACDDB99B00DD02511131E4F917792 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C0B7034631979CA316F175727C27C1D6F9 + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E4227604431B61510389EA637261EF11C68DBAD473 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EEA478FA59EDA464086868AC171624FB4 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E46804537994FF6EE9CC0FA4D653A250E6 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685211E72C342D940E9F9E6BDB291F28467 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B219E227E942A1E0601D7E92CCAE04216D + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C11F83FCFA9EA2692C51243A83B10DFF3B + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA849E2721659AD32AC398C7D5F2D46477B3 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034060ECD9F9384F2988A3E47B3A42BB05CA + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B2300870E355566DABF60F6928D47A64533 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B97F3FF60EBD48D8A33EAC81799554DC32 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D899B2C993ABA79D2F8140B6D2F8813CAB3 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDF256C27A0FA442F4B2FD1BCBF8E053DD + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB13273936DA20430D05C702246BEC84C7CF83230 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A66998AA2F44812E8ADE28A609687D53DD32 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEF24BA17041932BFDB6716BD1EB99FDAF + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096040D454253BAD8CFE60CDD91B98E498D + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B167310B810CDF93C780BFEF71B7D0711D + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E7764DEA66825C36D1950F121BAC7590F47 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AA89A1B8F41AC65B802A90B616FC2D7C1D + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4E41A67605E6BFA44F94D2B19FB4A57B9 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA280524D29ACC339B81B9E497540275974 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D58597463203C2821D8EABD33DA81CB1BE9 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825EE0B4EE59D6B8D0720E1BE88D0C079B1D + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED786204B5071584C6DBDB7A9B0FDFC3B1E5 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F18FAFD65482E3183A4BE728CC0955F821 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7E06B3A81E6479AF6774A0AC08E120840 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4728EEA6177420E289559990DB4DFABBC1 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F86DA9EF7AEDC5981A1D6C927180718159 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3CA38142C5E81F6392939483422A21E993 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570E832B888C01E72CC1EEE0B0D7DA449C9B + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDBCC4BE72F1F6F7A1665B4F6D1AC0B785B + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7C130A184895C35B84009441327AB5AE0 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B4436E4F7E850C411DE1A5CD0D69E9E73 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A17D86E355464E864A7C75494DD2F2D426 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF3C0C1CF5E9A895714B4D1B6C2258C35D1 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E458C5145A6E0C0CBF212639731AF13BA7B7 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9A8096922D77242656CD14039B23AEA8A + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DF9014227C4B28E3600B742F470A8F76A + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19B3F5D577196B31677CE43968DDD4C7068 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D9C6C2EF2FE595A8C7D220A53234C29E53 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043F7384D82FA6DE07D893FA29D8619C610 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236DEDD023785421FD42F684DFCCEB52155A + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947A2B0BA3DAF725C5EC98D3A7C740C2430 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984ACD3141005F56D602B6B21F7DF0F0C1C + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC87918ACCAED05A9AD726CE49CF6F1B62 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A5ABB1B2E64BB1081BCED81EC04C567638 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CDFEEEC4E26CFE6D3F1E5B1344DEA2045 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA007BB30CF0F1D75AA25A87B0312AE8A6 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F435B1B7413133D0C5F67AF9BC85DDF0CF + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0316E2D2B07A69DEE3F50B9FB1AEBEAFD + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775D23B5E36F1E1324AC89F3C3F4E396C909 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACF367D8319FA5D7C387480A5B9A270F1C4 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A460A3F94CC17B25F571904DB5E523525FB2 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211E8562755E721B354C866C3768112A079 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834F098025F332FD529B6349A9DCFCC949F + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E352AD8C2981351A254E089D36B719ED417 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788102A6E4B80D42FAEF869D0948F3820EAC + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1707696CAC493C3C7EFEADC699EBB313F9C + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE431486E07248CD54E31622C6C2787626 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759D6A80FCCAA21E9EB8519BAE6273AB0FA + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DF96A7E6F1E1D00391ED8740365B28F011 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7B5AA823692CD1AAC422734F4D479F2F5F + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAA6D23E8B1A14BC5D2040B7BE07B6BDACB + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9D9CDBCA657FAD1F6602649F8C0A2D4E26 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A188313DDCE07854881B79A76452F3A67D + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3EC8D452AC8AD170DDDA8DDC6F747D228E + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13ABB37091AE12C30FCEEBB5B161A3BF27F + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347F8926EFC9C416C864E2190800E174314 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862A6964E3871FF855720F4499E9D172226 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E920BFF555135C4BA69459449335BA87CE60 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC72EE52F97DD83058ED93B81D8C4D732E5 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA260065D1FE155CB4393C86E8E84E34388 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C5B15A3534269041B171A41C1A419E54C + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D03A6D701C42FFF304859C84D6E36C5CD5 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D3939E8AD7308746C02F7EF8F19515642F6 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC286EC36CD6DD6B66581566AE093C746F + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984739DD2F3BCC12043AA04F653C7BDA8480A + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3B16B3E23103E2251022DEA7E35E80C704 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A50836FF8F22ED1846A2553BC00395363A0F + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9FD1F54D02BBEB71D9B4BE3777109D80A + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA866E4A1F7265D4C09716C09370B2528AA5 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F4406E89D8F106639DC91D00CCF31AA2BD79 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0951E6864108846C0FE1C3F3B2847336374 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC42C790E760EADF5E359E98FB2F6F8F6E1 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCD0FA87373D0F45A6CB42D7EE2F0F2FD3D + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A4D05575C1F2F0C14E1EB66850229AD7E + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA21181B2C134E44D38A420371DD33C0DFF0A78 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D58349690F4AB6F0ABBF6CD27AE504FF100F1DD + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E35338D9B58B7CD3BA9061E75265E62819080 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED7881432277B15011EDCAC2295B505A077DE060 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F170373ACC9AAE926884C63AA4346E57BFBF00 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B35F3AA10D6239102551A7EA4817CB25D + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A2A4CC37031509A014834EB19776ABF057 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE94ECCFAED631434B0417F410205742071 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD2B4B77075714F152A25AC7DC1EB9CBD70 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABE526DE45AE4B326C323036A331C2EAAFA + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD66837804EAF0F9779D209022993957C63 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F92281A6E019AE8FE120B13A55A913075 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B742492B8E367A53A125036086D049FB1 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF7012CB8FEFA11E89023473ABB5CB959CD + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347ED13EA9F9E1885C52B49E09B563DB527B0 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D3B3C023853E39E3B9F7880B55660C040F + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008043BD1B903580CE29ACE4F4CCEB081F2 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E273DD7ABC6E33F2F595E56213B673BDB + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F7DCA914C4E1ED804CCE8541B6C47B009A + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C6278E79DBC8A4CAA2D291BB63D6A3785F5 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D062BCB627ABB2D2B295948FA4AE82A5A45A + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A936875401B30DF75AF0BB5090D1A4E2B + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC661A0AF4CAAA0DAADDDDBCE23DBBB56181 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731F88E9C69C834568B3144D9288BD85AA27 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCD3DBDA649F2B12395A47DA6AC41DF188B + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A1FD35DA1D855DEC40C1DF48E490A8ACA2 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432E3C1798E25E9C6F3842CF798E994C15 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E37BD43CE0EA1269C45A530F0E83C38902 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A5CA7B88A3E8D61A766EAF664DAB417783 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C09523081C2F9EB0EDC92263A29EF5981B8101 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A836DE8CB288FA54711E46D7E41D3721FA + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFC9D7103F6F9CCA4F987B0CB7D5CA4A95 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A117CE5BBB92B93E8D5247B71F58D8810B3 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816E93FEA1A7E819E37738047B7B264778AF + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B3CC4B1AA5BC226AB619A9F2451DF8F48 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F6DB1D42B49C26A4495FAA82571879691F + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143601710FC507C36BBBFE9CFC43C6650A93E + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F17037841C23895279DCB9FB1D4E41A0DBBC0423 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AC2AB0D91CD797807FB5DADA8C9F3F6BA + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224755FFB17370C658AFD8B60B481034DBD + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DB0EC100DF51794E23D7233752C51956D + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213B6BE23D20E5F75BFF436A74C824175EC + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFBCB4194983650CF68F54C6A35B574C8B2 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668EC92AB704FF83077052FD0D84EBFBAD9 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F371C745224AC1218B69F25829B9BD648 + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B548D4228D28703D879F2A981BC2B80EA3E + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF7209A9D198174DA1B3B347BDE896C3BCB5E + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB05DB63AB5CE5DB45FD16E83F3D5006D46 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C8EAABF560D3DAB29AC34B698EE4BCBCA + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E920084550796F4E14EA7D0CB2BA19CB508979B8 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E2110583EF3A521102F3ECDC494C3491CBB + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F7674AA5211E8637F29A1DBBF676F4783CFC + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B58CE26793C990A4EECE5625DAE2078E5B + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D0621707303C63EDE4579451086F9283886E98 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A988B658B03A105ED6470715F0B7171A8A9 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662F71B29DDE44BB29F1790115B1887EFD68 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE8234184B6729EFCE7D085B4AEA845D41 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7739140EDAA925D1CC2E5A76C0D816EDB + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A14218E7C160154B4957FC1975087B9532E9 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB94326EE995A92D451F5264F6D840DE96DF9CB + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C75DF76C00F316788AE660EE0D2127C749 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A5413083A5C27D4CA75F79CA3810359C5759 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C09523836C2C80D540778692B76AF2915C5CC3AD + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833FD10C5F3FD0CD9E6F37793E011A8D946 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE037778346FD3DA9AE1D31A5DF86468BCC + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B26B9D063F3DF7C9560F00D95A6DFB0E3 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EAC884D97E4AEA9E83581FA4E68E4817849 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61C0AC57181C2DE420A33DF268370C5B43 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F66302C224FEB6EAF7DDA753A06985A5B71B + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600AB5983BCF96EDB6BBD74552720618E7AF + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3A6BEDAAEB694D5B2FAE080477EEC179F + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8D6EB25439225DE8F371AFEFE872FD870 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9069149416E8965C09FBF623D66E9FD3C + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE62E554D6156CB0E226D11BF1188662D7C + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BEFE77FE0BB06ED0A39FA7B3990E242FCF + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14F6C5E5821EAC9333F9078A06D79F93E3 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D001DB20B8BED67EDDAEAACA45E3F022E3 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F46FC112DCF868EA891FA10D04173B617FB + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5052704B52E65D0850204589EB567A454 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B2627C64941EF34D8B641541871EE0EEF5 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04AE4EB7002CFD837A2C8954D99405631EF + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C2498DB9ABACE7BC785E7F4C525237D1B98 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008453386D46C0C5DC26CC66F1E9EB8C926B653 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E2190FB0E95FF754FF1A6943770CA3C04958A + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D861ED3FC6CEFA8FCF6D643F7DC8FE5DD8 + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9A0C9A4F766EDA63079D4F276C92CB24D + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D0621720E2EFCE115A7239DABDB771B1CEBED6B8 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A984686DD4B177831C6DD85AB98B65A195F09 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA2E629D2AFA25BBBC050439ABA14E3B788 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C91FBCDD494FED348FDC6BCCE77A4B328 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A785E7B303E2318D644B4E1B0A3A43B32B + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAC36E8FFFB8E45AE8A7A47F72AC35AA37 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB94326318AC57792758FC8004AC2510853DD16F2 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715E1BD64844319FF029A47B6A400E48F10 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB0A66DFF5171BF2DEC149A4ABECACBFD + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EA5886085E890095683E41A308911C5EC4 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C78CE81570AADF48243A6570FD48FBA611 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D5A2982158D937C970F803A7DAA0A76320 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D36FA248B83D2C443C7BFFEF9E9C551A0 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB51CDAA64DFAAD616E2F6E0D6846B5CCAF + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612835BAF3929513D2FD906F3931F1F6F911 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EBEE4C6E12C5D77B42E060973E76C7C292 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABACCC077B14BE78604D9E98FC3431E652D + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C268A00001669A960BEA546D0D25EC0382 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C9B61143F7EA190C40C94EDB117DAC5EF5 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9686D1B7570D00D2B8DE630017E7E780059 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676E1B43EC32D4BF534D317969A904816E6 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE20D9D206F5AFC46B5213B8C3603A77F8C1 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D9FA5771CCB1C0C208F91662E8538BB775 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04A09000CF7E2639EF48876909CAD78EA3E + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F46445436FB4AD49D2E41694FA271CB3ACD7F + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E89F85777737B9BD550D415E4F6035F3F0 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D7745764FE767ABB91315AD1C2DD2DDEA + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3F7AA24CE5E5D5015DD3233C314FDC5EDB + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D08B8AB646AF5402F4E0D5FECA7A98A0E + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334267061CD264E3CE751A7A6453EC1CE7C1 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C25DF7FA4EDD84E31066AC63493792CF0 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AD23063F5D4062BCF28D6ACF293D9007A + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0AB972FF46647140C97D330E471C68AE0 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DE54F89B913A1196E2DC7D930ABF8CC4F + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464EBD684D5656D3388750EDEA2AE174189E + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA275A5C9E14C827995A9F8D0C190EB360B30 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C627CE5B76E7F27C62FB3ACF2BE5534D6 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7347AFC39253EEA8D440AFCBF6C4A23FB4B + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA353F3322DAAB6FB60CF74F3AFC532D099 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3016B3B0B240D5FBC0ED329736070BF0C + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C71550EA094AF2C5E3750A0FAE402BB489E23D + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CECA4E63A028F2F226CBF57FBEE8C345 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB18761A64C5296992A121B128D4B7DB0C4 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E8DCDE253D9243CB7EB00C27A41FF445B0 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53515603CE72442AADAC8F6360490265330 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A7B593ABBB086DE3E6D1D95FF14C6FA13 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF8E9525146DC73DF6DC86E85EC108AB08 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612812F7B65A7223EFCDD0951FA64A8CF12C25 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB11B9BB98AE328408F6DC5C76549170B72E + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC91FBD19562B57ACE1A7FC0489DE51A309 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B56E9B290F7ED07E2A08783F0F075FE3F6 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97A5804E7BF85C71F6407A660FD5FE99AF0 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688E0CDAA34AE5E78B3D2AB6AE8CE81DA65A + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE6763143E5D7EA4FC7D76B415CC99F2DE17933 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207815561A404DF450B878D2F755E1709E94 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D9846DB7D5545B33971AA4B9306AAC57E632 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFF5CF09166EC9D47321B743F8BD11B9D9 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E41613AD260A2E949BBA8963B16AAB6D98 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D03483991616BF6F512EAC1BE7B9A9A465 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D90AF5E0C484F2FC7DB2B9ECD4735D19011 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCF36169737A1FDFFABF5984022609816B + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D079703CBF253C98F1AB2E0AC071713D71F + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E92008453342876B118D159DBC7A76B6B273E7B1492938 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6111947C4A1A379BB54A5E6B6D78739C35 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4AFC693BF93B5546DD945BD7ED404BB2A + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E625795A97AC50879107195EB1EBC6C3C0 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9332E6D1E42D7953466FB830598B4E130 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4B57ECF8B97DCE0AE7A8A1EDDEBB4787 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528DE31A495B6E6DF6EB44C26E2882C14E4 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C60DC91B143A628557CCD373E8B59F64684 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A73408E7E9CDE88D3D64EE86D60F72E0DF88F0 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35B53DBF3306A85A27389494280E3D32631 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C3F66AACB3181607B9A86D5EF2A5447DAC + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506AE6ACC83D34132022BAB3BBA46DAC14EC + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CCB159D70194A96629E66F740D7D9D0878 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB1186758168E65F97EF4E7EB535D2F8A152F + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E81593EED65D8D03FDF294C1E1CCE467CF14 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521B04F84D9CACFC42DFF06F4F67F366062 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A65CA102F32CAB08BC88EF4BD52F14CACB5 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF500890FE8E09630A5776F00F2983AF40DA + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B612812175BFF43428FDAF03E8F433E92C4351500 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177AE98570D137DCE3A27E99DC3C74DBFF2 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC929F6CE121DC2B4058E8C4DC58E98CA432B + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B5304EAE89F1BC378395B1FC1116CA09E044 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6075BB883F37636D3490747441EE7DCDD + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4167A496C151F4C132BBD9D57FF7C5340 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE67631049555BBBB40C3667D06643E8DA13B930F + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870281AF93E6D90D26E4D52326CAB7850A3 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D984420D7FEA221368F24C164714792A9DDD80 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB181CD52F0677792877F9AB565B218425E + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E49317DBAFBBF7855C9480A2E4C1689BDA6B + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00EE1CE7D36F78CF1F35DCEB931F84B2B0F + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008ACBCA752221FA049CB5B8C64D35954FD + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEB2464C04EFA54F015DECB730DE8F58C0 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A79C2741383EB5F79CC947EA6A83B8BAE1 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F1F9D7A615FD45C0F0ADB48ADD377CC5BA + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131C61EDF62F16C5CA01E55C0735A8790EC + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FED8E75B9ED1656B8F94F2A6BD7C29EBCA + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621F34735D125057453D9D64BE358158AED + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC91260BF1647BD3169ED3331513A8D107287 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4CE2CB3747842AFD0EEB221D45149AEDCB + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D10DA8A7D62C5B6E0CCAEBA2621C0FB2C5 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609D2EE31245E1B6C5341A146647081BF0E7 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868B07F7E3228E9C2A921A1E53CB01D9102 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD2044AB2EC799F99058F7AFBC61AFA0459 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35B134DF0D5C2E00D6EAF91620823E7DBB8 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45CC0E3A7DA2F85D20D013891AD8A24AA3 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC032FCFB059AEB96A96D79F7648420A0FB6 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB11843D455338E0354E13CAFB828B96603887D + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5F91F3D05C182248AF4D649517A3A0C34 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D535216882A253BAFCAEA2B8E43865FA3B49A7BA + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654BA401C238D56909ED5318F1C69EC3BF6E + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E8EFACE36371B74AE73835097088C76B7E + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB1E7C233C42E9A012397966928A89DA1C + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A1DD63849DE661875DEBDA6EE3ED3E5A22 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910A9E23B80E8366005C4AB9627C488921B + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530409661683E7A037DD27ABED0D27FCF765C + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA45413F503CECF6F4CA21B12EBFBEB8B1 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C788950B824C6410BA0A471149F3E44A5D + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410BB2E4BC239E49328CE71C75514EAA9E6 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870591B7B0D0E564676BC597B9181D7912CE1 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C41FC9099D9D9156DED361EE6C4F3D392E + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB108CDC255B29691D74FA48D0661187672BB + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE7B2772F7714A70189507A3FF7913D6AC + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E9216844777B699692BDEC3EEC6089F5E35 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1F60AE090E00F59EA76CD9E72A729CB40 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEA4E840A54D24E500854ABA38DF28B6290 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7763AF2F14BA6372E318990F117FDA6F84B + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F170151F8A3424D5C4C4321467436F87B87B + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F2C39F29322D3F5E7513704CC78848E3D2 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE312EBC48E50FBB372165CA42D9499AFCE1 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E6213763CBAB49CEA2B16A8141260B1761553E + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121D378CF52EFDCDDFFF05AC89AD407C6DB3 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92BA8B6B3A37422AD1C8A59D855FE04EE1 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1ACCF77FF2DD178325EFAA49A9EAE6DEBB9 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAF79F45C3506E6504BCE311FB2BA9C97E + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E01C5C3DE7357F8CD226E5793C0C3617D4 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B08E7CBD670955A083B9CA5984B9DC1BA + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF8554CABC5C4A4E1E05114D265F84DFDAC + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7037DB404091A3E58D2D40E8E0440FDE3 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C1AFF34E81069211E2D5FA2105E0AA13F3 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB1184370AFA0517385321B661911D8C6205E8384 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA7A47BFF58707949FCFC9A6B5A6E8814A + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686F164C36C66E48439EA60975D04F92F62F + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1FE660CAF6F80C49185072EE86D0083CE3 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88ADED44742AF474B026419853EFE024BC3 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A784DD3BC94A2BD738E82DC6340D98842 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A12641C60E2CBCAFBF181A9D169ED7D2A299 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F12FBF7D84941AAE70462453B7A49E653C + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E35314ED6A4719DB1F5C9E399693A802A + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17F598AA7EFCD64964675D24A565D00493 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C756435408B2C0856C4199AE11F31EA662ED + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D683A48FFAA726A543C590DB8161F7454F + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870599392061D2033BCA510B4279BBFD8393397 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FB953DF04D89437419FB6988BFEA95246E + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800EDFDE0B971E3F4A8C1AFA5ADDC0B0A81 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F2A2BDCACE61D50C7E50BBD5E59E8C878 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EAA1791BF0B1778C5BC895E17DC3E5DAE + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1804A45EE13F6B0CF8320A03F668B3939E6 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD0B3A85BA9FEEA671B893E815DB8A9B2A2 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F98EF5ED1340BCE092FFC298518F57982 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F170082CCD7E602BB35B0F3BBE0AD61BCEA89C + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29005BF24B9BA21E3BBD5D1ECA4B813F5E5 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DD792EB3EADEFA1134C091FBFC55B5AC83 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C45696998E3D00B2800F1B0B6D2A15626 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F9469A9378C5347AEC16A8406FACAB7B + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C85BC2708E4B0DFEA050F1853685D482B7 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC307A66521AC54E31E68C4D6FFC396C1456 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE1DEDE3E73A188266B83222D02F18FB7BF + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AEBB090B3A1B72FAF7503A0E9976D5247 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D1E27B95BECEE7620B2525008227C9A6 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880C70AA140FD58081CBBF536499170E078 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F87F92F678D59638779651535E54AA3CC5 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EEC301F30062367087196802150808075 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048678F478B63B53EFF069F96091CF55FE6 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA29EDD3FE5032BFD1F515E22E8C89316FD0 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA4C92660C422C4CB44683C1D84988D5942 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A8305365ADB7CD88348A81A98AB9F4D7B + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5FA3880D2DCE9CBF399C27B85E3CA082C + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7826387ABA0798DB7C9C9E39AE872E1557 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A3D4672636B95CEEAD4D2302937BE43FCD + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14D56F0C8BC4C72FAD3112249A7191A9EBE + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6FC883B1C155C9D32C8DE04FC9B9832C9B + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA1701549545A251159A158FA7EFAD1DB9A24F + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C7568625CBC0F9CC1AF9305FD5C2E7756BB71E + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B0700CBFD3F00AB6125442F7E65E5E9A0D + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE207870599365BF238AE8D6F878A9CAB5F375F3023B7C + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBC6D4A9511F32D9C839D2898E664F86F51 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E39105C8CEAB76DC22346F35725E6E9A54 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F6375B25F26490FB9729613AA156E9CDC09 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE1C4858650E794F061ACE5C88947F1356E + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B72345A5D982890D534B3A0E637FCA9B0 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD04168603E6E4A8D425655420EF52B9695F1 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F11B9080708BD6A129DCE1B84A0A41C5FEA + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F1700800E746283990C00230CCF8CBC7CCDC29BF + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F290013DF8E2568342A0ACF13D174BFDC96744 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC173CAB49763ECCB4D1B5F76C92A0BAB27 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E35C2A6864B8BF2A80C2F87D46426E467 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1877CB9F646EC9D81226C5D9EFB84D23F + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C839B1E7505092A93C896EC71EA2A8DEC129 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC3053F22D96B459572934E280E7A9CB10CE78 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12DA7BC2BEF13B83C056D8A7D3BA23B9B3E + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE819507DD270D96A1292FA78F8662961B9 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D3BB9CFCF3898D0BD6804D19BBBECB0891 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BAC142A149EC02E00F725FCB37272AB510 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84FD3725A18173A77BDAC40A061921C8184 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE219CAA4F185C15C1354BBD8EC498D5C8 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C447FD2E0B0349132F06C5154A77CAF0E1 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296DB7D8D924A7D091321ACFFAC5DD330E9D + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA442D9AE200FC7504FD305944F594B36AC61 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A478C66B48BBDB632083A0002882A897858 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DF2E28B325DDD186B947356203EB65800E + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A78204CABE719A57F058B045A11B6829D67AD + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36766FED51BA686A5422E0B089BD8BD37A0 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7D998D4BE5E0F75A499C65C1E04CE05A0 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B5ABE26FF26AB1DF8BF0F590965A05449 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016DBB7A7F80B06BC40910BD61610E2093B0 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A197C6570E80F70C17B3101C96C17441CB + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B0895624C8115F614D8EC1D3005CEBEB1B51 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657C7AB16A3D0516F89AB354BC633CFBAF34 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB944CED71E7236F58B42CE271EBCD9A89C + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E3507018162630198AA754943574D2FF9066 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BE84CC36894163647FAE56072A236FD9B + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18C6F54DA327A975FD4B029850D5D166F62 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15293E73CC2AC3327A87ABF8FEE73B9B69 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD04125AEBCB352ACB3587EA51826AB6EA0B1E1 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118CB6BC6078F334AF97219B336860E3D41E + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B7D13345255CF92801A9A3D5DC4171B0A + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D1D97E52A6B403213A107244093E0484E4 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16A167BE655DE61783AED326EF55C721A5F + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E6406A682CA732E0A6343F3972A7A5D0A5D + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1569A99E822F0CAC39712A2A64C98C4D6AF + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395ADF18226D6D19CE23FCC627AFB7C6C3E2 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC305343AAA2D6F5BA3639A7D9D0A4D7D92DC8CD + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D768E36CFDE4A4024F36147D4A58D19D1FF + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FCBCC2B1D46679034875DD246EA8D48FC5 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D3817211241CDB68B4CBF51BD8C96A32DD83 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD5D63D548FF76B64DD3A5285DBB18DFA9 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F819DD52EB8D6769F85188EFAF4B2338A4C + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EE46009F3E77070C26B33C1EC759161AD + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C41778E4F42A21E2F0AE73B6E1B3B8329BEB + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6C1BF6BE08AF1FFC1CF8D4A19EE3807311 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247402586228465BB002D7B922ECD81AEA6 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B156BFBDFCCCF6766F1904F1A1C312B613 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF2F630AB3997AE3D77B29119AFB72F0DFF + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D89E30FFA811B016E849B2C36D434B6DEB + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A367961E6574D790B66E7CC9EBB59B98126848 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEBE93B6B354B70E3441ADC7B984B289E5 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B038D5D7060A8A963EDE9633301C208E967 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2A8D1F3FAE1DFDA6E58B9A1E282D89A6CF + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A1B8B3C2D418160B075C1D96B44E39135B17 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B089AACF7996B1E8DA274D271C8B3FAF58EE4A + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657CE3C393212A76E0D530B7A7484027CC68B8 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB9E1AD8C999819A31547AC88977714CCC621 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E350F3AABCF1B3257ECA12FECCBA04218041B5 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BF94329A0A9CF7770A75A624FDDB6DBDF11 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18CC65F7E1F5C7FF605DE1201AEF4997B51A0 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15CDB18E269F5FE4AD1A7D76B754C594374B + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD0412587291923FC174379862D8948DE128B3D5B + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118C63A5A3A01D520A8D225D4050CB3F82DA51 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B932E6BC3517995DF2147931020613A2A71 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D163C086F00E66CB4D46B0DE409B52FFDF1D + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16AD57674A344872F1B9BA11AEDF8EFD67087 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E643638C47B1B9CD22876495243731C28E544 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1568F5DB27872ADE446B5D77646C3F8EEE051 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395AB80BB44948A449C10528091B3B48C24DDA + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC30534303B825CF81BCB170C3E2DD9F0C9291B38E + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D761C17D36D90C9B688A4AE823711C1113EAF + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FC7D5A30ED8E9650C085E26770C3CE871010 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D381DD015B91A47268BDBC8E5DE46EB1622764 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD6FBFDF71E04D475B68A55F94C822E5DA1F + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F8113675C5E1441182B7A093A7C114FF6318F + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EAE8FBB19CBBC343A474A909BD6D9517BBE + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C41732BE00A74F26E4977EDD14175C0450F946 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6CD5ACB995ED8C42AC7861ED3AD1AB805E44 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247AE2A57BECAB6C48EB820598077D92D5383 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B12D5A351568E8E8C677DE44765EA049135B + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF23A3D7D25609C16A140DC20624A62B76DDC + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D834F843EC4C1B18185E102021702756071C + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36796D32416C23DDC9F31EEFA35AB90F389BBF5 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEF8B133F875DBB9ABDF5C781FAE27A567FE + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B03A94045083794E1A78FA226A354AB8CC80B + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2AE61C3EBBF92FE3B9C48797B1063407E816 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 5D595FC00A309301719B30AD9E6D720F6F6F4759A224A9688EB4C75686A1B801660053CFDC1CC57345FD8E411FEB6E52 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 26E9E1E6CA70A3AAEEEFDB32D4FF5D58D9B2F8DFE90DE676310410D6B089AA360D073EA98E48B3652225E7DE03D82928 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 23F20757EED9BD23444F77CF570FBA2D5F0C3C7BD213BE2078705993657CE3718918A04D294E13C22B664F4BDF44446F + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 4ACAC27BDC76D9ECB02E3E01A68A86416F570EAABEFB14D98442C4FBBCB9E1653A2E7B400B45079B7E80705658D8388C + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = ACA0E4DAF3CEAEBBE2AD9211FF6CC70DB95FDB9DD668D04ABFB10800E350F356BA31FA1700224E6A3A53706152D6A4B3 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = C4391456A101A0E34EDACA527AC73ED2B842B7A14F6F4644E493FE6F638BF90C0909DCAFFDCFCE67CE39159D9C040515 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 827CD57C82F771D6F75DD14CB99FA79888C04B3E9B54E5E8D00E923EE18CC630D93EB5FF1C83D094B7821E7D49EB1114 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 51154C40A682CA589070211F76E422760443A13AF720B21D9008F1800B15CDE060C1E89F25F15C13FFD1A0FD918EF307 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 1F13E728A9AADB9B7CC7820795A35262053EF347EDB04A3FBCDEEAD041258752AEEB0B02978E1D36E5663017B35339C7 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = FC4099B87E0BD6C76BBEA0EB9850AF5D78E45862D38C244D07A7768F118C630CCD4A9BBF7EC22EB9A71F33A11B4309C6 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = D6E7A7EBF79EF94BB7F6AC47C51753A9B685E9200845334287F17008007B9391417A58BD7677D802A14FD57306615EA5 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = ABC3924173986D9EAA16CE0D01E923E5B6B26DC70E21903C6131F29001D163B168125D1A48CBF7C726DC5AD8A0F536D5 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = F945FD84A00365BF8F4190FE5751D459A5C19BA2F767D81AF4FE31DDC16AD5D78FFC6707821C563420178B56618A77E6 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 7E20B012B76A04839AD7BA817AFD08E1EA84D92C62B5C9F0E621371C1E6436B224CF885EDEE87C831739063CF127774F + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 7BBC47D028FFD9DCAB64290758E52FAF034043D06217208DC9121DF9F1568FDFDAEFA7590625B1D898B5420AE3E5D1C8 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 63C244A171D6F7A407C8D8F90DCD2FB74B236D391A98464E9A4C92C8395AB8710EA7734A02B93011ECFFEFAC35B3EA5F + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 3BFF715A56CBA49D1F7AC0691A966FDC89B947BC662FA27528D1AC30534303332F79D09D518693F6F813B935D60EF641 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 54B63042B7680D22824EFFE3DA23161C2D8984731FCE0C7C609DEAE12D761CDCFBC3CBB7E6ED73AE25F7A5C93CD9C34E + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2E39B59F582173D0D75744B0B9AE78C80BEDFC3BCDD7A7340868E03AE8FC7D26BB86CA85AB5E30FCBBAF04AF11890149 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2CFB2E5466BC5C2FC5EB6F03D66FB1327393A508A142FAA35BD22B16D381DDA47DC2B9F95E1C29A98E6B50CF94167164 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0BA3C9FEE8626275D118DD280BA5DF38A6690CB9432631F3C35BF880BADD6F5809BAD19BF4D3E48DFB9635D6AA31492C + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B669AECF3E52190D03DFA0F5C208C5D92BAEEA86E3C715506A45D7F84F8113363D6D3C528897A97975753465479309A2 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 30C092F85750867A9D839F33EE18CC0F9096F440A541BAB9CC03C16EAE4EAEDF76CD16742773A5FD176F23081D0EB733 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5A6C16FD92FCFA3E896BBC9AC80FD02DC2B1C0952383EAB118437048C417325B695FF53252C931FF41BB22849ABCE88A + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3774F177DDC0981146DF3F281CF795196E775DC4A833C7E815E5EA296D6CD5881CA73398668453C2DA1258574F29104C + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 642E07E311A826F4FB01C4DA867D024928AACFCDCFE0D53521686FA44247AEB4B086C356C448A7D1596FADCA91D2BED0 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9EC0E62126ED4EE8048E9A42FD06904687A4606A119B7D6A654B1F8A47B12D3A59572F5D48CBCFCDA17295B4C1F482FE + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8662D3D8F719F940747F63ACDA7524521DA211816EACB5EF50E88AD5DFF23A68A97C05988441BE9AD9D171D8C7E55025 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5F8470C7082BFFDFEC8D3FC3F707D5B72D5834969B61281217DB0A7820D834DF06A190A02541DA4D1A60CD60F120326F + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8838B48C9EBA1D7B760254FB2439DC7A825E3533F663EB1177A126A36796D3B9794635E895ACEB43F1859D828CFF4ABB + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E0561BD540B6FB527E7E1D16B4B4C74ED788143600ABAC92910F14DA7BEF8B57F08243215BDF745B3352E951B0FBCDF + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46B584FE672C7BA161C34F9EA5624D2918F1703784E3C2B530406E6F8B03A9B5C51E1008D904A4B785124E1FDDCBABB8 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BAF563C60FBEDDC5662995F4C678BE80A7F7DE9B3AD8C97AA6CA17016D2AE6508E6FB3F79B412A1627AB7DFA755E0A22 + diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.c b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/api.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/encrypt.c b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..1286684 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "gift-cofb.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return gift_cofb_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return gift_cofb_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.c b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.c new file mode 100644 index 0000000..6f65524 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.c @@ -0,0 +1,405 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "gift-cofb.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const gift_cofb_cipher = { + "GIFT-COFB", + GIFT_COFB_KEY_SIZE, + GIFT_COFB_NONCE_SIZE, + GIFT_COFB_TAG_SIZE, + AEAD_FLAG_NONE, + gift_cofb_aead_encrypt, + gift_cofb_aead_decrypt +}; + +/** + * \brief Structure of an L value. + * + * The value is assumed to have already been converted from big-endian + * to host byte order. + */ +typedef struct +{ + uint32_t x; /**< High word of the value */ + uint32_t y; /**< Low word of the value */ + +} gift_cofb_l_t; + +/** + * \brief Structure of a 128-bit block in host byte order. + * + * The block is assumed to have already been converted from big-endian + * to host byte order. + */ +typedef union +{ + uint32_t x[4]; /**< Words of the block */ + uint8_t y[16]; /**< Bytes of the block */ + +} gift_cofb_block_t; + +/** + * \brief Doubles an L value in the F(2^64) field. + * + * \param L The value to be doubled. + * + * L = L << 1 if the top-most bit is 0, or L = (L << 1) ^ 0x1B otherwise. + */ +#define gift_cofb_double_L(L) \ + do { \ + uint32_t mask = ((int32_t)((L)->x)) >> 31; \ + (L)->x = ((L)->x << 1) | ((L)->y >> 31); \ + (L)->y = ((L)->y << 1) ^ (mask & 0x1B); \ + } while (0) + +/** + * \brief Triples an L value in the F(2^64) field. + * + * \param L The value to be tripled. + * + * L = double(L) ^ L + */ +#define gift_cofb_triple_L(L) \ + do { \ + uint32_t mask = ((int32_t)((L)->x)) >> 31; \ + uint32_t tx = ((L)->x << 1) | ((L)->y >> 31); \ + uint32_t ty = ((L)->y << 1) ^ (mask & 0x1B); \ + (L)->x ^= tx; \ + (L)->y ^= ty; \ + } while (0) + +/** + * \brief Applies the GIFT-COFB feedback function to Y. + * + * \param Y The value to be modified with the feedback function. + * + * Y is divided into L and R halves and then (R, L <<< 1) is returned. + */ +#define gift_cofb_feedback(Y) \ + do { \ + uint32_t lx = (Y)->x[0]; \ + uint32_t ly = (Y)->x[1]; \ + (Y)->x[0] = (Y)->x[2]; \ + (Y)->x[1] = (Y)->x[3]; \ + (Y)->x[2] = (lx << 1) | (ly >> 31); \ + (Y)->x[3] = (ly << 1) | (lx >> 31); \ + } while (0) + +/** + * \brief Process the associated data for GIFT-COFB encryption or decryption. + * + * \param ks The GIFT-128 key schedule to use. + * \param Y GIFT-COFB internal state. + * \param L GIFT-COFB internal state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the plaintext in bytes. + */ +static void gift_cofb_assoc_data + (gift128b_key_schedule_t *ks, gift_cofb_block_t *Y, gift_cofb_l_t *L, + const unsigned char *ad, unsigned long long adlen, unsigned long long mlen) +{ + /* Deal with all associated data blocks except the last */ + while (adlen > 16) { + gift_cofb_double_L(L); + gift_cofb_feedback(Y); + Y->x[0] ^= L->x ^ be_load_word32(ad); + Y->x[1] ^= L->y ^ be_load_word32(ad + 4); + Y->x[2] ^= be_load_word32(ad + 8); + Y->x[3] ^= be_load_word32(ad + 12); + gift128b_encrypt_preloaded(ks, Y->x, Y->x); + ad += 16; + adlen -= 16; + } + + /* Pad and deal with the last block */ + gift_cofb_feedback(Y); + if (adlen == 16) { + Y->x[0] ^= be_load_word32(ad); + Y->x[1] ^= be_load_word32(ad + 4); + Y->x[2] ^= be_load_word32(ad + 8); + Y->x[3] ^= be_load_word32(ad + 12); + gift_cofb_triple_L(L); + } else { + unsigned temp = (unsigned)adlen; + unsigned char padded[16]; + memcpy(padded, ad, temp); + padded[temp] = 0x80; + memset(padded + temp + 1, 0, 16 - temp - 1); + Y->x[0] ^= be_load_word32(padded); + Y->x[1] ^= be_load_word32(padded + 4); + Y->x[2] ^= be_load_word32(padded + 8); + Y->x[3] ^= be_load_word32(padded + 12); + gift_cofb_triple_L(L); + gift_cofb_triple_L(L); + } + if (mlen == 0) { + gift_cofb_triple_L(L); + gift_cofb_triple_L(L); + } + Y->x[0] ^= L->x; + Y->x[1] ^= L->y; + gift128b_encrypt_preloaded(ks, Y->x, Y->x); +} + +/** @cond cofb_byte_swap */ + +/* Byte-swap a block if the platform is little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define gift_cofb_byte_swap_word(y) \ + (__extension__ ({ \ + uint32_t _y = (y); \ + (_y >> 24) | (_y << 24) | ((_y << 8) & 0x00FF0000U) | \ + ((_y >> 8) & 0x0000FF00U); \ + })) +#define gift_cofb_byte_swap(x) \ + do { \ + (x)[0] = gift_cofb_byte_swap_word((x)[0]); \ + (x)[1] = gift_cofb_byte_swap_word((x)[1]); \ + (x)[2] = gift_cofb_byte_swap_word((x)[2]); \ + (x)[3] = gift_cofb_byte_swap_word((x)[3]); \ + } while (0) +#else +#define gift_cofb_byte_swap(x) do { ; } while (0) +#endif + +/** @endcond */ + +int gift_cofb_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift128b_key_schedule_t ks; + gift_cofb_block_t Y; + gift_cofb_l_t L; + gift_cofb_block_t P; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + GIFT_COFB_TAG_SIZE; + + /* Set up the key schedule and use it to encrypt the nonce */ + gift128b_init(&ks, k); + Y.x[0] = be_load_word32(npub); + Y.x[1] = be_load_word32(npub + 4); + Y.x[2] = be_load_word32(npub + 8); + Y.x[3] = be_load_word32(npub + 12); + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + L.x = Y.x[0]; + L.y = Y.x[1]; + + /* Authenticate the associated data */ + gift_cofb_assoc_data(&ks, &Y, &L, ad, adlen, mlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + /* Deal with all plaintext blocks except the last */ + while (mlen > 16) { + P.x[0] = be_load_word32(m); + P.x[1] = be_load_word32(m + 4); + P.x[2] = be_load_word32(m + 8); + P.x[3] = be_load_word32(m + 12); + be_store_word32(c, Y.x[0] ^ P.x[0]); + be_store_word32(c + 4, Y.x[1] ^ P.x[1]); + be_store_word32(c + 8, Y.x[2] ^ P.x[2]); + be_store_word32(c + 12, Y.x[3] ^ P.x[3]); + gift_cofb_double_L(&L); + gift_cofb_feedback(&Y); + Y.x[0] ^= L.x ^ P.x[0]; + Y.x[1] ^= L.y ^ P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and deal with the last plaintext block */ + if (mlen == 16) { + P.x[0] = be_load_word32(m); + P.x[1] = be_load_word32(m + 4); + P.x[2] = be_load_word32(m + 8); + P.x[3] = be_load_word32(m + 12); + be_store_word32(c, Y.x[0] ^ P.x[0]); + be_store_word32(c + 4, Y.x[1] ^ P.x[1]); + be_store_word32(c + 8, Y.x[2] ^ P.x[2]); + be_store_word32(c + 12, Y.x[3] ^ P.x[3]); + gift_cofb_feedback(&Y); + Y.x[0] ^= P.x[0]; + Y.x[1] ^= P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift_cofb_triple_L(&L); + c += 16; + } else { + unsigned temp = (unsigned)mlen; + gift_cofb_block_t padded; + memcpy(padded.y, m, temp); + padded.y[temp] = 0x80; + memset(padded.y + temp + 1, 0, 16 - temp - 1); + P.x[0] = be_load_word32(padded.y); + P.x[1] = be_load_word32(padded.y + 4); + P.x[2] = be_load_word32(padded.y + 8); + P.x[3] = be_load_word32(padded.y + 12); + gift_cofb_byte_swap(padded.x); + padded.x[0] ^= Y.x[0]; + padded.x[1] ^= Y.x[1]; + padded.x[2] ^= Y.x[2]; + padded.x[3] ^= Y.x[3]; + gift_cofb_byte_swap(padded.x); + memcpy(c, padded.y, temp); + gift_cofb_feedback(&Y); + Y.x[0] ^= P.x[0]; + Y.x[1] ^= P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift_cofb_triple_L(&L); + gift_cofb_triple_L(&L); + c += temp; + } + Y.x[0] ^= L.x; + Y.x[1] ^= L.y; + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + } + + /* Generate the final authentication tag */ + be_store_word32(c, Y.x[0]); + be_store_word32(c + 4, Y.x[1]); + be_store_word32(c + 8, Y.x[2]); + be_store_word32(c + 12, Y.x[3]); + return 0; +} + +int gift_cofb_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift128b_key_schedule_t ks; + gift_cofb_block_t Y; + gift_cofb_l_t L; + gift_cofb_block_t P; + unsigned char *mtemp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < GIFT_COFB_TAG_SIZE) + return -1; + *mlen = clen - GIFT_COFB_TAG_SIZE; + + /* Set up the key schedule and use it to encrypt the nonce */ + gift128b_init(&ks, k); + Y.x[0] = be_load_word32(npub); + Y.x[1] = be_load_word32(npub + 4); + Y.x[2] = be_load_word32(npub + 8); + Y.x[3] = be_load_word32(npub + 12); + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + L.x = Y.x[0]; + L.y = Y.x[1]; + + /* Authenticate the associated data */ + gift_cofb_assoc_data(&ks, &Y, &L, ad, adlen, *mlen); + + /* Decrypt the ciphertext to produce the plaintext */ + mtemp = m; + clen -= GIFT_COFB_TAG_SIZE; + if (clen > 0) { + /* Deal with all ciphertext blocks except the last */ + while (clen > 16) { + P.x[0] = Y.x[0] ^ be_load_word32(c); + P.x[1] = Y.x[1] ^ be_load_word32(c + 4); + P.x[2] = Y.x[2] ^ be_load_word32(c + 8); + P.x[3] = Y.x[3] ^ be_load_word32(c + 12); + be_store_word32(m, P.x[0]); + be_store_word32(m + 4, P.x[1]); + be_store_word32(m + 8, P.x[2]); + be_store_word32(m + 12, P.x[3]); + gift_cofb_double_L(&L); + gift_cofb_feedback(&Y); + Y.x[0] ^= L.x ^ P.x[0]; + Y.x[1] ^= L.y ^ P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + c += 16; + m += 16; + clen -= 16; + } + + /* Pad and deal with the last ciphertext block */ + if (clen == 16) { + P.x[0] = Y.x[0] ^ be_load_word32(c); + P.x[1] = Y.x[1] ^ be_load_word32(c + 4); + P.x[2] = Y.x[2] ^ be_load_word32(c + 8); + P.x[3] = Y.x[3] ^ be_load_word32(c + 12); + be_store_word32(m, P.x[0]); + be_store_word32(m + 4, P.x[1]); + be_store_word32(m + 8, P.x[2]); + be_store_word32(m + 12, P.x[3]); + gift_cofb_feedback(&Y); + Y.x[0] ^= P.x[0]; + Y.x[1] ^= P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift_cofb_triple_L(&L); + c += 16; + } else { + unsigned temp = (unsigned)clen; + P.x[0] = Y.x[0]; + P.x[1] = Y.x[1]; + P.x[2] = Y.x[2]; + P.x[3] = Y.x[3]; + gift_cofb_byte_swap(P.x); + lw_xor_block_2_dest(m, P.y, c, temp); + P.y[temp] = 0x80; + memset(P.y + temp + 1, 0, 16 - temp - 1); + gift_cofb_byte_swap(P.x); + gift_cofb_feedback(&Y); + Y.x[0] ^= P.x[0]; + Y.x[1] ^= P.x[1]; + Y.x[2] ^= P.x[2]; + Y.x[3] ^= P.x[3]; + gift_cofb_triple_L(&L); + gift_cofb_triple_L(&L); + c += temp; + } + Y.x[0] ^= L.x; + Y.x[1] ^= L.y; + gift128b_encrypt_preloaded(&ks, Y.x, Y.x); + } + + /* Check the authentication tag at the end of the packet */ + gift_cofb_byte_swap(Y.x); + return aead_check_tag(mtemp, *mlen, Y.y, c, GIFT_COFB_TAG_SIZE); +} diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.h new file mode 100644 index 0000000..670d042 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/gift-cofb.h @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_GIFT_COFB_H +#define LWCRYPTO_GIFT_COFB_H + +#include "aead-common.h" + +/** + * \file gift-cofb.h + * \brief GIFT-COFB authenticated encryption algorithm. + * + * GIFT-COFB is an authenticated encryption algorithm that combines + * the COFB (COmbined FeedBack) block cipher mode with the GIFT-128 + * block cipher. The algorithm has a 128-bit key, a 128-bit nonce, + * and a 128-bit authentication tag. + * + * References: https://www.isical.ac.in/~lightweight/COFB/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for GIFT-COFB. + */ +#define GIFT_COFB_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all GIFT-COFB family members. + */ +#define GIFT_COFB_TAG_SIZE 16 + +/** + * \brief Size of the nonce for GIFT-COFB. + */ +#define GIFT_COFB_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the GIFT-COFB cipher. + */ +extern aead_cipher_t const gift_cofb_cipher; + +/** + * \brief Encrypts and authenticates a packet with GIFT-COFB. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa gift_cofb_aead_decrypt() + */ +int gift_cofb_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with GIFT-COFB-0. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa gift_cofb_aead_encrypt() + */ +int gift_cofb_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128-config.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.c b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-avr.S b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-avr.S new file mode 100644 index 0000000..641613a --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-avr.S @@ -0,0 +1,2104 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-full-avr.S b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-full-avr.S new file mode 100644 index 0000000..ff11875 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-full-avr.S @@ -0,0 +1,5037 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r13,X+ + ld r12,X+ + ld r11,X+ + ld r10,X+ + ld r5,X+ + ld r4,X+ + ld r3,X+ + ld r2,X+ + ld r9,X+ + ld r8,X+ + ld r7,X+ + ld r6,X+ + ld r29,X+ + ld r28,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rjmp 768f +30: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +768: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-small-avr.S b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-small-avr.S new file mode 100644 index 0000000..77ef9fd --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-small-avr.S @@ -0,0 +1,6053 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +678: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + cpse r16,r1 + rjmp 678b + rjmp 1175f +830: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1175: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-tiny-avr.S b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-tiny-avr.S new file mode 100644 index 0000000..e7a03f1 --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-gift128b-tiny-avr.S @@ -0,0 +1,6766 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-util.h b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/gift-cofb/Implementations/crypto_aead/giftcofb128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/gimli/Implementations/crypto_aead/gimli24v1/rhys-avr/internal-gimli24.c b/gimli/Implementations/crypto_aead/gimli24v1/rhys-avr/internal-gimli24.c new file mode 100644 index 0000000..d719988 --- /dev/null +++ b/gimli/Implementations/crypto_aead/gimli24v1/rhys-avr/internal-gimli24.c @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gimli24.h" + +#if !defined(__AVR__) + +/* Apply the SP-box to a specific column in the state array */ +#define GIMLI24_SP(s0, s4, s8) \ + do { \ + x = leftRotate24(s0); \ + y = leftRotate9(s4); \ + s4 = y ^ x ^ ((x | s8) << 1); \ + s0 = s8 ^ y ^ ((x & y) << 3); \ + s8 = x ^ (s8 << 1) ^ ((y & s8) << 2); \ + } while (0) + +void gimli24_permute(uint32_t state[12]) +{ + uint32_t s0, s1, s2, s3, s4, s5; + uint32_t s6, s7, s8, s9, s10, s11; + uint32_t x, y; + unsigned round; + + /* Load the state into local variables and convert from little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s0 = state[0]; + s1 = state[1]; + s2 = state[2]; + s3 = state[3]; + s4 = state[4]; + s5 = state[5]; + s6 = state[6]; + s7 = state[7]; + s8 = state[8]; + s9 = state[9]; + s10 = state[10]; + s11 = state[11]; +#else + s0 = le_load_word32((const unsigned char *)(&(state[0]))); + s1 = le_load_word32((const unsigned char *)(&(state[1]))); + s2 = le_load_word32((const unsigned char *)(&(state[2]))); + s3 = le_load_word32((const unsigned char *)(&(state[3]))); + s4 = le_load_word32((const unsigned char *)(&(state[4]))); + s5 = le_load_word32((const unsigned char *)(&(state[5]))); + s6 = le_load_word32((const unsigned char *)(&(state[6]))); + s7 = le_load_word32((const unsigned char *)(&(state[7]))); + s8 = le_load_word32((const unsigned char *)(&(state[8]))); + s9 = le_load_word32((const unsigned char *)(&(state[9]))); + s10 = le_load_word32((const unsigned char *)(&(state[10]))); + s11 = le_load_word32((const unsigned char *)(&(state[11]))); +#endif + + /* Unroll and perform the rounds 4 at a time */ + for (round = 24; round > 0; round -= 4) { + /* Round 0: SP-box, small swap, add round constant */ + GIMLI24_SP(s0, s4, s8); + GIMLI24_SP(s1, s5, s9); + GIMLI24_SP(s2, s6, s10); + GIMLI24_SP(s3, s7, s11); + x = s0; + y = s2; + s0 = s1 ^ 0x9e377900U ^ round; + s1 = x; + s2 = s3; + s3 = y; + + /* Round 1: SP-box only */ + GIMLI24_SP(s0, s4, s8); + GIMLI24_SP(s1, s5, s9); + GIMLI24_SP(s2, s6, s10); + GIMLI24_SP(s3, s7, s11); + + /* Round 2: SP-box, big swap */ + GIMLI24_SP(s0, s4, s8); + GIMLI24_SP(s1, s5, s9); + GIMLI24_SP(s2, s6, s10); + GIMLI24_SP(s3, s7, s11); + x = s0; + y = s1; + s0 = s2; + s1 = s3; + s2 = x; + s3 = y; + + /* Round 3: SP-box only */ + GIMLI24_SP(s0, s4, s8); + GIMLI24_SP(s1, s5, s9); + GIMLI24_SP(s2, s6, s10); + GIMLI24_SP(s3, s7, s11); + } + + /* Convert state to little-endian if the platform is not little-endian */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; + state[4] = s4; + state[5] = s5; + state[6] = s6; + state[7] = s7; + state[8] = s8; + state[9] = s9; + state[10] = s10; + state[11] = s11; +#else + le_store_word32(((unsigned char *)(&(state[0]))), s0); + le_store_word32(((unsigned char *)(&(state[1]))), s1); + le_store_word32(((unsigned char *)(&(state[2]))), s2); + le_store_word32(((unsigned char *)(&(state[3]))), s3); + le_store_word32(((unsigned char *)(&(state[4]))), s4); + le_store_word32(((unsigned char *)(&(state[5]))), s5); + le_store_word32(((unsigned char *)(&(state[6]))), s6); + le_store_word32(((unsigned char *)(&(state[7]))), s7); + le_store_word32(((unsigned char *)(&(state[8]))), s8); + le_store_word32(((unsigned char *)(&(state[9]))), s9); + le_store_word32(((unsigned char *)(&(state[10]))), s10); + le_store_word32(((unsigned char *)(&(state[11]))), s11); +#endif +} + +#endif /* !__AVR__ */ diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.c b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.h b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/api.h b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/encrypt.c b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/encrypt.c new file mode 100644 index 0000000..2724d30 --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "grain128.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return grain128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return grain128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.c b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.c new file mode 100644 index 0000000..fa41b64 --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "grain128.h" +#include "internal-grain128.h" +#include + +aead_cipher_t const grain128_aead_cipher = { + "Grain-128AEAD", + GRAIN128_KEY_SIZE, + GRAIN128_NONCE_SIZE, + GRAIN128_TAG_SIZE, + AEAD_FLAG_NONE, + grain128_aead_encrypt, + grain128_aead_decrypt +}; + +/** + * \brief Encodes the associated data length in DER. + * + * \param buf The buffer to encode the length into. + * \param adlen The length of the associated data in bytes, which must be + * less than 2^32 to limit the length of the DER encoding to 5 bytes. + * + * \return The length of the DER encoding that was written to \a buf. + */ +static unsigned grain128_encode_adlen + (unsigned char buf[5], unsigned long long adlen) +{ + if (adlen < 0x80U) { + buf[0] = (unsigned char)adlen; + return 1; + } else if (adlen < 0x100U) { + buf[0] = 0x81; + buf[1] = (unsigned char)adlen; + return 2; + } else if (adlen < 0x10000U) { + buf[0] = 0x82; + buf[1] = (unsigned char)(adlen >> 8); + buf[2] = (unsigned char)adlen; + return 3; + } else if (adlen < 0x1000000U) { + buf[0] = 0x83; + buf[1] = (unsigned char)(adlen >> 16); + buf[2] = (unsigned char)(adlen >> 8); + buf[3] = (unsigned char)adlen; + return 4; + } else { + buf[0] = 0x84; + buf[1] = (unsigned char)(adlen >> 24); + buf[2] = (unsigned char)(adlen >> 16); + buf[3] = (unsigned char)(adlen >> 8); + buf[4] = (unsigned char)adlen; + return 5; + } +} + +int grain128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + grain128_state_t state; + unsigned char der[5]; + unsigned derlen; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + GRAIN128_TAG_SIZE; + + /* Limit the amount of associated data to make DER encoding easier */ + if (adlen >= 0x100000000ULL) + return -2; + + /* Initialize the Grain-128 stream cipher with the key and nonce */ + grain128_setup(&state, k, npub); + + /* Authenticate the associated data, prefixed with the DER-encoded length */ + derlen = grain128_encode_adlen(der, adlen); + grain128_authenticate(&state, der, derlen); + grain128_authenticate(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + grain128_encrypt(&state, c, m, mlen); + + /* Generate the authentication tag */ + grain128_compute_tag(&state); + memcpy(c + mlen, state.ks, GRAIN128_TAG_SIZE); + return 0; +} + +int grain128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + grain128_state_t state; + unsigned char der[5]; + unsigned derlen; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < GRAIN128_TAG_SIZE) + return -1; + *mlen = clen - GRAIN128_TAG_SIZE; + + /* Limit the amount of associated data to make DER encoding easier */ + if (adlen >= 0x100000000ULL) + return -2; + + /* Initialize the Grain-128 stream cipher with the key and nonce */ + grain128_setup(&state, k, npub); + + /* Authenticate the associated data, prefixed with the DER-encoded length */ + derlen = grain128_encode_adlen(der, adlen); + grain128_authenticate(&state, der, derlen); + grain128_authenticate(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= GRAIN128_TAG_SIZE; + grain128_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + grain128_compute_tag(&state); + return aead_check_tag(m, clen, state.ks, c + clen, GRAIN128_TAG_SIZE); +} diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.h b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.h new file mode 100644 index 0000000..c8d6de9 --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/grain128.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_GRAIN128_H +#define LWCRYPTO_GRAIN128_H + +#include "aead-common.h" + +/** + * \file grain128.h + * \brief Grain-128AEAD authenticated encryption algorithm. + * + * Grain-128AEAD is an authenticated encryption algorithm based around a + * combination of a 128-bit linear feedback shift register (LFSR) and a + * 128-bit non-linear feedback shift register (NFSR). It is a member of + * the Grain family of stream ciphers. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Grain-128AEAD. + */ +#define GRAIN128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Grain-128AEAD. + */ +#define GRAIN128_TAG_SIZE 8 + +/** + * \brief Size of the nonce for Grain-128AEAD. + */ +#define GRAIN128_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Grain-128AEAD cipher. + */ +extern aead_cipher_t const grain128_aead_cipher; + +/** + * \brief Encrypts and authenticates a packet with Grain-128AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa grain128_aead_decrypt() + */ +int grain128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Grain-128AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa grain128_aead_encrypt() + */ +int grain128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.c b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.c new file mode 100644 index 0000000..d0d71ea --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.c @@ -0,0 +1,411 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-grain128.h" + +/* Extracts 32 bits from the Grain state that are not word-aligned */ +#define GWORD(a, b, start_bit) \ + (((a) << ((start_bit) % 32)) ^ ((b) >> (32 - ((start_bit) % 32)))) + +/** + * \brief Performs 32 rounds of Grain-128 in parallel. + * + * \param state Grain-128 state. + * \param x 32 bits of input to be incorporated into the LFSR state, or zero. + * \param x2 Another 32 bits to be incorporated into the NFSR state, or zero. + */ +static void grain128_core + (grain128_state_t *state, uint32_t x, uint32_t x2) +{ + uint32_t s0, s1, s2, s3; + + /* From the Grain-128AEAD specification, the LFSR feedback algorithm is: + * + * s'[i] = s[i + 1] + * s'[127] = s[0] ^ s[7] ^ s[38] ^ s[70] ^ s[81] ^ s[96] ^ x + * + * The bits are numbered from the most significant bit in the first + * word of the LFSR state. Calculate the feedback bits 32 at a time. + */ + s0 = state->lfsr[0]; + s1 = state->lfsr[1]; + s2 = state->lfsr[2]; + s3 = state->lfsr[3]; + x ^= s0; /* s[0] */ + x ^= GWORD(s0, s1, 7); /* s[7] */ + x ^= GWORD(s1, s2, 38); /* s[38] */ + x ^= GWORD(s2, s3, 70); /* s[70] */ + x ^= GWORD(s2, s3, 81); /* s[81] */ + x ^= s3; /* s[96] */ + + /* Rotate the LFSR state left by 32 bits and feed s0 into the NFSR */ + state->lfsr[0] = s1; + state->lfsr[1] = s2; + state->lfsr[2] = s3; + state->lfsr[3] = x; + x2 ^= s0; + + /* Perform the NFSR feedback algorithm from the specification: + * + * b'[i] = b[i + 1] + * b'[127] = s'[127] ^ b[0] ^ b[26] ^ b[56] ^ b[91] ^ b[96] + * ^ (b[3] & b[67]) ^ (b[11] & b[13]) ^ (b[17] & b[18]) + * ^ (b[27] & b[59]) ^ (b[40] & b[48]) ^ (b[61] & b[65]) + * ^ (b[68] & b[84]) ^ (b[22] & b[24] & b[25]) + * ^ (b[70] & b[78] & b[82]) + * ^ (b[88] & b[92] & b[93] & b[95]) ^ x2 + * + * Once again, we calculate 32 feedback bits in parallel. + */ + s0 = state->nfsr[0]; + s1 = state->nfsr[1]; + s2 = state->nfsr[2]; + s3 = state->nfsr[3]; + x2 ^= s0; /* b[0] */ + x2 ^= GWORD(s0, s1, 26); /* b[26] */ + x2 ^= GWORD(s1, s2, 56); /* b[56] */ + x2 ^= GWORD(s2, s3, 91); /* b[91] */ + x2 ^= s3; /* b[96] */ + x2 ^= GWORD(s0, s1, 3) & GWORD(s2, s3, 67); /* b[3] & b[67] */ + x2 ^= GWORD(s0, s1, 11) & GWORD(s0, s1, 13); /* b[11] & b[13] */ + x2 ^= GWORD(s0, s1, 17) & GWORD(s0, s1, 18); /* b[17] & b[18] */ + x2 ^= GWORD(s0, s1, 27) & GWORD(s1, s2, 59); /* b[27] & b[59] */ + x2 ^= GWORD(s1, s2, 40) & GWORD(s1, s2, 48); /* b[40] & b[48] */ + x2 ^= GWORD(s1, s2, 61) & GWORD(s2, s3, 65); /* b[61] & b[65] */ + x2 ^= GWORD(s2, s3, 68) & GWORD(s2, s3, 84); /* b[68] & b[84] */ + x2 ^= GWORD(s0, s1, 22) & GWORD(s0, s1, 24) & /* b[22] & b[24] & b[25] */ + GWORD(s0, s1, 25); + x2 ^= GWORD(s2, s3, 70) & GWORD(s2, s3, 78) & /* b[70] & b[78] & b[82] */ + GWORD(s2, s3, 82); + x2 ^= GWORD(s2, s3, 88) & GWORD(s2, s3, 92) & /* b[88] & b[92] ... */ + GWORD(s2, s3, 93) & GWORD(s2, s3, 95); /* ... & b[93] & b[95] */ + + /* Rotate the NFSR state left by 32 bits */ + state->nfsr[0] = s1; + state->nfsr[1] = s2; + state->nfsr[2] = s3; + state->nfsr[3] = x2; +} + +/** + * \brief Generates 32 bits of pre-output data. + * + * \param state Grain-128 state. + * + * \return The generated 32 bits of pre-output data. + */ +static uint32_t grain128_preoutput(const grain128_state_t *state) +{ + uint32_t s0, s1, s2, s3; + uint32_t b0, b1, b2, b3; + uint32_t x0, x4, y; + + /* From the Grain-128AEAD specification, each pre-output bit y is given by: + * + * x[0..8] = b[12], s[8], s[13], s[20], b[95], + * s[42], s[60], s[79], s[94] + * h(x) = (x[0] & x[1]) ^ (x[2] & x[3]) ^ (x[4] & x[5]) + * ^ (x[6] & x[7]) ^ (x[0] & x[4] & x[8]) + * y = h(x) ^ s[93] ^ b[2] ^ b[15] ^ b[36] ^ b[45] + * ^ b[64] ^ b[73] ^ b[89] + * + * Calculate 32 pre-output bits in parallel. + */ + s0 = state->lfsr[0]; + s1 = state->lfsr[1]; + s2 = state->lfsr[2]; + s3 = state->lfsr[3]; + b0 = state->nfsr[0]; + b1 = state->nfsr[1]; + b2 = state->nfsr[2]; + b3 = state->nfsr[3]; + x0 = GWORD(b0, b1, 12); + x4 = GWORD(b2, b3, 95); + y = (x0 & GWORD(s0, s1, 8)); /* x[0] & x[1] */ + y ^= (GWORD(s0, s1, 13) & GWORD(s0, s1, 20)); /* x[2] & x[3] */ + y ^= (x4 & GWORD(s1, s2, 42)); /* x[4] & x[5] */ + y ^= (GWORD(s1, s2, 60) & GWORD(s2, s3, 79)); /* x[6] & x[7] */ + y ^= (x0 & x4 & GWORD(s2, s3, 94)); /* x[0] & x[4] & x[8] */ + y ^= GWORD(s2, s3, 93); /* s[93] */ + y ^= GWORD(b0, b1, 2); /* b[2] */ + y ^= GWORD(b0, b1, 15); /* b[15] */ + y ^= GWORD(b1, b2, 36); /* b[36] */ + y ^= GWORD(b1, b2, 45); /* b[45] */ + y ^= b2; /* b[64] */ + y ^= GWORD(b2, b3, 73); /* b[73] */ + y ^= GWORD(b2, b3, 89); /* b[89] */ + return y; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step_simple */ +#define bit_permute_step_simple(_y, mask, shift) \ + do { \ + (_y) = (((_y) & (mask)) << (shift)) | (((_y) >> (shift)) & (mask)); \ + } while (0) + +void grain128_setup + (grain128_state_t *state, const unsigned char *key, + const unsigned char *nonce) +{ + uint32_t k[4]; + unsigned round; + + /* Internally, the Grain-128 stream cipher uses big endian bit + * order, but the Grain-128AEAD specification for NIST uses little + * endian bit order. We need to swap the bits around when we load + * the bits of the key and the nonce. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 + * 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24] + */ + #define SWAP_BITS(out, in) \ + do { \ + uint32_t tmp = (in); \ + bit_permute_step_simple(tmp, 0x55555555, 1); \ + bit_permute_step_simple(tmp, 0x33333333, 2); \ + bit_permute_step_simple(tmp, 0x0f0f0f0f, 4); \ + (out) = tmp; \ + } while (0) + + /* Initialize the LFSR state with the nonce and padding */ + SWAP_BITS(state->lfsr[0], be_load_word32(nonce)); + SWAP_BITS(state->lfsr[1], be_load_word32(nonce + 4)); + SWAP_BITS(state->lfsr[2], be_load_word32(nonce + 8)); + state->lfsr[3] = 0xFFFFFFFEU; /* pad with all-1s and a terminating 0 */ + + /* Initialize the NFSR state with the key */ + SWAP_BITS(k[0], be_load_word32(key)); + SWAP_BITS(k[1], be_load_word32(key + 4)); + SWAP_BITS(k[2], be_load_word32(key + 8)); + SWAP_BITS(k[3], be_load_word32(key + 12)); + state->nfsr[0] = k[0]; + state->nfsr[1] = k[1]; + state->nfsr[2] = k[2]; + state->nfsr[3] = k[3]; + + /* Perform 256 rounds of Grain-128 to mix up the initial state. + * The rounds can be performed 32 at a time: 32 * 8 = 256 */ + for (round = 0; round < 8; ++round) { + uint32_t y = grain128_preoutput(state); + grain128_core(state, y, y); + } + + /* Absorb the key into the state again and generate the initial + * state of the accumulator and the shift register */ + state->accum = ((uint64_t)(grain128_preoutput(state))) << 32; + grain128_core(state, k[0], 0); + state->accum |= grain128_preoutput(state); + grain128_core(state, k[1], 0); + state->sr = ((uint64_t)(grain128_preoutput(state))) << 32; + grain128_core(state, k[2], 0); + state->sr |= grain128_preoutput(state); + grain128_core(state, k[3], 0); + + /* No keystream data has been generated yet */ + state->posn = sizeof(state->ks); +} + +/** + * \brief Generates the next 16 byte block of keystream output data. + * + * \param state Grain-128 state. + */ +static void grain128_next_keystream(grain128_state_t *state) +{ + unsigned posn; + for (posn = 0; posn < sizeof(state->ks); posn += 4) { + /* Get the next word of pre-output and run the Grain-128 core */ + uint32_t x = grain128_preoutput(state); + grain128_core(state, 0, 0); + + /* Grain-128 uses big-endian bit order, but the NIST functions + * that are built on top of this use little-endian bit order. + * Swap the bits around so that they are ready for use later. + * + * We also need to separate the bits: even bits are used to encrypt + * and odd bits are used to authenticate. Shift them to separate + * bytes to make it easier to access the even and odd bits later. + * + * P = [7 15 6 14 5 13 4 12 3 11 2 10 1 9 0 8 + * 23 31 22 30 21 29 20 28 19 27 18 26 17 25 16 24] + */ + bit_permute_step(x, 0x11111111, 3); + bit_permute_step(x, 0x03030303, 6); + bit_permute_step(x, 0x000f000f, 12); + bit_permute_step_simple(x, 0x00ff00ff, 8); + be_store_word32(state->ks + posn, x); + } +} + +void grain128_authenticate + (grain128_state_t *state, const unsigned char *data, + unsigned long long len) +{ + unsigned char abyte; + unsigned char sbyte; + unsigned char bit; + uint64_t accum = state->accum; + uint64_t sr = state->sr; + unsigned posn = state->posn; + while (len > 0) { + /* Fetch the next byte to be authenticated */ + abyte = *data++; + --len; + + /* Request more keystream data if necessary */ + if (posn >= sizeof(state->ks)) { + grain128_next_keystream(state); + posn = 0; + } + + /* Get the next byte of keystream to add to the shift register. + * We use the odd bytes from the keystream and ignore even ones */ + sbyte = state->ks[posn + 1]; + posn += 2; + + /* XOR the shift register with the accumulator for each 1 bit + * in the byte that we are authenticating. And shift in the + * keystream byte we retrieved above */ + for (bit = 0; bit < 8; ++bit) { + accum ^= sr & (-((uint64_t)(abyte & 0x01))); + sr = (sr << 1) ^ (sbyte & 0x01); + abyte >>= 1; + sbyte >>= 1; + } + } + state->accum = accum; + state->sr = sr; + state->posn = posn; +} + +void grain128_encrypt + (grain128_state_t *state, unsigned char *c, const unsigned char *m, + unsigned long long len) +{ + unsigned char mbyte; + unsigned char sbyte; + unsigned char bit; + uint64_t accum = state->accum; + uint64_t sr = state->sr; + unsigned posn = state->posn; + while (len > 0) { + /* Fetch the next byte to be encrypted and authenticated */ + mbyte = *m++; + --len; + + /* Request more keystream data if necessary */ + if (posn >= sizeof(state->ks)) { + grain128_next_keystream(state); + posn = 0; + } + + /* Get the next two bytes of keystream data. The even byte is + * used to encrypt the input and the odd byte is shifted into + * the shift register for authentication purposes */ + *c++ = mbyte ^ state->ks[posn]; + sbyte = state->ks[posn + 1]; + posn += 2; + + /* XOR the shift register with the accumulator for each 1 bit + * in the plaintext byte that we are authenticating. And shift + * in the keystream byte we retrieved above */ + for (bit = 0; bit < 8; ++bit) { + accum ^= sr & (-((uint64_t)(mbyte & 0x01))); + sr = (sr << 1) ^ (sbyte & 0x01); + mbyte >>= 1; + sbyte >>= 1; + } + } + state->accum = accum; + state->sr = sr; + state->posn = posn; +} + +void grain128_decrypt + (grain128_state_t *state, unsigned char *m, const unsigned char *c, + unsigned long long len) +{ + unsigned char mbyte; + unsigned char sbyte; + unsigned char bit; + uint64_t accum = state->accum; + uint64_t sr = state->sr; + unsigned posn = state->posn; + while (len > 0) { + /* Fetch the next byte to be decrypted and authenticated */ + mbyte = *c++; + --len; + + /* Request more keystream data if necessary */ + if (posn >= sizeof(state->ks)) { + grain128_next_keystream(state); + posn = 0; + } + + /* Get the next two bytes of keystream data. The even byte is + * used to decrypt the input and the odd byte is shifted into + * the shift register for authentication purposes */ + mbyte ^= state->ks[posn]; + *m++ = mbyte; + sbyte = state->ks[posn + 1]; + posn += 2; + + /* XOR the shift register with the accumulator for each 1 bit + * in the plaintext byte that we are authenticating. And shift + * in the keystream byte we retrieved above */ + for (bit = 0; bit < 8; ++bit) { + accum ^= sr & (-((uint64_t)(mbyte & 0x01))); + sr = (sr << 1) ^ (sbyte & 0x01); + mbyte >>= 1; + sbyte >>= 1; + } + } + state->accum = accum; + state->sr = sr; + state->posn = posn; +} + +void grain128_compute_tag(grain128_state_t *state) +{ + uint64_t x; + + /* Authenticate a final 1 bit as padding on the stream */ + state->accum ^= state->sr; + + /* Swap the bits of the accumulator into little endian + * order and write them to the keystream buffer */ + x = state->accum; + bit_permute_step_simple(x, 0x5555555555555555ULL, 1); + bit_permute_step_simple(x, 0x3333333333333333ULL, 2); + bit_permute_step_simple(x, 0x0f0f0f0f0f0f0f0fULL, 4); + be_store_word64(state->ks, x); +} diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.h b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.h new file mode 100644 index 0000000..4c3a6e4 --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-grain128.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GRAIN128_H +#define LW_INTERNAL_GRAIN128_H + +#include "internal-util.h" + +/** + * \file internal-grain128.h + * \brief Internal implementation of the Grain-128 stream cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Representation of the state of Grain-128. + * + * Note: The specification numbers bits starting with the most significant, + * so bit 0 is in the highest bit of the first word of each field below. + */ +typedef struct +{ + uint32_t lfsr[4]; /**< 128-bit LFSR state for Grain-128 */ + uint32_t nfsr[4]; /**< 128-bit NFSR state for Grain-128 */ + uint64_t accum; /**< 64-bit accumulator for authentication */ + uint64_t sr; /**< 64-bit shift register for authentication */ + unsigned char ks[16]; /**< Keystream block for auth or encrypt mode */ + unsigned posn; /**< Current position within the keystream */ + +} grain128_state_t; + +/** + * \brief Sets up the initial Grain-128 state with the key and nonce. + * + * \param state Grain-128 state to be initialized. + * \param key Points to the 128-bit key. + * \param nonce Points to the 96-bit nonce. + */ +void grain128_setup + (grain128_state_t *state, const unsigned char *key, + const unsigned char *nonce); + +/** + * \brief Authenticates data with Grain-128. + * + * \param state Grain-128 state. + * \param data Points to the data to be authenticated. + * \param len Length of the data to be authenticated. + */ +void grain128_authenticate + (grain128_state_t *state, const unsigned char *data, + unsigned long long len); + +/** + * \brief Encrypts and authenticates data with Grain-128. + * + * \param state Grain-128 state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param len Length of the data to be encrypted. + */ +void grain128_encrypt + (grain128_state_t *state, unsigned char *c, const unsigned char *m, + unsigned long long len); + +/** + * \brief Decrypts and authenticates data with Grain-128. + * + * \param state Grain-128 state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param len Length of the data to be decrypted. + */ +void grain128_decrypt + (grain128_state_t *state, unsigned char *m, const unsigned char *c, + unsigned long long len); + +/** + * \brief Computes the final authentiation tag. + * + * \param state Grain-128 state. + * + * The final authentication tag is written to the first 8 bytes of state->ks. + */ +void grain128_compute_tag(grain128_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-util.h b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/grain-128aead/Implementations/crypto_aead/grain128aead/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/LWC_AEAD_KAT_128_96.txt b/hyena/Implementations/crypto_aead/hyenav2/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..dee108b --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = F83CA141A233342B1507192F171774A6 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = E350763873B36471681989E03CDFB4BE + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 9A9914D7A8CDFEDB8A688BE6DB7D214F + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = B15A5A5F09385A20B035E7FEB346BD61 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 05B95CD0688782299C70A33BBCAF1684 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 1DBC0D28C0FB4AD8872754FD420BD92E + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 74258B43E575F6FC33E26F0B552BC750 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = A85F470EEE90CA2A94FE30415E31CAFF + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 39017F93CEE6B83AA4C4C1FF48273564 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = 3A2894D1043FD54DC77289FFE4333AD1 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = DABDA6CF51150E19F164F2C7C6C22D16 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = 6FCDB8AD80BDFAE150D0AE919A172C20 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 66AF967D66CB56F87083C660A30AC8C9 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = C30EBDA26826BCC6F99C0A4D54773D8F + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 4A813C69C95F24DCF669940B1AA189F9 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 1AE6DDA58C17F337366DF7FADA1D4497 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 50A5C6ABBA4CE9171452107468ADE5AE + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9F5DEF663FFEE7A15C4D6FA673D359FC + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 9DF77CB405D36668958F398ABF7B28FC + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E209CB81746B72716538D7CD17A6444D + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F00A350C020334FB5EA7B33F289AD795 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7106B19BBDBD2FDF3D11D9B91FC154DF + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 14B8A10E0682BB2482DF9B1DCE755551 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BDA04DE64CD80319EB5DF8EBBA42EFC4 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 216C14D4CD1829198C545681F3864970 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 334AD62CC8D101B3D5033B2FAC7C739C + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2DAA8A8E5294BDF1A81B3D8993EC2546 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9E698F85F7C7807B9C9F7185B4BCDF95 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5865A44D9F5A99CD3F5CF29AD20E57DE + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 42F7FDFDD34381AE9CD411EFA7BD638C + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 331D1718FACA29369FDBE92ED53A15B8 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F7CF8AA4B345A3CDA36ACE0A25997D8C + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DFA8FCE97F530C981A0CDAE70790A0CA + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 3562C0CAC7E1F43E1B2FA4D8ADDBF15C3F + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = A79E7781A6274290D22A1A52590920EE64 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = 4475D06FDAC2DC3DDE1351FFC32C9E3E13 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = B1F3073D129A6E7A0B81367EDD40FA3890 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = B1AD4FD7FC82BF695D564B556257B42D8E + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 36DC47D07AEC68DE8FBAF06182443D539B + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 28232093DA22D93FC6D8123279D0071932 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 5ACA0451CACDDFA47EA49DE67C73DF3817 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = D697C88429C45EF9B3DCC6D3C7E2352CB0 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = 640A80F88EC038155DF0ABC679F34521DD + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = CA95BAAB316AB874D2DE2BFF4019B3477C + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = DFFB4C3FE417CD5CFDF4EE44CA44576CA9 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = 7C081DAA73C942F805281CBB6C426C9A0B + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = D8F97AB08D58B59AF1C3150F992DF970A1 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 25234BD0773F5EAE650DE66ADEA41A0854 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = D258F7088B90612A4DCEDDF603A976077B + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 833D4C27499C767911E2929950EDACC21C + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 718EEA718E4DC268685A18D0407C92AA59 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36DC969FBDC053E80A15D73ED54B2540B5 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1010983DF8CB9D4BD1A8EFA7E77D31258D + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DAE7EB670A106B4D223123EC7109B335E2 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CE15813C9EE3A15FE59023C1E86CA30D53 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C6C7D076B14D455913FDCE8DAE036F399B + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F0F0EE9B7A5BBA5EA6462D4D245B4E63ED + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4F172F8293E584BF57CE0B3801C49C938 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA7EA9F6FC6F184ABD2FAB6A08E652B3B + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 367A2D3B489283BB3BD1F4386530D3F4A1 + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 440DC0D046FF381F6A7B45CE9BD43CF9BC + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FB8705E1F4E34658F8EAE8A83DFFDC433B + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4BAB51B967FB6FA25FCD916115FD54674 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 643BF7DFE1C94C8F1548776FBAB5965672 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 42063D5D026E34C4B7D23841A100707208 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 811C29BB1E14BDDB4AE15DCEAD47A81F17 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 35D79A22166BB4D0E9935BB287A19E81FE98 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = A72543D69E4BAF2D1030E7DC99E6A9614D05 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = 44264EDFD4613C5F859B5159705C887F2CB2 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = B15380C041A3FB771C20782D07A525C9ED11 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = B1B9BEA459A8BC11ABEEFFF03BB146B52807 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 36E0ADD5CCD30E0973311BA0B60AC425DFDD + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 28D16747FC810E892ED126C425E2D44776B1 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 5A8DB34960533773DE982BD0A9294B9944A3 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = D608DC147826F87CF8404F307FB6B551C05D + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 64BB2614E435F0FB897796B47DD26012144B + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = CA122C90F50F64675A0ADB84D44017178758 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = DF242E5B614746020E22599C02B1C00109D5 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = 7C05E3E715DD8635C649C80C31703F92329E + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = D8217C97B35A45C3FF15449E2EFA0CB041A4 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 25D4885DC4830DAA08A6FE22BC74C324C011 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC1A6893FA251E7515A6F1CA44ADE80D2 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8342598DC9DDC63BC64B1116E82A273174C7 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C25E3FA43AAB31DEA6B4201CBB5771340F + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36027ACAB06E71C015DFE6B5D9173891B0BD + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1039ACB1CA0FF2F8056AD8B407AB146D4C92 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68217622B178B099FA3522DCC32C2707E6 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9018DD5BED384650928846202D86C88B4 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679AD3EA098339E9C0793E2CCA92CC9E44F + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F0984E4D0E9EEA6FB513F71329F82A8BC5F9 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B498222971AFDD5DB88E409D661EECB47B2E + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA215F2DECE20F034D95CA50625744ADFF6 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364B5FAA2A3C81EAFF4E814B81A015BAC911 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F73C8A10FBA9D6288BEB7C6501AC571045 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEE733548947F8009455C8DC8DF186838E + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9B5F1A9AE528F7BE15DBD2C576B6F8639 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CABD51665B67F002AB214648F19938159B + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC8FC414ABDA2C6077D6FE1ACFAE737FF + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 81569C1EDB56CA6FD92C92BC9879809C2ABF + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = 35D7CE2D348E74CEDEC9DA86A4A64CF3A42AC5 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = A725E9A1EE98E58D43886172CD47F172B2414D + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = 4426F9075F7E2B8032E07F0F834AC78B08B90E + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = B153788F81307B6B6F0A30B78F08E57C132163 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = B1B9715FDC523D22A6BAE49392757971A39959 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = 36E0B2E597B2DE9587C236A5238A3A3DF431A8 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 28D156A6B95EF521FA67753B0E343266BBC964 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 5A8DBE26F2189A2652D3312D4AACC256620E59 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = D60875801F168BCEDD767B421D00FAF1F87805 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 64BB3CCFB62570B4E2E4C0CE8B7898C545B117 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = CA126124AEFAD7F4148F0A217333D26A5802CE + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = DF24A59085FE8D00516F4EE97B812A9A652F80 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 7C053AED09A1CF3EEA8E2FD933D2E0B79B81CA + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = D82115F0AA3F2C11ED152985C62C0F03F7CF42 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 25D49FB9CA8BA623C9D54AB7480E5A80F07F3D + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC0C0B3764F22A4B0683ADEBD16CB749D3B + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 83428751D259EE5F9104C40E1770BD95D9387B + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F5D1C72AD868BB451C3E871F7E06958571 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D481C21A5FB7D280153367A2202206CF7A + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F5DDFC067CF5B617D785A2102927EBDD1 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBD67FBEA8ECC2746933EAEB89389ED5DA + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C124FC56FE6B9F49069DC64A6C1C75A6C0 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEB71225B8C9A7BC5536C11CB5DB25706B + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098974450B2F447B843280055B829E38945B4 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989FFCB0898F1D315E54F1E0536FDDFA210A + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F33E18AA005E2E35AC2C6F828AC90050E + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE32850521DA7BAC74C481AA3FF2B6320B8 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2853505F1C916ED453AF409DE862CF41C + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA117578CCAF0B102B56E3FD93104E4D18 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F13A1A52935233B01BF6947CC012AF3AA7 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0A2E9B55B6DFC5F0241C5EF582AFAA016D + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC417C7DA55CDE36ECEBD731806F9EFFFA1 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BEFC7FC71A8EC5D14EAA6328407373F230 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = 35D7CEADBEB429B3F757FDBB0DE8BBFA3A9B86DB + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = A725E9310D2521C06E7A9A0DA227D41BD7C47489 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = 4426F96A548CE9B03F97A1FFDB0A1072F9D86164 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = B15378691058BA7D7DFB57654620B11063F1ED14 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = B1B971ECEE4725ADF77B1AD5B3DD46C5216C1DFA + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = 36E0B2DBA03451251576B5F2AFAC30657BE8366F + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 28D1565C9EFB769ED07CD875AD2511D5C3EDD021 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 5A8DBE79A9657E15D928356CA177423E84CFD291 + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = D60875BC0810BB15950AAA9852295A5DCEA2EA61 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 64BB3CDACB38C3DBE947A577B5639BCE7139AA40 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = CA126131FC39CEE5E5091525C549D55CF452BFAB + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = DF24A5AF9FF19EE8BE8FD7AED6FDB2DB9472747D + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = 7C053A55597EAECD10D9856BA37F0FABF574BB01 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = D82115EDB5FD700C27616ED1067BCD68D7A9FEC9 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 25D49F7479F3F9458223B2DD54052E9E79B6C3DD + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E0CA1B2D02F9E1A598B6490E42ECA93C4 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 83428794E3F6BBF6BC1B5D239CF64AF9D1197987 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B307D061E4EF4D4490788216804421C10 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D4000EF47EED8E53D6A02349469703346331 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03BBEBBF42FD17EC1634C687287B045923 + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF56D0EEE1D3704F5747FBC94B9E2707AE + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C148B3ADB929BD18B24C6F075FCEB1B1244C + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD250F45B09314E7E91DE8BCD394026AA7 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D8BF787838FC486B6F358DD8F50108648 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F213212DFA5909E2D87BD7F2EB580CB0069 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F389397788A8BB8CB3EE1D069759714E3C0 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE3524E6772BAFCE394083CE6C156EC36A0D2 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2737CCC7913F6E37902520A312B1A4F6E94 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA087FE844D4B6187066B645386ED2519231 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0637DA52119A77DF1CDFB661430538477 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF4042F4719DFFECDC914B9CEC2FC3BA438 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43DBBE1D724A1BFD640ACCF238CBC7CC6C4 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE510BCF653037BFF094C1428155381C7118 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 35D7CEAD7D8DB819DAD5FAC3BB8003574DCD7FEAC5 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = A725E931A0BD08D6451C45495EBD60359B4056A239 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = 4426F96A07AD5EB0A92EEBB502EFBABAD4A6E096D7 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = B15378691A8FD93BDDD3D0A12B8FE7A142F16B1A6F + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = B1B971ECE73007A7FAD7F92500768E7CB2BE19C72E + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = 36E0B2DB67F3F62FC1510CF45C5E60DE88FB0ED13C + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 28D1565CED7DE3B08D91DE92420335545D6A0C2BCB + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 5A8DBE79CD8053C920ECBA7B060D4382E4C2DA3741 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = D60875BC19AC3B27393B991DB7453D3D2DF9CA921F + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 64BB3CDA2A9B08D9F2AE5CFCCED0FE310218260FE6 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = CA1261316A136DE2C5A75DE87DC201CC13A34C7586 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = DF24A5AF538241442F6256DDE11BDAF6A54D585574 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 7C053A5598C5B67F2ED61EEE418A764D1EE7676A6A + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = D82115EDF58479DCE4F8ADC78DD694BEA6CCBF23F6 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D5FDD395291944A5BE36FEA396E0BB38DF + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8CAA593407EF8B560E328E2CC6A42BEBCA + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945FAF6CA4FAD641763BFD5A261A55DEB3CF + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0DF2EDDBC650B7FF8EE3D560FE462519D9 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B316AF9F6BA3501D8F9D3B2BCBCE8A359E + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5B5426D142B4827D944D94329E0D0645E + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF98A2D6058C482BC8B986901CA2FAFF4302 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C148986742812D6F1E78C47DC16BD2BB8D9364 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD038E7A58D66814ED57D42C7440341451A9 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D351E18BA4F0F5800E6A7B628DE47D1F883 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A5B3A8B4D741939C94CEA886326F558D1D + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F3862F3D974806569A494C38A4BD3D2F28DD2 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE35231A5F4ED74877F40046CD305574ADFEAC0 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F6E217957036003975829DE2E8D193A68 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A4ECEA7D76A1B13F76025F239A3D0137AF + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DEECD3EAA1924AF6B1EAA23A6F2A2584E8 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494EA5EF6C0C4A0CA9654FF3B622E0DF977 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F87789DC819748981094BC74F9D691B68 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107B9F6B65E4B9343F33387C17448903882 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 35D7CEAD7DB155EA008D848CAB1834C60C26B6C3D0CB + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = A725E931A0E103D4B6F4E7B0D69C8209C92CA2A8C4C8 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = 4426F96A072F35CF7A9499225CDDB3A5FD43F157CA55 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = B15378691AB463E59A38652A602A16120B90273A0E42 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = B1B971ECE73E76AB3BDC77C418F3A100EF85EAA23F56 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 36E0B2DB67E7A055644E922BDF35FF4CE9508713E5EF + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 28D1565CED2D3BF5B8534CB5010E244BB3DC4C5DD107 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 5A8DBE79CDF0677B08692DB36F4865CDEC4E4CC862BC + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = D60875BC195D077A3753D5699925E0D123207979F51C + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 64BB3CDA2ACC6510A0078D3702E824381BDE092C0284 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = CA1261316A9F97BFF24721815F0E592EA98A4FC3D610 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = DF24A5AF535A3844154C74DA1DAC6811A971A24661E2 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 7C053A5598BEA204FE64BDC86ECFE79CB1B823D51307 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = D82115EDF548F949976ABF04419136C1357F2376DE92 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D5304FE322EBB0CCC10E8CEE9E85C1EDB66C + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C892DBB8AFC4E4DE6191D5A6540F9564964 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B3614D90419FA406D74F61B7541EC2112 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2DD5113F2575784C63894D27B7D0D97589 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B365A66135F08EA35439DE97C0E09FAAB3B9 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EEF7FC91BD9B82A3CDC0E20286839FD195 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861916DE5452255CD6B6412931300040202 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898595745B00E9117C1674D885EB440BD0B5D + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD037454781E4F6CD3A52BC02D87E46AABDDFB + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C37AA4DDE64C863E98D5A2C021307FC648 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51B6186E02D0858B5CB3B42658217FFD615 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F3862575843315F9C162B2CA8A18E6989F327E5 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311E28BBB40994D712B185C92CF9F7C3C525 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09B280BF003DADCFECE5B5636BFD306889 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B59C558B844BDF4312B3DFCAD682CF32D + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE922FD55F59B09FD252A7010A0BD3CC15A1 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AAD5E4C100ABA0729DBB3CCDF9FC8791B8 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F122D5F76B7EAFAAD6BCBF0DD288FCAABEA + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE510769280B391811DE0E733E4998B0CBBE3C03 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = 35D7CEAD7DB14EBA290EE9B86AC6B0F1E37B819662C1C3 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = A725E931A0E1C446F43D79985B62645838541066CB96B2 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = 4426F96A072FA52A9437E2ECD1F17312BB324A21C85BF7 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = B15378691AB46A8370806D4E4990D25C8C10B4B1F85722 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = B1B971ECE73E52A57986B5B9E5EFB5FA9E26160C639124 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = 36E0B2DB67E79F5FEDB489D7A19BD5257F77DA93448ACE + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 28D1565CED2D7E5CE9134A9D7239AED97C8355009F08B3 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 5A8DBE79CDF0A3DE15BA7527DB0E7DE9492223EFF3193D + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = D60875BC195DDE88DA03F76B2CBBC2F742EA30D988E00D + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DE5CCE2E0F23A0A1B8072FD68D269AF5F + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = CA1261316A9FCF9A4D988A90EC6AB7E8F56A807D6D982C + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = DF24A5AF535A101DCEDB81764B7BB50D64013D5698D497 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0FA03A7206C600A0BD18B278A2FADAE563 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = D82115EDF548111EABF18021C68000E27B53AB66657A1E + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C84178686923E225F98FCF6ADEA210C5B1 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C8903532880687286CC12CF45E6E1FE181F65 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B587BD8490C4151C5F7E9A6C661DC53F + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D225B9794022783444D2B271A971B8F85DD + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B3652724BEE855D853415C7AA4543A0E089915 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE583A58803DE7A140070A3FF43A85033909 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AFD82E7B1D45748724D8418484EAAB99A0 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B5EE276DB70B37298AC96E33EB8316D88 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A9431758C15D345FD68DA9B14B037E6F57 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E54DEBDBD5AAEB8780D7FC862F73F66B31 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA898631C2C2C667BB0E2F58566792DD5A6 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F3862578428154FF9563C2984971435A2F8F1B8C2 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD4ED9557DA7899469CFFCE244AFB28E20 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1F5D3087F4BE41B7AE2A515A28566DAA6 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B88C6B44770C7379725B7F447D9210F33C5 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE92192C6D6EB67BEEE7C710233B9F3814E6EE + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5BD2CF76F6E7038E02AFC419B8358182E9 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0D29CF628E43045153DF6F8B23BC23FEF + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE51076960BAE6B3C46BCE79B3D2418853ED11C656 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 35D7CEAD7DB14E4836C63264A30966C5C34C4AECE1D0D4A2 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = A725E931A0E1C4F4D865AFE9261C1425A91C8852F757659A + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = 4426F96A072FA511F88C2EE72B67F77FA13A57F716EF2240 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = B15378691AB46AC0367B0854761405ED34F347F24791E158 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = B1B971ECE73E528C623B65082BC8A5DE6547C4A09C3DBBEE + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 36E0B2DB67E79F26DBF03B0CCC3E968DBDE42C99E606BDE0 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 28D1565CED2D7E1B8861988F2681713444C030B13D2FC9F7 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 5A8DBE79CDF0A3184B7EBCDA5DA0737994FD6D26F4DFE68B + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = D60875BC195DDE2928BEA79A8DD5F24B434F3C827210FD20 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFFBB8B2EB086D7709E33CE023B22E63B74 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = CA1261316A9FCF245EBF11544933CC4843E91AC5CBD00FB4 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = DF24A5AF535A10455B2D0D3EFE0FEBE07F3D231ECEA24646 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F14C01C4763CDE960D9CD94F36ED447C351 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC68720A102E5AEE74AFED62E95CAFA170 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C865BB39CAF17F6E165C02CD2BFD252600A3 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C8903197B1A8A0C095A01EDB77A639E841920BA + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B28AD5F0666065501FF17763126B4EB06F + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD8BB3913EC48D4A1356761A4D69B68338 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FAF74FDB20AE7B434D11CF32E05908E2BC + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58660070B5AD7EA9D8EED88C192885E79313 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF201B85A0BCD07B4E2E1C1459E04F681CBD + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7953A6B1165AA1DC8C03559EBC0FBD7453 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A939FB3FCECE35E8AB562E76DB12F13530F0 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E5705AF19F1D14A8E844BCBA82CE2AF42C4F + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D64859F882C8431DEFC6C292943763BA04 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A013077AFD148C6EF2BDAC0A437F83616E + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0C4D9496493919B1F79B6EE4AA10DB6A27 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA488BEEA451F461975E274B5DFBCE6B6D + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B883049C479642EC2B078032D423E8C478BA2 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE921909B28C3627908CAF0901C2423F2A403F52 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1F13065A1E0E782A853029CB4CD473F73D + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0095DB65F4F1431951E15E7D1955657E85F + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054DA53F82C21C3A4905F8738BDB6DC3E13 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = 35D7CEAD7DB14E481688A07DD865A91B54C979AC8F4AF0F541 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = A725E931A0E1C4F45A6C68395DD02892AAE3A59AA2C8EDFE60 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = 4426F96A072FA511D93D1B91A6A1B9825C1C0F33CB7E18B3D6 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = B15378691AB46AC0846D9689FEECE3FBD2C73EA14D5B7F3B3F + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = B1B971ECE73E528CA00665BBC4E87988624ECC17654A7559AE + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 36E0B2DB67E79F267E70A2F66596EDDC24DCCB898FEE1FCE40 + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 28D1565CED2D7E1B384F1E1FA58FA50C0A8E3FC6785EB5EC67 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 5A8DBE79CDF0A318911B2E6EEFD7D0C5F47DC376EC30508437 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = D60875BC195DDE2953FE99FADBE7D35943875DEC17572C282E + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF7752BB6A5FBF95036F6D5A97F5A0A987D1 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B29223CC77BC724BA6174959468C3346EA + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = DF24A5AF535A10459FA9EB2DB41082924418110C9E92F087A7 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F14619DC4D00D2E51C0F129B1CEAD1798BB8C + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B3B18A939367BA1EA09778CCF65CC931F + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B1E0196B9D19EB490CCBD3F3E0D8C3466 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A377FD7248D15D33F9EE19C84203A254E1 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD465FBD3B71CFE9ADC903F0CA083A44AE + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD631066A4F94DFDA5FC469CE04E145E20F6 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6F262637A8490F690B21CCE0487AEB7F1C + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A5125517E5A28BAEB101A03B21865777A + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C2E7DD342066582EBC14ED9D6BF34186BA + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989B117036EEAA82A7C30B019532A0262C0 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955BC8318E8992BDC05FB0E11987BE08626 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E570331672D9EFF50103715C82155F4C257FCB + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D662B6129CCC80651C307826ED7A34C50E56 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A32EF322001D941678FC0EC58DFFF9B20 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCF0C6462F57D945FDA56B9BA5245969F59 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA679C767BE34633161CCAEE66E051FC5BA4 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B883040123F9A58AC986738656C5FD355B68E54 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098DEDA870B170406D6161694438C41D7834 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB945A8C899B87F14093BB5CCEDD3705604 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F4B3BE13545F2CF05E8323959C6C91BBD + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B44D0AA49EF3DAE14EC6779FB00A951F35 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 35D7CEAD7DB14E4816783981D6AA2A53EB84AD90AABB5FB61012 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = A725E931A0E1C4F45A840DD590B2ADBBC4805397592B429993FD + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = 4426F96A072FA511D990A13ABAB4898A3DBD355801CEA598EA22 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = B15378691AB46AC08404AB50F966211DB5A3D17157530B77B3BC + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = B1B971ECE73E528CA034219A2053AEC02D06487253342AD39B79 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4904F97D137BD9A1B24E9BA7613251223E + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 28D1565CED2D7E1B386651B0E90815FD4A934EA60F686E635BDA + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E6AD6D526BE67970F5D214D3BDBC705818 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = D60875BC195DDE2953615B7F907641438DC4955C57C29279A13F + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E196AC3654B8DC9657B36703282D37BE6C + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26B5D4868D98D3E8C3DEF8E981840D7B6C7 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FFC2BF05E579131919A6E3245DD0B2802 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE8F401D37102DA5656485B0D274176807 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2522C9E332AB084A0DA5FE577470BAF0CE + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6EE4116312258ED52D4583374B25152A88 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395221D4A319EE5660537816AC029872E1F + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD0143369A2BD16B249C655F3C87B5D6CBEA + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD636143AA50AC11F5E986B9ED041B3A489B4C + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF44718DE47D9C2D97B4694620F9FB0C8D9 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4F18B53D4AD234A98D1BC7344F9A2205B5 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22E3B654BAE4096811165A4885421E51155 + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989400379F51B7C80B0A7620A4EC11203C8E7 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB6C6E0B08C85DBCB772BBE41DE9C32E52 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E1BF262FE3AEADA2A69359F05128C993BA + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624B4EB7FB73A043B44E78BC0C1F51FB93F9 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A7004BF8FEC56D9749E840B7307D62AB1AA + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC15B4383A5CEA1E62BE8AC9ADEE6A40105 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9636A6B6A6996B84946201BD2EC74644D + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406C1E42D7063051BCBAF0AE9753A1E4E6FE + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D814376585B2D9B6449904C6D28CBC1F536 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C1BC76D31CB6E86BF9E981E715182F5A42 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F537F953A185E06298013D7BDAA9E52AA92 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469F1D65C895F24C6ADD2473A7AE6EE96F7 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 35D7CEAD7DB14E4816787F03664F18419FBFBD3DE2C1EAD4947422 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = A725E931A0E1C4F45A84F211D0E96EFB72CAF556276D43A8161ECA + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = 4426F96A072FA511D990633EF01B6156BCD7317D7BB833CF6861D5 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = B15378691AB46AC08404F4FD434DEAD6594180C14795942B62BF0C + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = B1B971ECE73E528CA0343BC3F9B9FFF617D2D45FBEC2E0C81F5535 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 36E0B2DB67E79F267E49435EC5B73D66D123B8BC97E7CAAF5EA6FE + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A91C2940D057ED838DCA26CA07A72C1F81 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A640A55630CE0EADFDF0C09289CD6C00D + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = D60875BC195DDE295361AF4A5BBB2F2F4C6510CEB1E621C7425BC4 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E1368BD386F8C6FD01163B37E0A1835EC570 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD18823FC83F886BDD07922CA49C76CA907 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4953AE156C4A331978D8D6C30F66E2D67 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5CB4E9CD9471DF1CE11A599A24E700E531 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501B18E1C5478C613AF7F9462F6187607D0 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E6772432F465E8E11C8D1F59FE45ED7DA47 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A7E9AB0BC2C8AF227E22E0BFA36B184F7A + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E435AEC425949DCF4941A555BD1C14125A + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD63612528B2B9155B6221253B9935B91043A5F8 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF457F9C9FB8EAB9B4717521D43C53F453172 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA19C9791AF6D909E5489FB4AAF30C89C01 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF57113EB607775DA505BA718270D74F781 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F71CBA5F2E8EDB16E04E71152D8273A4A + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB19B5DE3439F7B0F2403F9F6F74F597E6CC + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CDA0670398A1B743D43CD6961AD2C3BE5 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB018D3A22C89391C7976F56D3C3600664 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A595AF6C7CF59451AB48C16E00FF60AEF2 + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A49CD5C3BBFCA3D19CD1BEF30102F89B5E + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C4E16CB70087B6EBCA56808E396F88768F + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFFB773BCDD0CDF916CB4512991FD90E81C + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D8178A1883F799B5DC508D667ACF2DD645A60 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12EA3F56AD72851CB734C6D5FE8FCDFC7B4 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323F589C55B961B0857E10A5FD238AD994D + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB06EA4FBA1D5BD5B1F66AF7ACFEAD1CA + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 35D7CEAD7DB14E4816787F463AD98F1C95F345860603C361429A4782 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = A725E931A0E1C4F45A84F2B7B0324BF07147B9BBFF103EA9C7D1184B + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = 4426F96A072FA511D99063C6B81B7428C6DC7F48F02B3B2BEA217BA1 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = B15378691AB46AC08404F4CD7F2AD8584A75717D253E7D8036EFA851 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E57FAFCA91DF96F42AA01B74C85D4D706 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DDD50718CCD6C87D6EB986AAD1303CED50 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D56268CB81F94DA84B7D29364AAFABAA9F + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604B29F06A98FFF437F8BB24D872E18530 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C139855830A6823EEA7BE13674FACA2B9 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC00B000CF86C289D4ADC1E60830F1CBDC + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB0267FAA21DAE755800EE22905344AFCE + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B1C972C725788A01A8FBC1EC81DEC984E2 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D2041A59CA0C6E799153028AF1615A6A1 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C28F47D01B6CE26C1592BA9A577341E64E + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAD1789A4210DE70D4F08019844F65797A + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A7864281C235EB3BB43B3FC8AEDCC8EF6BCB + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E45009567D8C4A8F67F0C3765ACF07AF4D2C + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252923901FF947048AA948F26522A561EBE7 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571AFA0EE65C1E41D2C5C4D0A0A8E072E571 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1732277DF285E3D2D1AB5BA89CD69D29E13 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7CAE25FBDBD045128A60D29EB106AFFF9 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88093D4E318ADAB2877D2C4D9AA53215F1 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199F65CA992AD4DCE2727DCD9F23F0406B69 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF89209319C47449AB69B5650AB872946B1 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66BC61EFD1E6A41885FDECF6D30C137363 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C67688A415FA69F400428AC2629E232815 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C83A31ACC3398B51D4E489CB42AFA76BC7 + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F4D4D0281350A08CFCCBB5B91125D81C2 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C2230191A66E0450B60474681B1B0C0EA + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884DAE6D10482F593BC7A538AB69EEAB7A6 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65089CD91E6DBFACD06E3342C5534CF5DA + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323291D83A5DC6E4616173A0933E2147124DC + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB4E93975418EB2EAF9FAABAAD13A824E99 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = 35D7CEAD7DB14E4816787F46E9F04D7EF51E4A0D38CA258FFB8BFD4B45 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = A725E931A0E1C4F45A84F2B7554004F58D87832AA4285C92BCAB97F9C1 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 4426F96A072FA511D99063C675900FE9140A8742C53EDB3D6C9670F507 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = B15378691AB46AC08404F4CD3126250B5AE725ACDF6F99FEF54C1196CF + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E399389DF256267D6115760E8425EAE9D1E + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD47999A040D9567A8F4D09CB088D64D4734 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58C5086990480B8B2F770D6085E0271A34D + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FE8DBE7BEFEF2131F87BCDBFA67E995ED + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C748726A2A4198383D1E38C1C950FD83F33 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC48CDFCC9F2E2B44CCC3685D1343716A735 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2C08C4EF7A2415907A2AECF4F5DC79F81D + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13CBF79C393CBD68BE6E207382B73BEB7F9 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B40E3C1CEE8946721A643EC6921E5B26F + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21E9DF01F43403EC7D657A5948B7D81EDC0 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF66936BD9BC57616960535D1DE9E4122FF + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FA68BA35CCAE859D1F63C17CF1FF508519 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501AF7AFD41DAA1F32DBCEE0EA8555064BF0 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD636125299973955C7CA24033A35B6F0083B8132898 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A32ACE2AB37925427911A14010C3804AFBE + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F2CD7BCDC4F4F3891D9789F62CF459616 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D77933F7EAA658837D20A9D0FAA976CADA14 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB1DB6B0315244872F58FD90D083C1C776 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA81D62BEF5EFA6BA8949E32B295A7374B1 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B982E04F9CE3EA01961D77C94DF373C70E + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB6685E7188D3EE4E2EED75F2E93E4B17DD9B2 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E563E3DE03FFD265F75112BDD4C4D6DFB9 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C8918192B85CC1E218BD357AE6EA726B19B2 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A3795D4B43BCAE26DE01667D3B9B03632 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C98E6B9AC62A2F76F9B14916BFCFC13367E + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D81788485772B0903D75E702F516CFD7085BFF449 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D44E4B9BCF9C3C8808F94B916CB0E17CCA + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297AFA7A7E61EABCB01EFC15FABA5F105FAB + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479F93A1BC3E5D04B0695D29A30D919ED6A + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB6815039497154663E6F7B0CA5CE17056 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B63FAF86C45E64B40CD14EFB06F59D04F + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 4426F96A072FA511D99063C6752BD65FC9F7AB1EDB7E9E7148B7EB875605 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA9DC0640CF4D2A13CB8B5632B040A45F9 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E39102022225815DB471DD96F5DA8E02AB55D + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D5DB3DCD6538E55FE272C14012CA31BA9 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF3E96005AA9B905081756AC7D2CCE0385 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB0A761590248E62EEF1076F4DA6D52C3BB + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A7E502085CBEF1BBDB4B9682018D2F3890 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E6B336EB8045ED49AC1720C91A0B89062 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8A9478FBB46C91F7D83F6C3354F05759C + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B49B38969EC9EDD6D0EB437D2241EFB6D + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EAD96F65C1F751071608E1DF1E5556506 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF0951261CBA8F2B0F5E2907AA5A9102B93 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68DD5780138B47534602567D7C7C0280C04 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA5B893367C1A4E7E20C743763DB0B210BE + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A890EEE609FAF4971A2681FC097BD73F8C1 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CAF36C46A321202943F08C4AF2B51F412C + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A3283910DCA88657D2199C6D61BC4D069BA1E + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F32D60D717EA88ADCE56CFFC7F71B97F284 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D77908F700EB0E6C811337F4EB3AE6F3234613 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB914C1069DEC628CB9EF612C22C4452C896 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA852215103AB93312872F869240F6F984308 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B9788835D04E4C36BCFA11E97A7FCA9907A4 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB668548E1831D622C28AB11F796B36265E3CA07 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58BD7BB2F05943D6F5545F789AEAC1BBC0D + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C89182A65FA9CF04656D7C30D42F4A75E8E7C8 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7BFC29D7C0E22B3074F28A04C805E9F19A + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F9C3BEDA0B4629CCD9D13BF9B42D1340C + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D8178848521F4D0DA889F8A29F7BAF53288535BE0B4 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BFEFDBADD1D73609EFD373FA1E1BF28E1 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A2526DCF7B795391BFBD6A794B564E437BC + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0400E3E24ACD3E192F49E81872CDCD216 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E486201057C51E2F61350555A33BB94EE + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B2D360A19093773F0276367BD6E00DE11 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 4426F96A072FA511D99063C6752B19EA6CCCAFA0999B405A0F27EEFC7B7083 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3F4024BB3A7D297289C91684C7AAF83F4B + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BF16AC0E349C6E3B6E8A0BAE4F090117E0 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45EDEDE6024ABC2EBBC34A7BB7F0B57283 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF166F004C1060F9513E71D6F6E4F3B908DC + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D86C36F9BBEAE394CDD4AA8CFC7FB60A0 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70E32AD32BFFB4C2242D2B15010796C7427 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF98AB8932D40806889F7C37B5ED26FBB + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F44FBF95294B4FC942FAAEFB4D80367CB8 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07EDFF1F50FB39C63D681D4837CC59BE40 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA41A365A98E1BBE8490150BE0CB8C3CCCF + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C7940C04B2313515D1E7BE79D172EF5D9 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D786D83923941EB13544B60778ED67C3D65 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564A733C12AB6C1835E8A06E3E6E220FEA4 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9991E5DE43620CDCB05F700717A6FFB3A + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E1131EE06B6F4B360C4C1DE407823D39A + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A32832690C038AC3D24C7D4A003F561689CA5C0 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328C64A1D70C99C9A1FC3702F0D554C63EC9 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813EC8A4DC41FE275C96D0076627B6FE76F + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147143CF8FC0BC408B023F3F62D5513BE49 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520E2547640B06AFD2F614F45EEA068D3B64 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A79A36413A8E69084FDD5E2174C79E3D45 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB668548268F3DC20E47E5519707C04D58A8BFCD7D + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B840844AD6870C46E8C00C72E0E75E95067 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F387F54383E39866FA693916E54EBF609 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF97969FE697459510BA517CF28F69B7F + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A30F23C2DFEB8C9A795A8D6C3A823A415 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D81788485218502614590209990C53539546C43A9CA58 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA25D24597E56162CF704614A6F9E68BC47 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255DFF87FD19FEDC365E37066A22CDCD80C0 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC5A921F31AE8FD3B14A87E8F4DA924B0C + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F61E3770F386BF3DB3675C0C70F043D05 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B8795E0B01C023A5C1CDCD582314D727FEF + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190847EDB9C3701C746E2F8C27299C398798 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE377E2179D73DF1E98C771D8CCD999F0DB + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC41DD7C51438F17A7FE39343FF23C99AB4 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D2610F595730D5D153E1AAA2872585958C + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF163765F21527085809492E6B48A763A38233 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D9442B7D3E5EFFA0E4DA3959423E32C7E60 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC5CB3DAC8B31B9118FE038838A2F39D226 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2A8B2007597AF648AABBD2606728CD9C2 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43DA6D650FA7FC4134BFB020C56C325D1FA + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C936457F3E7EB9BACB26A75572FA1A8A59 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA49925924259B4D92DDB9C50F7DF361FA816 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CC4134D8D210EC99499DAF74A84887100 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF9574C0CA2815453E0052E99611CE390E + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C21E87779CF06364B7EB6EE7831C6EF45A + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A30485FE51DA7BE31E0FE87280DD7A7912 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E4233663C034680D2122B92C500D93690EA + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C37FA4C2757F2749042DF63747E58ADC7F + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC74B7F8F9E8B8D05DC7B8EFC28C7466A5C + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AADD3F4AC28F8D9ADF8A063932C6FF05A5 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E0D1367C9981E4477D53C20502C44CAA6B + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF687D2D62D022D7AB4D31E98DE07BB9F22 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A7116475BC2BE5A521BE62BA8DCFDE9F82E2 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B943CF0BD7D5F4BB35753FC65E9846C828 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846174FF31419446132E8E1E6E4FB2C105BA + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A33B94C75A23537D68257DC04A415517F + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF55EAF753FF5136DAF8CE06D519A097F86 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AAB1D278F34069B13166F778C75BEC170 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD921186A35CDFD30248A68F61E79613FE + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E588BE871466FF6FACB109EBCE7BAC797D + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D248BD71A961E72284AB504CDB05AF7E148 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46460D6A42E0F4ED3317DDE9127778E541 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373D02DABAE0A1CFAA910629D6C8125BC4 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BBD90208C0C1F4CE6E00F8E6049EE7D94F + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896C76FA3C4A0474E0B369DA810373CB325 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FEAD0A12AD31DAF6BDF5D4DE977E516F2A + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D3754650A68C69C9E72A390A514317B1AD + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D283A1CEBA0191207B8B3FE1751651DC56C0 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CAA270AD5D45C8F0C221CA8BBF0B5AF4C8 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FB520D8872660A20FFF19CA35CB7652B6C + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC5378B1F740276F0650235A073277A4BDF02 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2415F50A42C049F1D05D0444F7A518BECD5 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D308C5686B83C700736FFC56AAD74BF414B + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979785BF7CAA6FEAB725C2E79DBCB7A8DF0 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A00A7291D08B5A1E10B4A3A66CF3810F0D + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB928FD12750FFFA71BFE00A63485BD38C3 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF6273E4F4B57CD22B8E628AD5FF8867F063 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D6280FBB60B39CF908C90D0330DD70D4B + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B5D37D0150AD45B3C785B52FBE1D3FB6E9 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E4209D2AF0F7766B219C3BEAAB77008ECC90C + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C1C5F0EBE4787E41657803A98538AEBE + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E2DEC2E97E291E0F1A40A55B71F190AEA + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA899FAE83E954E7E2022B7773589340791F + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06D8C3AF19ACD89C26287F543B791D361F3 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D8B12D459014153EDB73725C7E9F76F69F + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A882666920E0D5F01DDF5009DFB5C59CC4 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B5AE9A1CF67977B23F203AC1AC1E82CA + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B84613335B53083F2E276CD28EF91BF4170B839 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B2633BB7A73A47702EE729EB0DD21938B + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EAC4C1B42A0F3E1F6444A7B62E14486A6F + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEB989F9C37B7F1DE28960D35AA0E800FE7 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD45422D9BB0B2ED3D272F8941652CED13AA + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D22A6CBCAEB8B35ECADDEF04E2FFA6F275 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247ACDE956B4162FBA32E5FEE457C095054F + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E97433F61D801943691694F27F80F8FE42 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E3FC2956D5083A3B4AAD1FD53E2FBB662 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB61A469F4F750737FFC23E63347FF0E4DAB + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B19089662143015F78C281B4AA07969E71278E3B1 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0A9E6CAB3B53CBA44EAA84E110E9B61FEF + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D3176B926CF579F8CB3954741FE9F6EFB94D + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344A5E28D81A0E1F86B240EBDFE0CF6999A + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA679038BA2E902A6722D113C69DE2B3487E + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB1F4297ADB5C00EAD2A16FB1CDDCED187D + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9C3F312019C7B327487AB5EDF100AE1DC + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F3FA3CF7153166161EAFF747BB78E4E70 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A616059539BAA49DC51FAFA23171690A + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E041CFB0C0AF0C366970B564B311B3F9DF + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A833C37D80AC498927DDE9034E82E08E32 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE2300EA0EBC4922C1F9F342A96E775D75 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F241728CF8FEF310AAC4C491CC266F56C0 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88C2AF0A0F687415361AFD6682D30D2B88 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557C5A4E309CC608A25B069283948B24EC4 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E42090169CFEDE75020E502F8D745C0F619D727 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3D26CD4BDFF942C1AD11D75FA363576F5 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E334D0E15EE39D74A0660F5A0B354E0ABD6 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7EDB5724F83F1339C7C04314CA91F2C67 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA18F70EE43382F0F2BC7B01F48F1258321 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86DF1D57EFE23F047ABD3B7F6865DD7668C + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A85425C3883476D6AECC3035335EBFC57B83 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B455A2875D51E75D57A63868E04E5066AA + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B84613362DB6A7EDFA217DE1FE1A00742A4D7C66E + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B00F0D48D63410EFCB4024D13DCDF17DD20 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D0D44F81C54EDB0050BA7143DF8F6ED7E + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4E22633F14D0E5E118D3FD2D0B43F8838 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD4552B208A719B8AD0603755B7C73AED17CA4 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D276560509A7C6B3BC118B293B3006AA001F + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA3BD699260AA14FCDA0CEE920BEA26B286 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9087AA9D223581F56528C10489B2E2BE946 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40CB341E8ACAA1DF9EDCE2C596DFB6DB2D + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB6102D84008A82B703B4CE36D17A374F0B377 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B1908966255D6E6E80BFBA72C216CA44C10EE7071FD + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDF9E37FD4674F570332F8CBFA1FD355F1 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D3171729AD0A928B39AA0962EBEE896F23DFB1 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344ABD3AA221599929474930572AFBFFE3039 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA67763BEAE560481914AD60EE338342C081C1 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB173C7DF762FDFE1840F85A89C01E42BEF07 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D2F3C89D4BAE0EC969B84E064D061BC871 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9AD579353A47FC620ADABFEEB1F9BDBD35 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A644B4617810258BD02DD4B42DE1DD16B1 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FA55C7E3EF05E7D9728CDBD962F40070E0 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A828CFF6789F2050343F1DB09C092C203A3A + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE71E61133286A3B67F76DC0A19FBF191CDB + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E5AD654F85BD9D208C8700EA731D763F3C + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7657136021B21847B10871EE8F2C4364E + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F1040DCF5FDD9F5908FDE8ADDF8C4E29DB + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901996AD3944225C594CC946C5B8DFD97BBB6 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C0BBFE22246FD5992A41B69D0B3BE52E8A + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D3477BF21084215436D44D1ED202595682 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D2DA517E1B4DCF23786C5FB16A709F9F44 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191D6F199B48F56AB7400F22BFAF367A7B2 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45C7932D4333776DD9F1EEF90F569FFE10 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A64A99FA40C5965BB45F9795009693A8E0 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454D3A1AEF00CDAEB0C0EE97CDF21515525 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627C0384382AE96794DCC50892C7CA1CB12E + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001639190A318CA3B7B13E98573173F525AB + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B723C476FF22D3D02EA5A050933409028 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF480FC11569EE441D4B3109C5B52407CD0A2 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD45521868D579956359751412BC95046DB43C7B + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763C46DF3414CA7DABB61D26A515A44BADA7 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC8EC8B2FA3773268723AD493F87CB09B + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C671F1C055C25E1E77A015558D57C5502 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A767B07EAC4731CD7BD22E224F606EC372 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB6102832713466AEEF04592581CDFD890A60DA3 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B1908966255062B723BFA84D0781AD324122347142A6A + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13D9083C51FDF0C98D3095BA282BF275E + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D317173150FF63D63BE2BCB60CC19C00C3040662 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF5C47CFC5080E4D4C086C28FECDC56AF + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771E14CC733E2485A7CCF1FD745182B4A8 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315A9DBDC9225180D4CFA62D73DAF7A2622 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25725DC24BA7ACD5BE184877622C376AF60 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54CC5B9D9F1C49B131184F3D65FCB6D926 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6771F2D3FC6807761DD899E815CFFD0D080 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA11CC170A51E3579D17329E0A6E4E64A5 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A828635D4F308F938DCC1573DD693B2462F1F0 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184C07BB265972A6FFD26F8720E29A16555 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568F0CCA24DDC07CBE1C7E6E1F29C2D578C + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE0A83DB4B4597BC02E1B31CFECE335D3E + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F4B6C85126EFBCA5741CF4655F7BAE93E + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AFC3EA9498BB8A504E60D5E586B8D63A2 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00C07A179D0DE3BAB8D4DC5A70A889217AA + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389CE4A26604D86235FCA78B53C1AA48010 + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D232A586939C0B58B0E5EA5F194D313D0040 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C5D165E6532CF0C4F6EBF1D94E2674B314 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D4571BB0B3A7A2AB4FE68BC7FCDF07ECBD267 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61E3F5680A0B950DACFBCC06AA99094F4EA + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454212C190FDF96870A2C3F871959BB68FC1F + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB3ADE236785CBE99CF09C6133E05F9AF57 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B0016492AE0F277B8261E1FB3BDAC45B7EF492E + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53277CB77F5A737D1683B4B41AC99738BA + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802BBC1F6BBCC8C6B5FB7BC5FAAA89A10D9D + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD45521863CDA4E8C619769BC5A61D21E7D6A44886 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFAD2482B4F51571CCF116A8A281BB741DD + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC4414B9620F8F16F01881ABFCF7940F066 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0A4D4EBDBC0BEBFF877090C201B3C5FC05 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A703AB19CE2B4AB27724C26C9BE762BD4A28 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D48AA857C5757C02173AF15FE31319153D + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FDEC05786C2FDDEF37CB457F4D201492C2 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13B9AA364FA993E1626B3AE6C67618BF1ED + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DD61F7D48912F89FAF539CF81E677F9B9 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF33A0124A003EBA4FBCB6E1CC4B5886FD4 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771D8CA76997AFD365F41DE7EDF071DBDCBB + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FF3D1C7D41426FF7B26907B088A29D6646 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745040888C1B211284DA55D64629ADB4E5D + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9DF2F14CF30E1A2772955D3BE1FB558F0 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BB5EEF65473675A9DD1ECEF089B09007A + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9D123205DDB901382CB8C5CD7520796D48 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A828630336BED6E2895A65B29FFDC1ACE43BFCDE + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D50BC0FCF46149BF6CB5FDB04CC2CFC309 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8A778DB00B6BA0D0FA00DF20508995ACC + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3F39E456580529DAE5737DF976F56C192B + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6FEA150D0B0EDBBA3117C7FA1D0A414340 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED8665BC736A87FA9FD95D77692ADA5339 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF27DC6D45C877F7E678F88CD3799DF5E81 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389364B1D5134DE1651900ED690BDC40EEE7A + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264E11DDDBCB7036DF24C6F67153AF0D6E4 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59BE23A5A17CC83D03D02BB9E2C0FDBDDD7 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F38CBD2841C8514C2A3104A69445A1897 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED9D6665C7BED65D3D5086DB1BC1FCDE8D7 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214BDD6833AA1260DC5E70648DAEC6EDE16E + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D50128ADA7929740878CCD4125140DE3A + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BA96F4158F15D9CF78003B46B21DD38B38 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B5358D52409938A275270F0BA2D217B82DE16 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B730CEF2C6AB3CE371857AC2A04162C229C + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBCFEB6894A8C13D20A730F6D45087E1E + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CF5001409547AD66825A261C5DA3F4475 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E433463B15A9C3CF8433797FF3317C4A3 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD07D46A28ACCEC2AD502D8D5623FF0D3C8 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A703862E09F0CD5A8D355E56C2B32CB7488E4A + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41AE39B5955C68BE5A22165ADEEAC8C529D + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4B512EDB6BD12C3BA707BA332361300D35 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA73670CBF80BDB19DBDB132216897596BA + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC460319A0E89184322CFC49E8608D169B6 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38287762CF0460C64ED3B83889BE059DDBF + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA2A77473E4E8E5A877BA78CFED837FBCA + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD011168793E048FD049C6405D4468DFF4B + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D257457617A377A0BEF5CEB1DD4256B9E0A47394 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7413F06B127D09559297026AE50A9E863 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE5B86E8A92C250B9F13215787ACF008D8 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB56E62C531B91869BFD70982E1EE0F138E + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A8286303844646C79CF012FECCCBDD5AC3B1BCBCA5 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D575CF3D9B130E2A0D1A57EA5628197F1C10 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C2A732BC8808A5F81F74739690CDDC29D7 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF0A742D34FDC22D7E48DF1FEE2E9AF71BE + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F771D665C550E4C1AD5149F4184B4898329 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1FB7A5A333425F34277CFF011929FFEEB0 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A957945D297FED84D13B14F5C9A7327E17 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366DB711E81C345BD55F5C005FD4FDF4D330 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D2326474000FFA664E13D03F877AB277F1B6CEB7 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B75BDB6FDDDDB20B82A45CB1F229E1F7C2D + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72A4F19D9DDEDE2B96FB4670CBBA396AD8 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED9910D30523DEAE6E29E062DC1F2CA93390E + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B86BF18C3B153467A377BD31CBC50EAE46F + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08C36A99601F4FCB1FEA61BD9CF2E92773 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABAF9E27D83590AA4FC09E1817321AD161F + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B5358294B3553524846EE94FD7494599A70190A + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FD1AD1A9575E52A9BDBC791ACA90A956C + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB9E3B456AF2B92A48F0E05594CB8F4BDD + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB9343EC01275DE864CB28F4B8328BF0902 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B8DBF5CCBF6F7F5917AEE20B60E4C8126 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C15CA4DC531CD904478ABFB76B527ACCF + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E70941EE21809DF01629DFEF710916C802 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1607D6B15E447C114247273A987A826850 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBBE3459EE05CF2299D82781EE69EA8DF33 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74D610B9AE1A0C5C6EE52544E5EF1A3E13A + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E27E5DC4010526DC61BD77E4D60D4838DC + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298271A90ABA3697CDE45323A76EAA9EDD4 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02A2CEA9C744D58E31C9B7C404D9F165D4 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05EE3D454C28C146559DA149DA53689AEBD + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F1C8F448C5531D2D93403BE449D018AED + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F67DF4DD2DBE462111A0382D26D9829B73 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB70B1E727C4FB631F3B4733620CEDD37 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB5552199683ACC403BE4374E74E0650B1468 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494B17A2B0898BBEAE343DE302DDC6A5B6B + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515BC40C7ABD680D427BE9E52BD01F94972 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2DED859316FC1684B743590EB62DB34E + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02B32554D503F122A2FD696F6D7F5900830 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5BD6BCDDA9F3B7E31FCE087C0F0CAA7AF + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4EAB32E75D27A7B27647C82FF97D5BC1D2 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E81C3BBADAD4B4B2043233FF7828928D2B + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D6013F0453DCF8AD527D35500B55C3B1CD8 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DC743D48CB267A5D73FD4576E57415B32 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750CC45F52878671A344176D0F7D88D47BBA + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDF4AA3764A81E68E0EB49A0EBFF679F07 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B68C97839C0E2548FB36106CF6F4CFCDE3 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861EF533FF6E140CF85E777A65427CF01C26 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D09A4AD7E7B7296508BE1067A09F38264C + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0037BEF6CFC44E65227904FAA8D2F5A3D6 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915726347DCBA4209C632D7FBCB3043B48B + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1172E0A03EE1E18D58AB63FC9AB00D6FD + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB13DBF3F8D250053D6284227E998B1B6FFF + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99BE556BE5E321247C328A1788AB4423708 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B488A4C31ABF390F1F73DB59EE385FC68FC + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24969B8E06D6D563B1D66747C7228CCEE9 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBF0261FFBF96433FAB827ABC23A3E9A1B + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685439BDD9868F672F6F698AC67A74EC97C + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB485523EBAC2D75663EDC45626881C86423 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBF3227B9F5E199D98347241FD250CE3704 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4621231CE502906BEF1B3BB712FD89DB9 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BE8627612295370D112C22A2EA280326C9 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F7F125B54A74522650EB7BD95E67282937 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96EAE7947E74B34CEBEEFC8482E670741D + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E759BF8285F5049E0D4FF370F19137599 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A2012E4B574FED2FAF209EB67DDFF7483 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9A3C87CC193BAB79E2AB3DDB2464E2C95 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF46624CA2818DF23BE61B145406AB07BF + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DF9DEA8150AA01B466582EA9E8A3E588A3 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D90C335F099FF4968EE5A945C373346A6C + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C21B8F6EC60AAB19B6FFE861DDA06CB2C02 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB8D01D4D93BE0A95B04BBFC1E4433E5794 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C1287D1B7CB72ABDF6EDFB01571C7FE094 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E7906FB787AC86F3EA560F8C613C93545CF + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4DDC81517E99611FCE2C3A0DE68096953 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F6C5338E81EF71B49EAA51BC68739EF93A + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF4966C086F38E4CA3CF5E53A345BF412DE + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C2837D2CCBEE7654F866EB35770BF426CD5 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBB703B692FEB4267D275B5AF43DAF0E837 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6454169993341B14CCCE8F3AB011DAB2ECA + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E8447A952E4FACF2F7BB5ED3FA3419A9E27 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07FE9241DE731EECF2E02DE35044D5E81BF + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA000020151B40077776C50E9A7415DA18BD24 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B535829152259D3583D80BFA90513399C587667ACCD + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA16595B2AEDD56B813CF1F988C529DC52BD5 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130CDE732D6F88420CAE001A4B9E9B1F400F + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B648C47C4BCAB45090ECDA251EF92224A04 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B4847AACE82AE1DFCE7697921D4FAEF53BE8C + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C2427ECB5BEA0F34E3F61BA712BCDC7E2BA02 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2E61D0E7C5C3E72D1ECEB5A5AF945B971 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A16855294752BC3623417BCAA7A3DB1B136C384 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A76C4D19D26065E80B6DC3417529AA77FD + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC71C7EECAE04B0D692F3396A1DC31EFCC7 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4942EA964B0EA7C689BA2C26095C5C5FA7C + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB042B6DA6FBBB2ED7C5019A5CB46F16E8A + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79EF3149A7A960747FEB1ED506027619EA8 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE626C7670966560B7CA848E112EF52893 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E884AFE3BC791FD99C6C68FF1706D2E0373 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00442B6BAFDABBD6A796A490363904279E + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D0C21F48A21B18847B91EF677961C69ADE + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF432405B9F8F7B41CDDE9ADDD8D5FB1802C + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA173A8215BB6A5E85306E6139079A01BD4 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B43F4E8325D263C055FC1AEB69F6401611 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C21635FF210F079AD95380D3E886E3995C2B5 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83B77D0ED07EFFE3C47B73E6BE12A6FD576 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B65841E6774B5C92E0608CE4545AD36EC + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E7991B2A769183AD3200986969C6C2A876362 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D485029559823E056F8D5C8F76C939CCF751 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F60396335695FE559929C6135C28509EBECD + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF4456BF69972F5115CA1A408B186BD9FEA14 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289BDFE1D610DCDD4EA54A2658684AFDCE34 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA9724DEBE1CB2E87BA7FB012ABED391BF1 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B64502354CE3ED80DFAB07C295CD4FE7497E6D + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3DD544032DD79D84A5D7B8AC6BF6BCF20 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8A1DE9158ECC96E7942CC26C1D620A44B2 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AFAC3D83B37A770B5F6616F0F28C4E93E0 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B5358291522861A7476C20059DABA7CF71A6F35DAC508 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654B277C5EE5214A03EACAC3553C44475A7C + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3CBC31F7A8F136FA62A3597C3525A6B559 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473FC97AB6716A3095773396936D96FB837 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B4847141590017A6F9A0F98079B00BD71E4E1FB + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278CFD70497A09EC2A38BD1595D0A9639298 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF791FDD370E07D53B69680728F4E6849D + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B857CEB81064E73F01DC3484DD94D56FD + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A77543D2D8EC2D6075E283E54C995D74815C + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E71CDF8469AB650A9B2F00A7DDB10BC73B + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940E156A713FFCB09197AFE16A11DE18B40C + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D726E0B5BEA883F469214E80AAB5E94D13 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E518BC46B58FC7336B92944FD7C2BDEBD0F + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4BE98C2D4D9CA085BD235AF9538DA49C05 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882C8C8C7A9284812839A937287054EE0173 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A02D75ED8983D344B207A91B9403E74F4B + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02BE3EBE226D74977EB8CC3A1F0B902783E + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339434226830999386DDD725C655516660F + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA13484EBF33B8AB7570E95F52DAA43D4C830 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B13F1CE26C9E75D14E83B2D477889190A8 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B50B8498FDA031930557650FA216A816E0 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDCC7A37B62D8DB5AA62C0619DD5F914382 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F435B013A271D5172D2C6E34B06822A4C + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183D729B71849ABD248EAA594087DF24359 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855CA2D99DC4433C0C87E259F71F072B375A + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A96E42964A3F3203B8931E7A9C672FF467 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D06523455C134815D4AD816B6AEBADE284 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B9D976587FCD4136C196B3EE2171806D8 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA9163723FDF766BA7EAD01A610E5AE7D895C + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226043D7DFBCBFA5219986180A7826BEF41 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F384A9AF819DEDCD82A2DAB981D339925CAC + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACDC8A7E97E0AA9CE9946E21866E674A648 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF575B434BBC1819434032FBD4E83704040D + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B535829152286025BBBF9AAFE91D859D301AB00C670640C + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE172AF9826BADFEEEA64CDD61A77D715AE + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C670F82AB3A3D554788D8A3BC4427D632A1 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD5BFA8B372CA380D4087970BB555CFC7E + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435B751D506C0AEF4EFF7B775A4D113F472 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C95D2A6C5E4B976B41C83D913229D31600A + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF618E2AF65E29309FE88FBB0421098E1255 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B320DF93EBD21B23B0A74B8C9F03AFA680C + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A77514751486AA75C72DF8214D3B02D27D80A4 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7823DCC0FDD473750D9627B5AA82F836F2C + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE31446B187DDF97DD1B1B7C2026EFF4987 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7615039A67AC339541C55A6FAD3BF3C9E71 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B5DA9189111DB332BB67C18F1336C214C + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B713674D0FB7D278995FC72A48BE79FA651 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8FAFC5213A17DDB2E6C4B61098A9FE46D + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00E724D6891751087C8E523665484999CF0 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E6FFAB730EE17A104C3CD3D9DB9F64D5E + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BFDF623CE5CBF23677788A5D06D596AEF1 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C1783F68E09EFC511068B91872A0B3D523 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E45A696C01ABFA186482954D354124391C + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F7859CEE6DAB68505A2B8A35C54EE7DFA + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC925982F942090C8743C2FA63633FF615E3 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F50C4080E7826006226E032C51E75DBBE53 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF525C2E9A13425016ED1A3E619BE140CE + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C24ECD759322633CDED5920C7EA6FFE825F + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE2C869B9A3A6B8158D69132904059582D + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049A242AAC1EA88ECDDCB83711909443B27 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7DDE77A0E4C85654C68B02895A7C20E22D + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614ACFAF69C187898C2CF1CF185188B6C85 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5388BC48A2FEC39CACA19DB26553672A9 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F384268673D5B23FE78B2012C0476367D5C681 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD055F6275FBA2A5F6804B2D18E1C0353991 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0EF0D991525B25F0617436EA9E4C40414 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BAD93D5BC70E835B51D4E717CDAEBBFFC8 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DBB0B03D2DDBB0282BA22ED47BC7D5BA8D + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1E42A1F79A2258B98F1C32E0BAADDE5BB + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23AE1A739C3CBF95B2F808A2ABBFB9652A + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D2462FD5B5210CEABDBB6CD42A21973D6D + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C95396C7C4FBD9E56E460920ED42460286273 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF61D601FC8D935AE115FC68FA809EA1919000 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B325503A5BA3F6B50C8A57F2035807BDB2E7C + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A775141E8882CC4D961AFD82C912086FEDA9949C + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7827797CEB2064A4B1F564C24A1CAFA13CC43 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE362BEF959711B240C3BC7E52C60AD791669 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7611ADEE07BA96159FE1A8F8371F35F52FE7B + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B9081AEEAD33C68AF7C6DE6C666CB289DE7 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B71D20FC28320D318C4D71C4976F96FD702E5 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8D6998603DDE922955CCB76D8725C2A2CAA + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00ED4499479CC1001F8341116AF9B24F7BEFE + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E20565DFFBE6544DA845804A8226104DE97 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BF5601EDC543B6A92EFCBCEB8F0C9EF9BF0F + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C1887884049A9AB0D8494AEBA8774CFF008C + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E42A9D43B5C6CDA79A6A339824CB04987E35 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F186A9822EA6C684361A395381A5E0BABDC + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC9270712B41E8B77D57C4F114AE43E2E8EBA4 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F5071B9358EA104014C4CBE6D2CA19AC5B093 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF47AEE72E57C659F3C43FF6E8BE0A243BE3 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C242BFC55AAD3EF3C5C00DC74A863A4E0DD28 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE037533D8925587278CC5889B95D2D961B9 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049BE21227510F979C4EDACB5E171055D9E22 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7D9F5D9713031EA86095DB2680989F4A7DC5 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614508B32298E2C5067AC946C0177B6531346 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5DF82E4819FEC617BE12785CC9912A737C0 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3842627D1672771DDAD37804BDA50047078EF8D + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD05355BAE4472689D5A3E25F96806CDC128B5 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0A16DC3A871B0C9156386A2DFBFE949454B + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BA6C8D90F610D6B809C130BDC6A58F4C1705 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DB67AC2FC2C5775D4892733E716E9C3476DB + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1D1D7692B93FFD21A5B09E836DE2ED82342 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23FA90E8801038161C888FCCC61093ED97A6 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D21AC86405D8633B765DBA54CCFAEFC61D35 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C953900708D73678561D58F000B2947246B9520 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF61D6F4E46AE3E4E09C9086B8C0A1104674F7AB + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B32555045A364085E5A7F9862C1360E0D1F5DCA + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A775141EED0A6E55536B55EE14E1CB0196756CD8EC + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7827786532AD1FDDFA552420E08917678E53782 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE362E5EA5BCBF7C268164041E925D916E69775 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7611A97E551CDDD5F8B13A65518F50CBA31970B + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B90EDA50007834FFADEF42B3EF8C93FEF71A3 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B71D2413395545AAF23E2007276B2A690448759 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8D62AF57A18DE0800CC731FE304B6FD925626 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00ED4EED52F7447E3DFFD19163A00B513B14C9F + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E20579595A3F38CBBD4F88EB7B967DD555BE1 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BF56C32EDD79AF4098E217C976389DFFCE7190 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C18826640D8A06E581BD20620F8219A2A7B1DA + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E42A067198E9F827C33E4B4192BA44A14748E9 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F18FDBC34980E8700FDD27925921F631E33FB + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC92708589EA0C1FA6EEFDCA2E628C91A4B7E2E8 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F5071C5A3046695D23283B89E72FA1079604955 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF4712B70ABA9ABFFCDF6212A43531BFDD71F0 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C242BEA73A61A037F447346B0591A3B5A79535B + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE0353CF315A892C002CFC48B9A5E96E1D5FB7 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049BE141486845D00714E0EC920905B9B8AEE7F + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7D9F85F731EAD083C51C1F3D4B702E0C5CEB8A + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614501AC3E77839E574FA9D7ADD25FE6F70516A + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5DF36483C8C62E4347AB8939EF91DBB47E29C + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3842627AA9462AA1CC949204E5C7BB565D47D8238 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD05359897E281CE65904E940FDEB9F1472FBB92 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0A11E96BA966040A7E04E6F7E0D014F3C6515 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BA6CD795773895DBA3FCF4EA8836A21DB04B6A + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DB67556C2D873888A7E654223E927F6A064F6B + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1D148320CFD07E8103AFBF1B436434AF15E69 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23FA74FC53C7842DD67EBF7F5A443257C81C1F + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D21A4BA37315F5521B7B0FE1C20AC216D2496A + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C953900F7A1D2BD913C2BF7824695CBB21E3EF7DC + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF61D6F4AF017EE2449038D2610DA50AF512955078 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B325550C2888702703F9E8ECF28D727BC5CAC20E6 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A775141EED5275E9D0A99AF622B0526FC1C079077DB6 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7827786B1482B7778D63F6768E60E6B6AC078FD9C + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE362E51471602E2F397FDDBE404542D16EBD7CDC + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7611A97883E9CEC7D2C7D8378EC22088CFFCFC8BC + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B90ED13545E44452CAA6A070AAC5555BDFA0CF8 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B71D241C5B74453EB6C5DE69604A0FF8E94E84EF0 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8D62A42D36D260AFEAF3363B5523F4A561A807F + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00ED4EE6522FE27C32893043B5625C4C50EA5D1A2 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E20571DEE4659265D61E8499B053C90591BAA58 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BF56C3363C453C854963114871C7DAEBD139BBB3 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C188268814511C0D1148B0E07D256E713DA67EBA + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E42A0623FD2B905CBC170833D50D2BFE8436CCFA + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F18FD2275FAE299B8B2FB5A970C5676E97231D8 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC927085C743CC8D3A1373B77AD91804DA26A402BD + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F5071C52EDF2ED1A8F42AA9F370C5F611C6C06ABD + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF4712DA93DDD7B5EC28FBC7C6242F91051821D9 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C242BEA3B8D49DCF1A6366E314C708FD8E6B3FF7E + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE0353A13E4C3A6A221B3720A212A3B866913799 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049BE14381BC299EA05B4481E46065AC182BCF60A + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7D9F8518872CA509FA76E955035282C573242703 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614501AAB8689803462E0E58580F489F6C529D372 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5DF36AEB64B827270A0EAD105008A45A24A37A9 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3842627AA144AF2F85781552EE93145BA01E4020A8F + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD053598B421E5F2028E64B6FA907D7A37511E4058 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0A11E9124031834372432CE6A693F6DB0E253AF + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BA6CD7135CD10023C52AFE239ECE78413AD7E46E + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DB67555B95DB6B4F84D1CC19F8BE142A7F2E012D + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1D148F4679B4FE8601AAA76BD9FA6793F657F94 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23FA74D3649987D35E8D373132D084182269125E + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D21A4BD75AB86AC0105848948354F920D474E05B + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C953900F7CBD0E7C86B2775ED893740A041479D898A + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF61D6F4AF86B4487791EF985543FC62B920A32D5891 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B325550C2BE70390D9190010FB275462464A8019DC3 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A775141EED528FF293F9C0A63D6421C98DA23005D88BD6 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7827786B1B7738593C3A2AF4E1318875B4A27481931 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE362E5144C8C0B7BCDFA0EC8CD6B9B6C5D6B66DC15 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7611A978858CA5ED9D238262E040EF42B94DB0F4566 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B90ED13983522822A1952C6C3795A333F0657FA20 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B71D241C58DAAC585C9456E0CD88651336C8849A4E0 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8D62A42E99900AF901916D83026474F09498B432B + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00ED4EE657DE8EF08E606341F586F28328495A61CB0 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E20571DB566B98DA2E04702B9C488C0316972455E + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BF56C3369A28A6312468EFCA8EF66EADC2D7282642 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C1882688CC6A69405D54A0F504BF0F1E3A4031A4A5 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E42A062323545D18A06584DE289E1303614434BB7C + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F18FD2227D451072FF5A2664719C2E55D8F74EF78 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC927085C77C069B4A612BFFE1D53FCFCBAA64D12D42 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F5071C52EE183B4AA9658B50D79633B72E7013FC784 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF4712DA18DFDEEFAE2CCFBE3C1B17D982B41EDA36 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C242BEA3B793C6DDA5F3D154D1AF8468AF02A1F125D + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE0353A10710C69F6344BC51D01B7142891B4591F8 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049BE143855E305DBDC910636DF8DB92C255428AE9F + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7D9F8518542F96982B89CA97B88DEB9E306B08C9E8 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614501AAB1CFFE88BFB9D03018F51D37B4F4A6061B6 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5DF36AE5E99DD0D4202535D3BEE2ED815DCE93E1E + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3842627AA1474FA5ECA07BCC05472D6EC3BF2F62CAB25 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD053598B4ABA8688E402E38277AAF976C124F35FB72 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0A11E91720DE4DC24D92F10B549951AD9BEB0F561 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BA6CD713EDE91AD1CC5CE85D46A8A3D078E9617218 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DB67555BF78B5D6BC65AD704F0779FEFF0F47040C1 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1D148F43F8DE7699CF5DF4129F1CE5EA11139962A + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23FA74D335D2D50641463E02E1FD1E7BAB4FBFDBE9 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D21A4BD7EBB598412D1A117589F8606294035B855D + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C953900F7CB3971F76F659F3999021F4AE7E1F3E3D7AC + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 35D7CEAD7DB14E4816787F46E9FB0E7F373E40A70386E7EBB2FF61D6F4AF86E9D34460C99B9E65BA9DBEAC265AC16889 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = A725E931A0E1C4F45A84F2B7556B2B87BB610283D41A1685526B325550C2BED6FBC22069E6D80CCF175DEED1F56F0139 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 4426F96A072FA511D99063C6752B190896625506FD4BBB48A775141EED528F708B264324881CB8B45FC0F41D102116F2 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = B15378691AB46AC08404F4CD31EA3FE3FE0ADDE13BA74DBFC7E7827786B1B75630A2B38ABEFC851DE40C43CF316BEE42 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = B1B971ECE73E528CA0343B1E3910BFC4D31717318DC4E2C4940EE362E5144C04406FB1DC65ADE66562489C257796205F + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 36E0B2DB67E79F267E4943DD473D45D28344AB5AF38298BEB0D7611A978858D4655AD6E351DBED0BB4D51294F6C340AF + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 28D1565CED2D7E1B3866A9D58CEF1637CA6776771DBA02F79E512B90ED1398329C634BE68F9E1816431D11B2EFD5A0C5 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 5A8DBE79CDF0A31891E65A604FB00D94FBB17315FFD05E96BE4B71D241C58D1FC2DBB15BAFDBACD4E79A75BDD488711E + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = D60875BC195DDE295361AF0C74A70EC537A9D25745767F2E882CE8D62A42E9A23D30371A3FAD07DE79010463B0311B54 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 64BB3CDA2ACC9DFF77E136EC480E4BF2418F9A54B9D7F69A00A00ED4EE657DECFFD493E2619535BC92345A9FAC1C61FA + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = CA1261316A9FCF24B26BD1FB2CF8F43D3071A6774BEE9DB9D02B5E20571DB56ACB882128019691C8A27C4C22307D7882 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = DF24A5AF535A10459F0FB4B13C3B07C979E0FAEA9DB555DF4339BF56C3369A105689CC8EBE018DC080BB7C30B9C910DC + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 7C053A5598BE0F1461BE5C3D7B9EA499A0A82863038494DFA134C1882688CCBE04483866F45FAB87E21FABB1DA7AA6AD + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = D82115EDF54811FC5B2501C21EF09C2CB9FE7184D57515D9B4B1E42A0623238CC5EA1557A019882B5111558C9A65F303 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 25D49F74D530C8657B6E67FAF68D78BF62F2E568C8C22C2163B57F18FD22271C85920F395DDC10181DC7B27F4AE9E3FE + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = D2ACC02E8C890319A395A786FAA564C24D88F7FE3FF02BB83BDC927085C77CFDA4BC593D2EDFF5A25644362D4B29E89F + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 834287945F8B85B2BD01E4501A89C9A3B557F17F6F77C5C15B6F5071C52EE1C8BF4B74743A84F97570159901804467D1 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 71C2F52B0D2D22FD6361252999CA8E420901998AED1F4E799183FF4712DA186D8B64187ED772D23C30A247E25885D1A7 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3602D400B36527FA6FF4571A328326C3A7C3C00CF2A9E8D4855C242BEA3B793131082B9C813D41EDF1458775B276568F + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10397F03E5EE58663A4FA1734F328CC72E33D389366D60F603A9DE0353A10797EF26B3F639B05A4D890419AD95077999 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DA68CBAF9861AF20C22EF5D7790813AA89B7D23264748DF445D049BE143855C5A6BE4E3C6D889706DE7734CB5F2F2802 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CEE9C14898596B7989402F88DB9147E06DA191C59B750C289B5B7D9F851854B02770092F25F2508AE2766879E26E3D6C + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C679FEBD0374A93955EB199FA8520EF6D86D45711F72BDBBA91614501AAB1C80D325631EC2DC94B2124F2BF12824E3D0 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F098972D35C3E57033E18CF8B978A711A854A61ED991B6450226C5DF36AE5E507BD48B571538A7FBE7CB93565184B622 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4989F21A51BA8D6624BEB66854826B903B454214B861E84F3842627AA1474B77EE5597812A7035E7E9BD7DB6B198E67 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5DA22F38625784A09A70A5C6E58B846133627CB30D08D07F8ACD053598B4AB036B72A04B3657E1BCF4DF2BBF0BCC8AE1 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 364BE352311ECD0CCFC1A4C891823F2A2B001649BABA0000AF57D0A11E91728DC9F227EA012535A4820E5F9F2BE6F10E + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 44F7B2739F09F1EA67A9C43F5A7B3CF5EA9D6B53582915228602BA6CD713ED0CC60762D917BBD7C5C1B8D03922F8D226 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FBAEDA08A45B8830406CFF4C989F5A0AEBF4802B736FA1654BE1DB67555BF7ABF2FB4E3720402BF4A59A438025455A15 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A4D9F1F0DE9219098D817884852185CD455218630DBB130C3C67E1D148F43FB2BD8AE812BDE022539303BB374F311D7C + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64CA0AF494AA5B1FB9C12E65D48BA2E5D2763CFA6CB99B6473CD23FA74D33572C612A81860327DBAE215B83F75C3A824 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 427FC43D2F12E0099F5323297A255D247AA38FC42E4B48471435D21A4BD7EBCEE7CDB234E2E45347B47BE3E90975C2CD + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8156BE5107696054B469FBB479A0FC46E9085C0AD01C24278C953900F7CB39717C224D92EF5A1F60421CFA077A764C69 + diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.c b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/api.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/encrypt.c b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/encrypt.c new file mode 100644 index 0000000..db50784 --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "hyena.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return hyena_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return hyena_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.c b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.c new file mode 100644 index 0000000..db5ba2b --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.c @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "hyena.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const hyena_cipher = { + "HYENA", + HYENA_KEY_SIZE, + HYENA_NONCE_SIZE, + HYENA_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + hyena_aead_encrypt, + hyena_aead_decrypt +}; + +/** + * \brief Doubles a delta value in the F(2^64) field. + * + * \param D The delta value to be doubled. + * + * D = D << 1 if the top-most bit is 0, or D = (D << 1) ^ 0x1B otherwise. + */ +static void hyena_double_delta(unsigned char D[8]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)(D[0])) >> 7); + for (index = 0; index < 7; ++index) + D[index] = (D[index] << 1) | (D[index + 1] >> 7); + D[7] = (D[7] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Triples a delta value in the F(2^64) field. + * + * \param D The delta value to be tripled. + * + * D' = D ^ (D << 1) if the top-most bit is 0, or D' = D ^ (D << 1) ^ 0x1B + * otherwise. + */ +static void hyena_triple_delta(unsigned char D[8]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)(D[0])) >> 7); + for (index = 0; index < 7; ++index) + D[index] ^= (D[index] << 1) | (D[index + 1] >> 7); + D[7] ^= (D[7] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Process the associated data for HYENA. + * + * \param ks Key schedule for the GIFT-128 cipher. + * \param Y Internal hash state of HYENA. + * \param D Internal hash state of HYENA. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void hyena_process_ad + (const gift128n_key_schedule_t *ks, unsigned char Y[16], + unsigned char D[8], const unsigned char *ad, + unsigned long long adlen) +{ + unsigned char feedback[16]; + while (adlen > 16) { + hyena_double_delta(D); + memcpy(feedback, ad, 16); + lw_xor_block(feedback + 8, Y + 8, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + gift128n_encrypt(ks, Y, Y); + ad += 16; + adlen -= 16; + } + if (adlen == 16) { + hyena_triple_delta(D); + memcpy(feedback, ad, 16); + lw_xor_block(feedback + 8, Y + 8, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + } else { + unsigned temp = (unsigned)adlen; + hyena_triple_delta(D); + hyena_triple_delta(D); + memcpy(feedback, ad, temp); + feedback[temp] = 0x01; + memset(feedback + temp + 1, 0, 15 - temp); + if (temp > 8) + lw_xor_block(feedback + 8, Y + 8, temp - 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + } +} + +int hyena_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift128n_key_schedule_t ks; + unsigned char Y[16]; + unsigned char D[8]; + unsigned char feedback[16]; + unsigned index; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + HYENA_TAG_SIZE; + + /* Set up the key schedule and use it to encrypt the nonce */ + gift128n_init(&ks, k); + Y[0] = 0; + if (adlen == 0) + Y[0] |= 0x01; + if (adlen == 0 && mlen == 0) + Y[0] |= 0x02; + Y[1] = 0; + Y[2] = 0; + Y[3] = 0; + memcpy(Y + 4, npub, HYENA_NONCE_SIZE); + gift128n_encrypt(&ks, Y, Y); + memcpy(D, Y + 8, 8); + + /* Process the associated data */ + hyena_process_ad(&ks, Y, D, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > 16) { + gift128n_encrypt(&ks, Y, Y); + hyena_double_delta(D); + memcpy(feedback, m, 16); + lw_xor_block(feedback + 8, Y + 8, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block_2_src(c, m, Y, 16); + lw_xor_block(Y, feedback, 16); + c += 16; + m += 16; + mlen -= 16; + } + gift128n_encrypt(&ks, Y, Y); + if (mlen == 16) { + hyena_triple_delta(D); + memcpy(feedback, m, 16); + lw_xor_block(feedback + 8, Y + 8, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block_2_src(c, m, Y, 16); + lw_xor_block(Y, feedback, 16); + c += 16; + } else { + unsigned temp = (unsigned)mlen; + hyena_triple_delta(D); + hyena_triple_delta(D); + memcpy(feedback, m, temp); + feedback[temp] = 0x01; + memset(feedback + temp + 1, 0, 15 - temp); + if (temp > 8) + lw_xor_block(feedback + 8, Y + 8, temp - 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block_2_src(c, m, Y, temp); + lw_xor_block(Y, feedback, 16); + c += temp; + } + } + + /* Swap the two halves of Y and generate the authentication tag */ + for (index = 0; index < 8; ++index) { + unsigned char temp1 = Y[index]; + unsigned char temp2 = Y[index + 8]; + Y[index] = temp2; + Y[index + 8] = temp1; + } + gift128n_encrypt(&ks, c, Y); + return 0; +} + +int hyena_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift128n_key_schedule_t ks; + unsigned char Y[16]; + unsigned char D[8]; + unsigned char feedback[16]; + unsigned char *mtemp; + unsigned index; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < HYENA_TAG_SIZE) + return -1; + *mlen = clen - HYENA_TAG_SIZE; + + /* Set up the key schedule and use it to encrypt the nonce */ + gift128n_init(&ks, k); + Y[0] = 0; + if (adlen == 0) + Y[0] |= 0x01; + if (adlen == 0 && clen == HYENA_TAG_SIZE) + Y[0] |= 0x02; + Y[1] = 0; + Y[2] = 0; + Y[3] = 0; + memcpy(Y + 4, npub, HYENA_NONCE_SIZE); + gift128n_encrypt(&ks, Y, Y); + memcpy(D, Y + 8, 8); + + /* Process the associated data */ + hyena_process_ad(&ks, Y, D, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= HYENA_TAG_SIZE; + mtemp = m; + if (clen > 0) { + while (clen > 16) { + gift128n_encrypt(&ks, Y, Y); + hyena_double_delta(D); + memcpy(feedback + 8, c + 8, 8); + lw_xor_block_2_src(m, c, Y, 16); + memcpy(feedback, m, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + c += 16; + m += 16; + clen -= 16; + } + gift128n_encrypt(&ks, Y, Y); + if (clen == 16) { + hyena_triple_delta(D); + memcpy(feedback + 8, c + 8, 8); + lw_xor_block_2_src(m, c, Y, 16); + memcpy(feedback, m, 8); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + c += 16; + } else { + unsigned temp = (unsigned)clen; + hyena_triple_delta(D); + hyena_triple_delta(D); + if (temp > 8) { + memcpy(feedback + 8, c + 8, temp - 8); + lw_xor_block_2_src(m, c, Y, temp); + memcpy(feedback, m, 8); + } else { + lw_xor_block_2_src(m, c, Y, temp); + memcpy(feedback, m, temp); + } + feedback[temp] = 0x01; + memset(feedback + temp + 1, 0, 15 - temp); + lw_xor_block(feedback + 8, D, 8); + lw_xor_block(Y, feedback, 16); + c += temp; + } + } + + /* Swap the two halves of Y and check the authentication tag */ + for (index = 0; index < 8; ++index) { + unsigned char temp1 = Y[index]; + unsigned char temp2 = Y[index + 8]; + Y[index] = temp2; + Y[index + 8] = temp1; + } + gift128n_encrypt(&ks, Y, Y); + return aead_check_tag(mtemp, *mlen, Y, c, HYENA_TAG_SIZE); +} diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.h new file mode 100644 index 0000000..ee9bb9c --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/hyena.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_HYENA_H +#define LWCRYPTO_HYENA_H + +#include "aead-common.h" + +/** + * \file hyena.h + * \brief HYENA authenticated encryption algorithm. + * + * HYENA is an authenticated encryption algorithm that is built around the + * GIFT-128 block cipher. The algorithm has a 128-bit key, a 96-bit nonce, + * and a 128-bit authentication tag. + * + * References: https://www.isical.ac.in/~lightweight/hyena/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for HYENA. + */ +#define HYENA_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for HYENA. + */ +#define HYENA_TAG_SIZE 16 + +/** + * \brief Size of the nonce for HYENA. + */ +#define HYENA_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the HYENA cipher. + */ +extern aead_cipher_t const hyena_cipher; + +/** + * \brief Encrypts and authenticates a packet with HYENA. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa hyena_aead_decrypt() + */ +int hyena_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with HYENA. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa hyena_aead_encrypt() + */ +int hyena_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128-config.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.c b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-avr.S b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-avr.S new file mode 100644 index 0000000..2aae304 --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-avr.S @@ -0,0 +1,4712 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +302: + rcall 455f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 455f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 455f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 455f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 302b + rjmp 804f +455: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +804: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +370: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + cpse r16,r1 + rjmp 370b + rjmp 867f +522: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +867: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r19,r1 + mov r26,r1 +307: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + movw r20,r2 + movw r22,r4 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + mov r0,r8 + and r0,r22 + eor r12,r0 + mov r0,r9 + and r0,r23 + eor r13,r0 + movw r2,r14 + movw r4,r24 + movw r14,r20 + movw r24,r22 + bst r2,1 + bld r0,0 + bst r2,4 + bld r2,1 + bst r4,0 + bld r2,4 + bst r2,2 + bld r4,0 + bst r3,0 + bld r2,2 + bst r2,3 + bld r3,0 + bst r3,4 + bld r2,3 + bst r4,3 + bld r3,4 + bst r3,6 + bld r4,3 + bst r5,3 + bld r3,6 + bst r3,5 + bld r5,3 + bst r4,7 + bld r3,5 + bst r5,6 + bld r4,7 + bst r5,1 + bld r5,6 + bst r2,5 + bld r5,1 + bst r4,4 + bld r2,5 + bst r4,2 + bld r4,4 + bst r3,2 + bld r4,2 + bst r3,3 + bld r3,2 + bst r3,7 + bld r3,3 + bst r5,7 + bld r3,7 + bst r5,5 + bld r5,7 + bst r4,5 + bld r5,5 + bst r4,6 + bld r4,5 + bst r5,2 + bld r4,6 + bst r3,1 + bld r5,2 + bst r2,7 + bld r3,1 + bst r5,4 + bld r2,7 + bst r4,1 + bld r5,4 + bst r2,6 + bld r4,1 + bst r5,0 + bld r2,6 + bst r0,0 + bld r5,0 + bst r6,0 + bld r0,0 + bst r6,1 + bld r6,0 + bst r6,5 + bld r6,1 + bst r8,5 + bld r6,5 + bst r8,7 + bld r8,5 + bst r9,7 + bld r8,7 + bst r9,6 + bld r9,7 + bst r9,2 + bld r9,6 + bst r7,2 + bld r9,2 + bst r7,0 + bld r7,2 + bst r0,0 + bld r7,0 + bst r6,2 + bld r0,0 + bst r7,1 + bld r6,2 + bst r6,4 + bld r7,1 + bst r8,1 + bld r6,4 + bst r6,7 + bld r8,1 + bst r9,5 + bld r6,7 + bst r8,6 + bld r9,5 + bst r9,3 + bld r8,6 + bst r7,6 + bld r9,3 + bst r9,0 + bld r7,6 + bst r0,0 + bld r9,0 + bst r6,3 + bld r0,0 + bst r7,5 + bld r6,3 + bst r8,4 + bld r7,5 + bst r8,3 + bld r8,4 + bst r7,7 + bld r8,3 + bst r9,4 + bld r7,7 + bst r8,2 + bld r9,4 + bst r7,3 + bld r8,2 + bst r7,4 + bld r7,3 + bst r8,0 + bld r7,4 + bst r0,0 + bld r8,0 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r10,2 + bld r10,0 + bst r11,2 + bld r10,2 + bst r11,1 + bld r11,2 + bst r10,5 + bld r11,1 + bst r12,6 + bld r10,5 + bst r13,0 + bld r12,6 + bst r10,3 + bld r13,0 + bst r11,6 + bld r10,3 + bst r13,1 + bld r11,6 + bst r10,7 + bld r13,1 + bst r13,6 + bld r10,7 + bst r13,3 + bld r13,6 + bst r11,7 + bld r13,3 + bst r13,5 + bld r11,7 + bst r12,7 + bld r13,5 + bst r13,4 + bld r12,7 + bst r12,3 + bld r13,4 + bst r11,4 + bld r12,3 + bst r12,1 + bld r11,4 + bst r10,4 + bld r12,1 + bst r12,2 + bld r10,4 + bst r11,0 + bld r12,2 + bst r10,1 + bld r11,0 + bst r10,6 + bld r10,1 + bst r13,2 + bld r10,6 + bst r11,3 + bld r13,2 + bst r11,5 + bld r11,3 + bst r12,5 + bld r11,5 + bst r12,4 + bld r12,5 + bst r12,0 + bld r12,4 + bst r0,0 + bld r12,0 + bst r14,0 + bld r0,0 + bst r14,3 + bld r14,0 + bst r15,7 + bld r14,3 + bst r25,6 + bld r15,7 + bst r25,0 + bld r25,6 + bst r0,0 + bld r25,0 + bst r14,1 + bld r0,0 + bst r14,7 + bld r14,1 + bst r25,7 + bld r14,7 + bst r25,4 + bld r25,7 + bst r24,0 + bld r25,4 + bst r0,0 + bld r24,0 + bst r14,2 + bld r0,0 + bst r15,3 + bld r14,2 + bst r15,6 + bld r15,3 + bst r25,2 + bld r15,6 + bst r15,0 + bld r25,2 + bst r0,0 + bld r15,0 + bst r14,4 + bld r0,0 + bst r24,3 + bld r14,4 + bst r15,5 + bld r24,3 + bst r24,6 + bld r15,5 + bst r25,1 + bld r24,6 + bst r0,0 + bld r25,1 + bst r14,5 + bld r0,0 + bst r24,7 + bld r14,5 + bst r25,5 + bld r24,7 + bst r24,4 + bld r25,5 + bst r24,1 + bld r24,4 + bst r0,0 + bld r24,1 + bst r14,6 + bld r0,0 + bst r25,3 + bld r14,6 + bst r15,4 + bld r25,3 + bst r24,2 + bld r15,4 + bst r15,1 + bld r24,2 + bst r0,0 + bld r15,1 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldd r20,Y+13 + ldd r21,Y+14 + ldd r22,Y+15 + ldd r23,Y+16 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + lsl r20 + rol r21 + adc r20,r1 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + ldd r0,Y+1 + std Y+1,r20 + ldd r20,Y+5 + std Y+5,r0 + ldd r0,Y+9 + std Y+9,r20 + std Y+13,r0 + ldd r0,Y+2 + std Y+2,r21 + ldd r21,Y+6 + std Y+6,r0 + ldd r0,Y+10 + std Y+10,r21 + std Y+14,r0 + ldd r0,Y+3 + std Y+3,r22 + ldd r22,Y+7 + std Y+7,r0 + ldd r0,Y+11 + std Y+11,r22 + std Y+15,r0 + ldd r0,Y+4 + std Y+4,r23 + ldd r23,Y+8 + std Y+8,r0 + ldd r0,Y+12 + std Y+12,r23 + std Y+16,r0 + ldi r20,128 + eor r25,r20 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + inc r19 + cpi r19,40 + breq 727f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 307b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 307b +727: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +375: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 791f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 375b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 375b +791: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-full-avr.S b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-full-avr.S new file mode 100644 index 0000000..3a7e6fb --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-full-avr.S @@ -0,0 +1,8173 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rcall 283f + rjmp 1021f +283: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +1021: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rcall 286f + rjmp 1024f +286: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1024: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 311f + rjmp 1049f +311: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +1049: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,160 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 314f + rjmp 1052f +314: + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r13 + mov r13,r12 + mov r12,r11 + mov r11,r10 + mov r10,r0 + mov r0,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + mov r0,r1 + lsr r4 + ror r0 + lsr r4 + ror r0 + or r4,r0 + mov r0,r1 + lsr r5 + ror r0 + lsr r5 + ror r0 + or r5,r0 + swap r6 + swap r7 + swap r8 + swap r9 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + com r2 + com r3 + com r4 + com r5 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + com r2 + com r3 + com r4 + com r5 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + dec r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + ld r23,-X + ld r22,-X + ld r21,-X + ld r20,-X + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,119 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r25 + ror r24 + ror r15 + ror r14 + lsr r25 + ror r24 + ror r15 + ror r14 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,17 + and r14,r16 + and r15,r16 + andi r24,17 + andi r25,17 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + ret +1052: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-small-avr.S b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-small-avr.S new file mode 100644 index 0000000..6f2d68b --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-small-avr.S @@ -0,0 +1,9331 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 329f + rcall 329f + rjmp 1541f +329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +1067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +934: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 1086f + cpse r16,r1 + rjmp 934b + rjmp 1431f +1086: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1431: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r19,20 +1: + ld r2,Z+ + ld r3,Z+ + ld r4,Z+ + ld r5,Z+ + std Y+1,r2 + std Y+2,r3 + std Y+3,r4 + std Y+4,r5 + adiw r28,4 + dec r19 + brne 1b + subi r28,80 + sbc r29,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,20 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,40 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,60 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,80 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,100 + adiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 1095f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,120 + sbiw r26,40 + rcall 357f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 357f + rjmp 1570f +357: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +1095: + movw r30,r26 + sbiw r30,40 + push r5 + push r4 + push r3 + push r2 + push r9 + push r8 + push r7 + push r6 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,68 + andi r21,68 + andi r22,85 + andi r23,85 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + st Z,r26 + std Z+1,r27 + std Z+2,r16 + std Z+3,r17 + movw r20,r2 + movw r22,r4 + andi r20,51 + andi r21,51 + andi r22,51 + andi r23,51 + ldi r19,204 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + or r4,r23 + or r5,r20 + or r2,r21 + or r3,r22 + movw r20,r4 + movw r22,r2 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r4 + eor r21,r5 + eor r22,r2 + eor r23,r3 + mov r20,r1 + andi r21,17 + andi r22,85 + andi r23,85 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + std Z+4,r4 + std Z+5,r5 + std Z+6,r2 + std Z+7,r3 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r16 + adc r16,r1 + lsl r16 + adc r16,r1 + swap r17 + std Z+8,r26 + std Z+9,r27 + std Z+10,r16 + std Z+11,r17 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + std Z+12,r2 + std Z+13,r3 + std Z+14,r4 + std Z+15,r5 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r16,Z+22 + ldd r17,Z+23 + movw r20,r26 + movw r22,r16 + andi r20,170 + andi r21,170 + andi r22,170 + andi r23,170 + andi r26,85 + andi r27,85 + andi r16,85 + andi r17,85 + or r26,r21 + or r27,r22 + or r16,r23 + or r17,r20 + std Z+16,r16 + std Z+17,r17 + std Z+18,r26 + std Z+19,r27 + movw r20,r2 + movw r22,r4 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + ldi r19,170 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + or r2,r20 + or r3,r21 + or r4,r22 + or r5,r23 + std Z+20,r5 + std Z+21,r2 + std Z+22,r3 + std Z+23,r4 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r16,Z+30 + ldd r17,Z+31 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,120 + andi r21,120 + andi r22,120 + andi r23,120 + movw r6,r20 + movw r8,r22 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldi r19,8 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r26,15 + andi r27,15 + andi r16,15 + andi r17,15 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r16 + std Z+27,r17 + movw r20,r4 + lsr r21 + ror r20 + lsr r21 + ror r20 + andi r20,48 + andi r21,48 + movw r26,r2 + movw r16,r4 + andi r26,1 + andi r27,1 + andi r16,1 + andi r17,1 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + or r26,r20 + or r27,r21 + movw r20,r4 + lsl r20 + rol r21 + lsl r20 + rol r21 + andi r20,192 + andi r21,192 + or r26,r20 + or r27,r21 + movw r20,r2 + andi r20,224 + andi r21,224 + lsr r21 + ror r20 + or r16,r20 + or r17,r21 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,7 + andi r21,7 + andi r22,7 + andi r23,7 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + ldi r19,16 + and r2,r19 + and r3,r19 + lsl r2 + rol r3 + lsl r2 + rol r3 + lsl r2 + rol r3 + or r16,r2 + or r17,r3 + std Z+28,r26 + std Z+29,r27 + std Z+30,r16 + std Z+31,r17 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r16,Z+38 + ldd r17,Z+39 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r16 + std Z+35,r17 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r4 + mov r4,r5 + mov r5,r0 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + pop r6 + pop r7 + pop r8 + pop r9 + pop r2 + pop r3 + pop r4 + pop r5 + movw r26,r30 + ret +1570: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r17 + mov r17,r26 + mov r26,r0 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r26,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +939: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 1355f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 939b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 939b +1355: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-tiny-avr.S b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-tiny-avr.S new file mode 100644 index 0000000..dd1f7b9 --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-gift128n-tiny-avr.S @@ -0,0 +1,9480 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128n_init + .type gift128n_init, @function +gift128n_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128n_init, .-gift128n_init + + .text +.global gift128n_encrypt + .type gift128n_encrypt, @function +gift128n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1585f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2323f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1585f + rcall 1585f + rjmp 2797f +1585: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2323: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2797: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_encrypt, .-gift128n_encrypt + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128n_decrypt + .type gift128n_decrypt, @function +gift128n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r22,0 + bst r18,1 + bld r4,0 + bst r18,2 + bld r8,0 + bst r18,3 + bld r12,0 + bst r18,4 + bld r22,1 + bst r18,5 + bld r4,1 + bst r18,6 + bld r8,1 + bst r18,7 + bld r12,1 + bst r19,0 + bld r22,2 + bst r19,1 + bld r4,2 + bst r19,2 + bld r8,2 + bst r19,3 + bld r12,2 + bst r19,4 + bld r22,3 + bst r19,5 + bld r4,3 + bst r19,6 + bld r8,3 + bst r19,7 + bld r12,3 + bst r20,0 + bld r22,4 + bst r20,1 + bld r4,4 + bst r20,2 + bld r8,4 + bst r20,3 + bld r12,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r4,5 + bst r20,6 + bld r8,5 + bst r20,7 + bld r12,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r4,6 + bst r21,2 + bld r8,6 + bst r21,3 + bld r12,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r4,7 + bst r21,6 + bld r8,7 + bst r21,7 + bld r12,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r23,0 + bst r18,1 + bld r5,0 + bst r18,2 + bld r9,0 + bst r18,3 + bld r13,0 + bst r18,4 + bld r23,1 + bst r18,5 + bld r5,1 + bst r18,6 + bld r9,1 + bst r18,7 + bld r13,1 + bst r19,0 + bld r23,2 + bst r19,1 + bld r5,2 + bst r19,2 + bld r9,2 + bst r19,3 + bld r13,2 + bst r19,4 + bld r23,3 + bst r19,5 + bld r5,3 + bst r19,6 + bld r9,3 + bst r19,7 + bld r13,3 + bst r20,0 + bld r23,4 + bst r20,1 + bld r5,4 + bst r20,2 + bld r9,4 + bst r20,3 + bld r13,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r5,5 + bst r20,6 + bld r9,5 + bst r20,7 + bld r13,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r5,6 + bst r21,2 + bld r9,6 + bst r21,3 + bld r13,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r5,7 + bst r21,6 + bld r9,7 + bst r21,7 + bld r13,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r2,0 + bst r18,1 + bld r6,0 + bst r18,2 + bld r10,0 + bst r18,3 + bld r14,0 + bst r18,4 + bld r2,1 + bst r18,5 + bld r6,1 + bst r18,6 + bld r10,1 + bst r18,7 + bld r14,1 + bst r19,0 + bld r2,2 + bst r19,1 + bld r6,2 + bst r19,2 + bld r10,2 + bst r19,3 + bld r14,2 + bst r19,4 + bld r2,3 + bst r19,5 + bld r6,3 + bst r19,6 + bld r10,3 + bst r19,7 + bld r14,3 + bst r20,0 + bld r2,4 + bst r20,1 + bld r6,4 + bst r20,2 + bld r10,4 + bst r20,3 + bld r14,4 + bst r20,4 + bld r2,5 + bst r20,5 + bld r6,5 + bst r20,6 + bld r10,5 + bst r20,7 + bld r14,5 + bst r21,0 + bld r2,6 + bst r21,1 + bld r6,6 + bst r21,2 + bld r10,6 + bst r21,3 + bld r14,6 + bst r21,4 + bld r2,7 + bst r21,5 + bld r6,7 + bst r21,6 + bld r10,7 + bst r21,7 + bld r14,7 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + bst r18,0 + bld r3,0 + bst r18,1 + bld r7,0 + bst r18,2 + bld r11,0 + bst r18,3 + bld r15,0 + bst r18,4 + bld r3,1 + bst r18,5 + bld r7,1 + bst r18,6 + bld r11,1 + bst r18,7 + bld r15,1 + bst r19,0 + bld r3,2 + bst r19,1 + bld r7,2 + bst r19,2 + bld r11,2 + bst r19,3 + bld r15,2 + bst r19,4 + bld r3,3 + bst r19,5 + bld r7,3 + bst r19,6 + bld r11,3 + bst r19,7 + bld r15,3 + bst r20,0 + bld r3,4 + bst r20,1 + bld r7,4 + bst r20,2 + bld r11,4 + bst r20,3 + bld r15,4 + bst r20,4 + bld r3,5 + bst r20,5 + bld r7,5 + bst r20,6 + bld r11,5 + bst r20,7 + bld r15,5 + bst r21,0 + bld r3,6 + bst r21,1 + bld r7,6 + bst r21,2 + bld r11,6 + bst r21,3 + bld r15,6 + bst r21,4 + bld r3,7 + bst r21,5 + bld r7,7 + bst r21,6 + bld r11,7 + bst r21,7 + bld r15,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +370: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 522f + cpse r16,r1 + rjmp 370b + rjmp 867f +522: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +867: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r18,0 + bst r4,0 + bld r18,1 + bst r8,0 + bld r18,2 + bst r12,0 + bld r18,3 + bst r22,1 + bld r18,4 + bst r4,1 + bld r18,5 + bst r8,1 + bld r18,6 + bst r12,1 + bld r18,7 + bst r22,2 + bld r19,0 + bst r4,2 + bld r19,1 + bst r8,2 + bld r19,2 + bst r12,2 + bld r19,3 + bst r22,3 + bld r19,4 + bst r4,3 + bld r19,5 + bst r8,3 + bld r19,6 + bst r12,3 + bld r19,7 + bst r22,4 + bld r20,0 + bst r4,4 + bld r20,1 + bst r8,4 + bld r20,2 + bst r12,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r4,5 + bld r20,5 + bst r8,5 + bld r20,6 + bst r12,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r4,6 + bld r21,1 + bst r8,6 + bld r21,2 + bst r12,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r4,7 + bld r21,5 + bst r8,7 + bld r21,6 + bst r12,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r23,0 + bld r18,0 + bst r5,0 + bld r18,1 + bst r9,0 + bld r18,2 + bst r13,0 + bld r18,3 + bst r23,1 + bld r18,4 + bst r5,1 + bld r18,5 + bst r9,1 + bld r18,6 + bst r13,1 + bld r18,7 + bst r23,2 + bld r19,0 + bst r5,2 + bld r19,1 + bst r9,2 + bld r19,2 + bst r13,2 + bld r19,3 + bst r23,3 + bld r19,4 + bst r5,3 + bld r19,5 + bst r9,3 + bld r19,6 + bst r13,3 + bld r19,7 + bst r23,4 + bld r20,0 + bst r5,4 + bld r20,1 + bst r9,4 + bld r20,2 + bst r13,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r5,5 + bld r20,5 + bst r9,5 + bld r20,6 + bst r13,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r5,6 + bld r21,1 + bst r9,6 + bld r21,2 + bst r13,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r5,7 + bld r21,5 + bst r9,7 + bld r21,6 + bst r13,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r2,0 + bld r18,0 + bst r6,0 + bld r18,1 + bst r10,0 + bld r18,2 + bst r14,0 + bld r18,3 + bst r2,1 + bld r18,4 + bst r6,1 + bld r18,5 + bst r10,1 + bld r18,6 + bst r14,1 + bld r18,7 + bst r2,2 + bld r19,0 + bst r6,2 + bld r19,1 + bst r10,2 + bld r19,2 + bst r14,2 + bld r19,3 + bst r2,3 + bld r19,4 + bst r6,3 + bld r19,5 + bst r10,3 + bld r19,6 + bst r14,3 + bld r19,7 + bst r2,4 + bld r20,0 + bst r6,4 + bld r20,1 + bst r10,4 + bld r20,2 + bst r14,4 + bld r20,3 + bst r2,5 + bld r20,4 + bst r6,5 + bld r20,5 + bst r10,5 + bld r20,6 + bst r14,5 + bld r20,7 + bst r2,6 + bld r21,0 + bst r6,6 + bld r21,1 + bst r10,6 + bld r21,2 + bst r14,6 + bld r21,3 + bst r2,7 + bld r21,4 + bst r6,7 + bld r21,5 + bst r10,7 + bld r21,6 + bst r14,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + bst r3,0 + bld r18,0 + bst r7,0 + bld r18,1 + bst r11,0 + bld r18,2 + bst r15,0 + bld r18,3 + bst r3,1 + bld r18,4 + bst r7,1 + bld r18,5 + bst r11,1 + bld r18,6 + bst r15,1 + bld r18,7 + bst r3,2 + bld r19,0 + bst r7,2 + bld r19,1 + bst r11,2 + bld r19,2 + bst r15,2 + bld r19,3 + bst r3,3 + bld r19,4 + bst r7,3 + bld r19,5 + bst r11,3 + bld r19,6 + bst r15,3 + bld r19,7 + bst r3,4 + bld r20,0 + bst r7,4 + bld r20,1 + bst r11,4 + bld r20,2 + bst r15,4 + bld r20,3 + bst r3,5 + bld r20,4 + bst r7,5 + bld r20,5 + bst r11,5 + bld r20,6 + bst r15,5 + bld r20,7 + bst r3,6 + bld r21,0 + bst r7,6 + bld r21,1 + bst r11,6 + bld r21,2 + bst r15,6 + bld r21,3 + bst r3,7 + bld r21,4 + bst r7,7 + bld r21,5 + bst r11,7 + bld r21,6 + bst r15,7 + bld r21,7 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128n_decrypt, .-gift128n_decrypt + + .text +.global gift128t_encrypt + .type gift128t_encrypt, @function +gift128t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + ldd r10,Z+8 + ldd r11,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + ldd r14,Z+12 + ldd r15,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + st Z+,r24 + st Z+,r25 + ldi r19,4 +35: + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + mov r0,r4 + mov r4,r8 + mov r8,r0 + mov r0,r5 + mov r5,r9 + mov r9,r0 + st Z+,r14 + st Z+,r15 + st Z+,r24 + st Z+,r25 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + mov r0,r12 + mov r12,r24 + mov r24,r0 + mov r0,r13 + mov r13,r25 + mov r25,r0 + dec r19 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r19,2 +121: + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + st Z,r5 + std Z+1,r3 + std Z+2,r4 + std Z+3,r2 + ldd r2,Z+4 + ldd r3,Z+5 + ldd r4,Z+6 + ldd r5,Z+7 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,85 + mov r21,r1 + andi r22,85 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+4,r5 + std Z+5,r3 + std Z+6,r4 + std Z+7,r2 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+8,r5 + std Z+9,r3 + std Z+10,r4 + std Z+11,r2 + ldd r2,Z+12 + ldd r3,Z+13 + ldd r4,Z+14 + ldd r5,Z+15 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,17 + andi r21,17 + andi r22,17 + andi r23,17 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,15 + mov r21,r1 + andi r22,15 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+12,r5 + std Z+13,r3 + std Z+14,r4 + std Z+15,r2 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r21 + rol r22 + rol r23 + rol r0 + movw r20,r22 + mov r22,r0 + mov r23,r1 + eor r20,r2 + eor r21,r3 + andi r20,170 + andi r21,170 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r0,r1 + lsr r22 + ror r21 + ror r20 + ror r0 + movw r22,r20 + mov r21,r0 + mov r20,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+16,r5 + std Z+17,r3 + std Z+18,r4 + std Z+19,r2 + ldd r2,Z+20 + ldd r3,Z+21 + ldd r4,Z+22 + ldd r5,Z+23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r21 + rol r22 + rol r23 + rol r0 + movw r20,r22 + mov r22,r0 + mov r23,r1 + eor r20,r2 + eor r21,r3 + andi r20,170 + andi r21,170 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r0,r1 + lsr r22 + ror r21 + ror r20 + ror r0 + movw r22,r20 + mov r21,r0 + mov r20,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + movw r20,r22 + mov r22,r1 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,51 + andi r21,51 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+20,r5 + std Z+21,r3 + std Z+22,r4 + std Z+23,r2 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,10 + andi r21,10 + andi r22,10 + andi r23,10 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,204 + mov r21,r1 + andi r22,204 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+24,r5 + std Z+25,r3 + std Z+26,r4 + std Z+27,r2 + ldd r2,Z+28 + ldd r3,Z+29 + ldd r4,Z+30 + ldd r5,Z+31 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,10 + andi r21,10 + andi r22,10 + andi r23,10 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r0,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + lsl r20 + rol r21 + rol r22 + rol r23 + rol r0 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r0 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + andi r20,204 + mov r21,r1 + andi r22,204 + mov r23,r1 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + lsr r23 + ror r22 + ror r21 + ror r20 + ror r0 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r0 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + movw r20,r2 + movw r22,r4 + mov r20,r21 + mov r21,r22 + mov r22,r23 + mov r23,r1 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r2 + eor r21,r3 + andi r20,240 + andi r21,240 + eor r2,r20 + eor r3,r21 + mov r22,r1 + mov r23,r1 + mov r23,r22 + mov r22,r21 + mov r21,r20 + mov r20,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + std Z+28,r5 + std Z+29,r3 + std Z+30,r4 + std Z+31,r2 + dec r19 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,20 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,60 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,100 + adiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2351f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r19,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r19 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1613f + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rcall 1613f + rjmp 2826f +1613: + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,204 + andi r21,204 + andi r22,204 + andi r23,204 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + ldi r19,51 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + or r6,r20 + or r7,r21 + or r8,r22 + or r9,r23 + movw r20,r10 + movw r22,r12 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,238 + andi r21,238 + andi r22,238 + andi r23,238 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + lsr r13 + ror r12 + ror r11 + ror r10 + ldi r17,17 + and r10,r17 + and r11,r17 + and r12,r17 + and r13,r17 + or r10,r20 + or r11,r21 + or r12,r22 + or r13,r23 + movw r20,r14 + movw r22,r24 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + andi r20,136 + andi r21,136 + andi r22,136 + andi r23,136 + lsr r25 + ror r24 + ror r15 + ror r14 + ldi r16,119 + and r14,r16 + and r15,r16 + andi r24,119 + andi r25,119 + or r14,r20 + or r15,r21 + or r24,r22 + or r25,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + lsl r12 + rol r13 + adc r12,r1 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + movw r20,r6 + movw r22,r8 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + mov r0,r12 + mov r12,r10 + mov r10,r0 + mov r0,r13 + mov r13,r11 + mov r11,r0 + movw r20,r10 + movw r22,r12 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r10 + eor r21,r11 + andi r20,85 + andi r21,85 + eor r10,r20 + eor r11,r21 + mov r22,r1 + mov r23,r1 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + mov r0,r24 + mov r24,r14 + mov r14,r0 + mov r0,r25 + mov r25,r15 + mov r15,r0 + movw r20,r24 + lsr r21 + ror r20 + eor r20,r24 + eor r21,r25 + andi r20,85 + andi r21,85 + eor r24,r20 + eor r25,r21 + lsl r20 + rol r21 + eor r24,r20 + eor r25,r21 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r24 + and r0,r12 + eor r8,r0 + mov r0,r25 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r8 + and r0,r4 + eor r24,r0 + mov r0,r9 + and r0,r5 + eor r25,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r24 + or r0,r8 + eor r12,r0 + mov r0,r25 + or r0,r9 + eor r13,r0 + eor r2,r10 + eor r3,r11 + eor r4,r12 + eor r5,r13 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + com r2 + com r3 + com r4 + com r5 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r24 + and r0,r8 + eor r12,r0 + mov r0,r25 + and r0,r9 + eor r13,r0 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + swap r6 + swap r7 + swap r8 + swap r9 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + mov r0,r1 + lsr r12 + ror r0 + lsr r12 + ror r0 + or r12,r0 + mov r0,r1 + lsr r13 + ror r0 + lsr r13 + ror r0 + or r13,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r14,r20 + eor r15,r21 + eor r24,r22 + eor r25,r23 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + com r14 + com r15 + com r24 + com r25 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r8 + eor r12,r0 + mov r0,r5 + and r0,r9 + eor r13,r0 + mov r0,r8 + mov r8,r6 + mov r6,r0 + mov r0,r9 + mov r9,r7 + mov r7,r0 + mov r0,r10 + mov r10,r11 + mov r11,r12 + mov r12,r13 + mov r13,r0 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + ret +2351: + movw r30,r26 + sbiw r30,40 + push r5 + push r4 + push r3 + push r2 + push r9 + push r8 + push r7 + push r6 + ld r2,Z + ldd r3,Z+1 + ldd r4,Z+2 + ldd r5,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + movw r20,r26 + movw r22,r16 + movw r20,r22 + mov r22,r1 + mov r23,r1 + eor r20,r26 + eor r21,r27 + andi r20,51 + andi r21,51 + eor r26,r20 + eor r27,r21 + mov r22,r1 + mov r23,r1 + movw r22,r20 + mov r20,r1 + mov r21,r1 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,68 + andi r21,68 + andi r22,85 + andi r23,85 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + st Z,r26 + std Z+1,r27 + std Z+2,r16 + std Z+3,r17 + movw r20,r2 + movw r22,r4 + andi r20,51 + andi r21,51 + andi r22,51 + andi r23,51 + ldi r19,204 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + or r4,r23 + or r5,r20 + or r2,r21 + or r3,r22 + movw r20,r4 + movw r22,r2 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r4 + eor r21,r5 + eor r22,r2 + eor r23,r3 + mov r20,r1 + andi r21,17 + andi r22,85 + andi r23,85 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r4,r20 + eor r5,r21 + eor r2,r22 + eor r3,r23 + std Z+4,r4 + std Z+5,r5 + std Z+6,r2 + std Z+7,r3 + ldd r2,Z+8 + ldd r3,Z+9 + ldd r4,Z+10 + ldd r5,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r16 + adc r16,r1 + lsl r16 + adc r16,r1 + swap r17 + std Z+8,r26 + std Z+9,r27 + std Z+10,r16 + std Z+11,r17 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r5 + adc r5,r1 + lsl r5 + adc r5,r1 + std Z+12,r2 + std Z+13,r3 + std Z+14,r4 + std Z+15,r5 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r16,Z+22 + ldd r17,Z+23 + movw r20,r26 + movw r22,r16 + andi r20,170 + andi r21,170 + andi r22,170 + andi r23,170 + andi r26,85 + andi r27,85 + andi r16,85 + andi r17,85 + or r26,r21 + or r27,r22 + or r16,r23 + or r17,r20 + std Z+16,r16 + std Z+17,r17 + std Z+18,r26 + std Z+19,r27 + movw r20,r2 + movw r22,r4 + andi r20,85 + andi r21,85 + andi r22,85 + andi r23,85 + ldi r19,170 + and r2,r19 + and r3,r19 + and r4,r19 + and r5,r19 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + lsl r2 + rol r3 + rol r4 + rol r5 + adc r2,r1 + or r2,r20 + or r3,r21 + or r4,r22 + or r5,r23 + std Z+20,r5 + std Z+21,r2 + std Z+22,r3 + std Z+23,r4 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r16,Z+30 + ldd r17,Z+31 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + lsr r23 + ror r22 + ror r21 + ror r20 + eor r20,r26 + eor r21,r27 + eor r22,r16 + eor r23,r17 + andi r20,3 + andi r21,3 + andi r22,3 + andi r23,3 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + lsl r20 + rol r21 + rol r22 + rol r23 + lsl r20 + rol r21 + rol r22 + rol r23 + eor r26,r20 + eor r27,r21 + eor r16,r22 + eor r17,r23 + movw r20,r26 + movw r22,r16 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,120 + andi r21,120 + andi r22,120 + andi r23,120 + movw r6,r20 + movw r8,r22 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + lsr r9 + ror r8 + ror r7 + ror r6 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldi r19,8 + and r6,r19 + and r7,r19 + and r8,r19 + and r9,r19 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + lsl r6 + rol r7 + rol r8 + rol r9 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + andi r26,15 + andi r27,15 + andi r16,15 + andi r17,15 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r16 + std Z+27,r17 + movw r20,r4 + lsr r21 + ror r20 + lsr r21 + ror r20 + andi r20,48 + andi r21,48 + movw r26,r2 + movw r16,r4 + andi r26,1 + andi r27,1 + andi r16,1 + andi r17,1 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + lsl r26 + rol r27 + rol r16 + rol r17 + or r26,r20 + or r27,r21 + movw r20,r4 + lsl r20 + rol r21 + lsl r20 + rol r21 + andi r20,192 + andi r21,192 + or r26,r20 + or r27,r21 + movw r20,r2 + andi r20,224 + andi r21,224 + lsr r21 + ror r20 + or r16,r20 + or r17,r21 + movw r20,r2 + movw r22,r4 + lsr r23 + ror r22 + ror r21 + ror r20 + andi r20,7 + andi r21,7 + andi r22,7 + andi r23,7 + or r26,r20 + or r27,r21 + or r16,r22 + or r17,r23 + ldi r19,16 + and r2,r19 + and r3,r19 + lsl r2 + rol r3 + lsl r2 + rol r3 + lsl r2 + rol r3 + or r16,r2 + or r17,r3 + std Z+28,r26 + std Z+29,r27 + std Z+30,r16 + std Z+31,r17 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r16,Z+38 + ldd r17,Z+39 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r16 + std Z+35,r17 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r4 + mov r4,r5 + mov r5,r0 + lsl r4 + rol r5 + adc r4,r1 + lsl r4 + rol r5 + adc r4,r1 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + pop r6 + pop r7 + pop r8 + pop r9 + pop r2 + pop r3 + pop r4 + pop r5 + movw r26,r30 + ret +2826: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_encrypt, .-gift128t_encrypt + + .text +.global gift128t_decrypt + .type gift128t_decrypt, @function +gift128t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r2,0 + bst r20,1 + bld r6,0 + bst r20,2 + bld r10,0 + bst r20,3 + bld r14,0 + bst r20,4 + bld r2,1 + bst r20,5 + bld r6,1 + bst r20,6 + bld r10,1 + bst r20,7 + bld r14,1 + bst r21,0 + bld r2,2 + bst r21,1 + bld r6,2 + bst r21,2 + bld r10,2 + bst r21,3 + bld r14,2 + bst r21,4 + bld r2,3 + bst r21,5 + bld r6,3 + bst r21,6 + bld r10,3 + bst r21,7 + bld r14,3 + bst r22,0 + bld r2,4 + bst r22,1 + bld r6,4 + bst r22,2 + bld r10,4 + bst r22,3 + bld r14,4 + bst r22,4 + bld r2,5 + bst r22,5 + bld r6,5 + bst r22,6 + bld r10,5 + bst r22,7 + bld r14,5 + bst r23,0 + bld r2,6 + bst r23,1 + bld r6,6 + bst r23,2 + bld r10,6 + bst r23,3 + bld r14,6 + bst r23,4 + bld r2,7 + bst r23,5 + bld r6,7 + bst r23,6 + bld r10,7 + bst r23,7 + bld r14,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r3,0 + bst r20,1 + bld r7,0 + bst r20,2 + bld r11,0 + bst r20,3 + bld r15,0 + bst r20,4 + bld r3,1 + bst r20,5 + bld r7,1 + bst r20,6 + bld r11,1 + bst r20,7 + bld r15,1 + bst r21,0 + bld r3,2 + bst r21,1 + bld r7,2 + bst r21,2 + bld r11,2 + bst r21,3 + bld r15,2 + bst r21,4 + bld r3,3 + bst r21,5 + bld r7,3 + bst r21,6 + bld r11,3 + bst r21,7 + bld r15,3 + bst r22,0 + bld r3,4 + bst r22,1 + bld r7,4 + bst r22,2 + bld r11,4 + bst r22,3 + bld r15,4 + bst r22,4 + bld r3,5 + bst r22,5 + bld r7,5 + bst r22,6 + bld r11,5 + bst r22,7 + bld r15,5 + bst r23,0 + bld r3,6 + bst r23,1 + bld r7,6 + bst r23,2 + bld r11,6 + bst r23,3 + bld r15,6 + bst r23,4 + bld r3,7 + bst r23,5 + bld r7,7 + bst r23,6 + bld r11,7 + bst r23,7 + bld r15,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r4,0 + bst r20,1 + bld r8,0 + bst r20,2 + bld r12,0 + bst r20,3 + bld r24,0 + bst r20,4 + bld r4,1 + bst r20,5 + bld r8,1 + bst r20,6 + bld r12,1 + bst r20,7 + bld r24,1 + bst r21,0 + bld r4,2 + bst r21,1 + bld r8,2 + bst r21,2 + bld r12,2 + bst r21,3 + bld r24,2 + bst r21,4 + bld r4,3 + bst r21,5 + bld r8,3 + bst r21,6 + bld r12,3 + bst r21,7 + bld r24,3 + bst r22,0 + bld r4,4 + bst r22,1 + bld r8,4 + bst r22,2 + bld r12,4 + bst r22,3 + bld r24,4 + bst r22,4 + bld r4,5 + bst r22,5 + bld r8,5 + bst r22,6 + bld r12,5 + bst r22,7 + bld r24,5 + bst r23,0 + bld r4,6 + bst r23,1 + bld r8,6 + bst r23,2 + bld r12,6 + bst r23,3 + bld r24,6 + bst r23,4 + bld r4,7 + bst r23,5 + bld r8,7 + bst r23,6 + bld r12,7 + bst r23,7 + bld r24,7 + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + bst r20,0 + bld r5,0 + bst r20,1 + bld r9,0 + bst r20,2 + bld r13,0 + bst r20,3 + bld r25,0 + bst r20,4 + bld r5,1 + bst r20,5 + bld r9,1 + bst r20,6 + bld r13,1 + bst r20,7 + bld r25,1 + bst r21,0 + bld r5,2 + bst r21,1 + bld r9,2 + bst r21,2 + bld r13,2 + bst r21,3 + bld r25,2 + bst r21,4 + bld r5,3 + bst r21,5 + bld r9,3 + bst r21,6 + bld r13,3 + bst r21,7 + bld r25,3 + bst r22,0 + bld r5,4 + bst r22,1 + bld r9,4 + bst r22,2 + bld r13,4 + bst r22,3 + bld r25,4 + bst r22,4 + bld r5,5 + bst r22,5 + bld r9,5 + bst r22,6 + bld r13,5 + bst r22,7 + bld r25,5 + bst r23,0 + bld r5,6 + bst r23,1 + bld r9,6 + bst r23,2 + bld r13,6 + bst r23,3 + bld r25,6 + bst r23,4 + bld r5,7 + bst r23,5 + bld r9,7 + bst r23,6 + bld r13,7 + bst r23,7 + bld r25,7 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r16,Z+14 + ldd r17,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r16 + std Y+4,r17 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r16,Z+6 + ldd r17,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r16 + std Y+8,r17 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r16,Z+10 + ldd r17,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r16 + std Y+12,r17 + ld r26,Z + ldd r27,Z+1 + ldd r16,Z+2 + ldd r17,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + lsr r17 + ror r16 + ror r0 + or r17,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r16 + std Y+16,r17 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r26,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r19,40 + mov r26,r1 +375: + ldd r0,Y+13 + ldd r20,Y+9 + std Y+9,r0 + ldd r0,Y+5 + std Y+5,r20 + ldd r20,Y+1 + std Y+1,r0 + ldd r0,Y+14 + ldd r21,Y+10 + std Y+10,r0 + ldd r0,Y+6 + std Y+6,r21 + ldd r21,Y+2 + std Y+2,r0 + ldd r0,Y+15 + ldd r22,Y+11 + std Y+11,r0 + ldd r0,Y+7 + std Y+7,r22 + ldd r22,Y+3 + std Y+3,r0 + ldd r0,Y+16 + ldd r23,Y+12 + std Y+12,r0 + ldd r0,Y+8 + std Y+8,r23 + ldd r23,Y+4 + std Y+4,r0 + mov r0,r1 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + lsr r21 + ror r20 + ror r0 + or r21,r0 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + std Y+13,r20 + std Y+14,r21 + std Y+15,r22 + std Y+16,r23 + eor r6,r20 + eor r7,r21 + eor r8,r22 + eor r9,r23 + ldd r0,Y+5 + eor r10,r0 + ldd r0,Y+6 + eor r11,r0 + ldd r0,Y+7 + eor r12,r0 + ldd r0,Y+8 + eor r13,r0 + ldi r20,128 + eor r25,r20 + dec r19 + mov r30,r19 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + eor r14,r20 + bst r2,1 + bld r0,0 + bst r5,0 + bld r2,1 + bst r2,6 + bld r5,0 + bst r4,1 + bld r2,6 + bst r5,4 + bld r4,1 + bst r2,7 + bld r5,4 + bst r3,1 + bld r2,7 + bst r5,2 + bld r3,1 + bst r4,6 + bld r5,2 + bst r4,5 + bld r4,6 + bst r5,5 + bld r4,5 + bst r5,7 + bld r5,5 + bst r3,7 + bld r5,7 + bst r3,3 + bld r3,7 + bst r3,2 + bld r3,3 + bst r4,2 + bld r3,2 + bst r4,4 + bld r4,2 + bst r2,5 + bld r4,4 + bst r5,1 + bld r2,5 + bst r5,6 + bld r5,1 + bst r4,7 + bld r5,6 + bst r3,5 + bld r4,7 + bst r5,3 + bld r3,5 + bst r3,6 + bld r5,3 + bst r4,3 + bld r3,6 + bst r3,4 + bld r4,3 + bst r2,3 + bld r3,4 + bst r3,0 + bld r2,3 + bst r2,2 + bld r3,0 + bst r4,0 + bld r2,2 + bst r2,4 + bld r4,0 + bst r0,0 + bld r2,4 + bst r6,0 + bld r0,0 + bst r7,0 + bld r6,0 + bst r7,2 + bld r7,0 + bst r9,2 + bld r7,2 + bst r9,6 + bld r9,2 + bst r9,7 + bld r9,6 + bst r8,7 + bld r9,7 + bst r8,5 + bld r8,7 + bst r6,5 + bld r8,5 + bst r6,1 + bld r6,5 + bst r0,0 + bld r6,1 + bst r6,2 + bld r0,0 + bst r9,0 + bld r6,2 + bst r7,6 + bld r9,0 + bst r9,3 + bld r7,6 + bst r8,6 + bld r9,3 + bst r9,5 + bld r8,6 + bst r6,7 + bld r9,5 + bst r8,1 + bld r6,7 + bst r6,4 + bld r8,1 + bst r7,1 + bld r6,4 + bst r0,0 + bld r7,1 + bst r6,3 + bld r0,0 + bst r8,0 + bld r6,3 + bst r7,4 + bld r8,0 + bst r7,3 + bld r7,4 + bst r8,2 + bld r7,3 + bst r9,4 + bld r8,2 + bst r7,7 + bld r9,4 + bst r8,3 + bld r7,7 + bst r8,4 + bld r8,3 + bst r7,5 + bld r8,4 + bst r0,0 + bld r7,5 + bst r6,6 + bld r0,0 + bst r9,1 + bld r6,6 + bst r0,0 + bld r9,1 + bst r10,0 + bld r0,0 + bst r12,0 + bld r10,0 + bst r12,4 + bld r12,0 + bst r12,5 + bld r12,4 + bst r11,5 + bld r12,5 + bst r11,3 + bld r11,5 + bst r13,2 + bld r11,3 + bst r10,6 + bld r13,2 + bst r10,1 + bld r10,6 + bst r11,0 + bld r10,1 + bst r12,2 + bld r11,0 + bst r10,4 + bld r12,2 + bst r12,1 + bld r10,4 + bst r11,4 + bld r12,1 + bst r12,3 + bld r11,4 + bst r13,4 + bld r12,3 + bst r12,7 + bld r13,4 + bst r13,5 + bld r12,7 + bst r11,7 + bld r13,5 + bst r13,3 + bld r11,7 + bst r13,6 + bld r13,3 + bst r10,7 + bld r13,6 + bst r13,1 + bld r10,7 + bst r11,6 + bld r13,1 + bst r10,3 + bld r11,6 + bst r13,0 + bld r10,3 + bst r12,6 + bld r13,0 + bst r10,5 + bld r12,6 + bst r11,1 + bld r10,5 + bst r11,2 + bld r11,1 + bst r10,2 + bld r11,2 + bst r0,0 + bld r10,2 + bst r14,0 + bld r0,0 + bst r25,0 + bld r14,0 + bst r25,6 + bld r25,0 + bst r15,7 + bld r25,6 + bst r14,3 + bld r15,7 + bst r0,0 + bld r14,3 + bst r14,1 + bld r0,0 + bst r24,0 + bld r14,1 + bst r25,4 + bld r24,0 + bst r25,7 + bld r25,4 + bst r14,7 + bld r25,7 + bst r0,0 + bld r14,7 + bst r14,2 + bld r0,0 + bst r15,0 + bld r14,2 + bst r25,2 + bld r15,0 + bst r15,6 + bld r25,2 + bst r15,3 + bld r15,6 + bst r0,0 + bld r15,3 + bst r14,4 + bld r0,0 + bst r25,1 + bld r14,4 + bst r24,6 + bld r25,1 + bst r15,5 + bld r24,6 + bst r24,3 + bld r15,5 + bst r0,0 + bld r24,3 + bst r14,5 + bld r0,0 + bst r24,1 + bld r14,5 + bst r24,4 + bld r24,1 + bst r25,5 + bld r24,4 + bst r24,7 + bld r25,5 + bst r0,0 + bld r24,7 + bst r14,6 + bld r0,0 + bst r15,1 + bld r14,6 + bst r24,2 + bld r15,1 + bst r15,4 + bld r24,2 + bst r25,3 + bld r15,4 + bst r0,0 + bld r25,3 + movw r20,r14 + movw r22,r24 + movw r14,r2 + movw r24,r4 + movw r2,r20 + movw r4,r22 + and r20,r6 + and r21,r7 + and r22,r8 + and r23,r9 + eor r10,r20 + eor r11,r21 + eor r12,r22 + eor r13,r23 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r14,r10 + eor r15,r11 + eor r24,r12 + eor r25,r13 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + or r0,r8 + eor r12,r0 + mov r0,r5 + or r0,r9 + eor r13,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r8 + and r0,r24 + eor r4,r0 + mov r0,r9 + and r0,r25 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r8,r0 + mov r0,r5 + and r0,r13 + eor r9,r0 + cp r19,r1 + breq 791f + inc r26 + ldi r27,5 + cpse r26,r27 + rjmp 375b + mov r26,r1 + eor r2,r18 + eor r3,r18 + eor r4,r18 + eor r5,r18 + rjmp 375b +791: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + bst r2,0 + bld r20,0 + bst r6,0 + bld r20,1 + bst r10,0 + bld r20,2 + bst r14,0 + bld r20,3 + bst r2,1 + bld r20,4 + bst r6,1 + bld r20,5 + bst r10,1 + bld r20,6 + bst r14,1 + bld r20,7 + bst r2,2 + bld r21,0 + bst r6,2 + bld r21,1 + bst r10,2 + bld r21,2 + bst r14,2 + bld r21,3 + bst r2,3 + bld r21,4 + bst r6,3 + bld r21,5 + bst r10,3 + bld r21,6 + bst r14,3 + bld r21,7 + bst r2,4 + bld r22,0 + bst r6,4 + bld r22,1 + bst r10,4 + bld r22,2 + bst r14,4 + bld r22,3 + bst r2,5 + bld r22,4 + bst r6,5 + bld r22,5 + bst r10,5 + bld r22,6 + bst r14,5 + bld r22,7 + bst r2,6 + bld r23,0 + bst r6,6 + bld r23,1 + bst r10,6 + bld r23,2 + bst r14,6 + bld r23,3 + bst r2,7 + bld r23,4 + bst r6,7 + bld r23,5 + bst r10,7 + bld r23,6 + bst r14,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r3,0 + bld r20,0 + bst r7,0 + bld r20,1 + bst r11,0 + bld r20,2 + bst r15,0 + bld r20,3 + bst r3,1 + bld r20,4 + bst r7,1 + bld r20,5 + bst r11,1 + bld r20,6 + bst r15,1 + bld r20,7 + bst r3,2 + bld r21,0 + bst r7,2 + bld r21,1 + bst r11,2 + bld r21,2 + bst r15,2 + bld r21,3 + bst r3,3 + bld r21,4 + bst r7,3 + bld r21,5 + bst r11,3 + bld r21,6 + bst r15,3 + bld r21,7 + bst r3,4 + bld r22,0 + bst r7,4 + bld r22,1 + bst r11,4 + bld r22,2 + bst r15,4 + bld r22,3 + bst r3,5 + bld r22,4 + bst r7,5 + bld r22,5 + bst r11,5 + bld r22,6 + bst r15,5 + bld r22,7 + bst r3,6 + bld r23,0 + bst r7,6 + bld r23,1 + bst r11,6 + bld r23,2 + bst r15,6 + bld r23,3 + bst r3,7 + bld r23,4 + bst r7,7 + bld r23,5 + bst r11,7 + bld r23,6 + bst r15,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r4,0 + bld r20,0 + bst r8,0 + bld r20,1 + bst r12,0 + bld r20,2 + bst r24,0 + bld r20,3 + bst r4,1 + bld r20,4 + bst r8,1 + bld r20,5 + bst r12,1 + bld r20,6 + bst r24,1 + bld r20,7 + bst r4,2 + bld r21,0 + bst r8,2 + bld r21,1 + bst r12,2 + bld r21,2 + bst r24,2 + bld r21,3 + bst r4,3 + bld r21,4 + bst r8,3 + bld r21,5 + bst r12,3 + bld r21,6 + bst r24,3 + bld r21,7 + bst r4,4 + bld r22,0 + bst r8,4 + bld r22,1 + bst r12,4 + bld r22,2 + bst r24,4 + bld r22,3 + bst r4,5 + bld r22,4 + bst r8,5 + bld r22,5 + bst r12,5 + bld r22,6 + bst r24,5 + bld r22,7 + bst r4,6 + bld r23,0 + bst r8,6 + bld r23,1 + bst r12,6 + bld r23,2 + bst r24,6 + bld r23,3 + bst r4,7 + bld r23,4 + bst r8,7 + bld r23,5 + bst r12,7 + bld r23,6 + bst r24,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + bst r5,0 + bld r20,0 + bst r9,0 + bld r20,1 + bst r13,0 + bld r20,2 + bst r25,0 + bld r20,3 + bst r5,1 + bld r20,4 + bst r9,1 + bld r20,5 + bst r13,1 + bld r20,6 + bst r25,1 + bld r20,7 + bst r5,2 + bld r21,0 + bst r9,2 + bld r21,1 + bst r13,2 + bld r21,2 + bst r25,2 + bld r21,3 + bst r5,3 + bld r21,4 + bst r9,3 + bld r21,5 + bst r13,3 + bld r21,6 + bst r25,3 + bld r21,7 + bst r5,4 + bld r22,0 + bst r9,4 + bld r22,1 + bst r13,4 + bld r22,2 + bst r25,4 + bld r22,3 + bst r5,5 + bld r22,4 + bst r9,5 + bld r22,5 + bst r13,5 + bld r22,6 + bst r25,5 + bld r22,7 + bst r5,6 + bld r23,0 + bst r9,6 + bld r23,1 + bst r13,6 + bld r23,2 + bst r25,6 + bld r23,3 + bst r5,7 + bld r23,4 + bst r9,7 + bld r23,5 + bst r13,7 + bld r23,6 + bst r25,7 + bld r23,7 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128t_decrypt, .-gift128t_decrypt + +#endif + +#endif diff --git a/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-util.h b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/hyena/Implementations/crypto_aead/hyenav2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.c b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/api.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/encrypt.c b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/encrypt.c new file mode 100644 index 0000000..18697ad --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "isap.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_ascon_128a_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_ascon_128a_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon-avr.S b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.c b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-isap.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-isap.h new file mode 100644 index 0000000..ba99f2a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-isap.h @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ISAP variant. + * + * ISAP_ALG_NAME Name of the ISAP algorithm; e.g. isap_keccak_128 + * ISAP_RATE Number of bytes in the rate for hashing and encryption. + * ISAP_sH Number of rounds for hashing. + * ISAP_sE Number of rounds for encryption. + * ISAP_sB Number of rounds for key bit absorption. + * ISAP_sK Number of rounds for keying. + * ISAP_STATE Type for the permuation state; e.g. ascon_state_t + * ISAP_PERMUTE(s,r) Permutes the state "s" with number of rounds "r". + */ +#if defined(ISAP_ALG_NAME) + +#define ISAP_CONCAT_INNER(name,suffix) name##suffix +#define ISAP_CONCAT(name,suffix) ISAP_CONCAT_INNER(name,suffix) + +/* IV string for initialising the associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_A) + [sizeof(ISAP_STATE) - ISAP_NONCE_SIZE] = { + 0x01, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for authenticating associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x02, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for encrypting payload data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x03, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/** + * \brief Re-keys the ISAP permutation state. + * + * \param state The permutation state to be re-keyed. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param iv Points to the initialization vector for this re-keying operation. + * \param data Points to the data to be absorbed to perform the re-keying. + * \param data_len Length of the data to be absorbed. + * + * The output key will be left in the leading bytes of \a state. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *iv, + const unsigned char *data, unsigned data_len) +{ + unsigned bit, num_bits; + + /* Initialize the state with the key and IV */ + memcpy(state->B, k, ISAP_KEY_SIZE); + memcpy(state->B + ISAP_KEY_SIZE, iv, sizeof(state->B) - ISAP_KEY_SIZE); + ISAP_PERMUTE(state, ISAP_sK); + + /* Absorb all of the bits of the data buffer one by one */ + num_bits = data_len * 8 - 1; + for (bit = 0; bit < num_bits; ++bit) { + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sB); + } + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sK); +} + +/** + * \brief Encrypts (or decrypts) a message payload with ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param c Buffer to receive the output ciphertext. + * \param m Buffer to receive the input plaintext. + * \param mlen Length of the input plaintext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_encrypt) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Set up the re-keyed encryption key and nonce in the state */ + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE), npub, ISAP_NONCE_SIZE); + memcpy(state->B + sizeof(ISAP_STATE) - ISAP_NONCE_SIZE, + npub, ISAP_NONCE_SIZE); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ISAP_RATE) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, ISAP_RATE); + c += ISAP_RATE; + m += ISAP_RATE; + mlen -= ISAP_RATE; + } + if (mlen > 0) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, (unsigned)mlen); + } +} + +/** + * \brief Authenticates the associated data and ciphertext using ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param ad Buffer containing the associated data. + * \param adlen Length of the associated data. + * \param c Buffer containing the ciphertext. + * \param clen Length of the ciphertext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *c, unsigned long long clen, + unsigned char *tag) +{ + unsigned char preserve[sizeof(ISAP_STATE) - ISAP_TAG_SIZE]; + unsigned temp; + + /* Absorb the associated data */ + memcpy(state->B, npub, ISAP_NONCE_SIZE); + memcpy(state->B + ISAP_NONCE_SIZE, ISAP_CONCAT(ISAP_ALG_NAME,_IV_A), + sizeof(state->B) - ISAP_NONCE_SIZE); + ISAP_PERMUTE(state, ISAP_sH); + while (adlen >= ISAP_RATE) { + lw_xor_block(state->B, ad, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + ad += ISAP_RATE; + adlen -= ISAP_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + state->B[sizeof(state->B) - 1] ^= 0x01; /* domain separation */ + + /* Absorb the ciphertext */ + while (clen >= ISAP_RATE) { + lw_xor_block(state->B, c, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + c += ISAP_RATE; + clen -= ISAP_RATE; + } + temp = (unsigned)clen; + lw_xor_block(state->B, c, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + + /* Re-key the state and generate the authentication tag */ + memcpy(tag, state->B, ISAP_TAG_SIZE); + memcpy(preserve, state->B + ISAP_TAG_SIZE, sizeof(preserve)); + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA), tag, ISAP_TAG_SIZE); + memcpy(state->B + ISAP_TAG_SIZE, preserve, sizeof(preserve)); + ISAP_PERMUTE(state, ISAP_sH); + memcpy(tag, state->B, ISAP_TAG_SIZE); +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ISAP_TAG_SIZE; + + /* Encrypt the plaintext to produce the ciphertext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, c, m, mlen); + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (&state, k, npub, ad, adlen, c, mlen, c + mlen); + return 0; +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + unsigned char tag[ISAP_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ISAP_TAG_SIZE) + return -1; + *mlen = clen - ISAP_TAG_SIZE; + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac)(&state, k, npub, ad, adlen, c, *mlen, tag); + + /* Decrypt the ciphertext to produce the plaintext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, m, c, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, tag, c + *mlen, ISAP_TAG_SIZE); +} + +#endif /* ISAP_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ISAP algorithm */ +#undef ISAP_ALG_NAME +#undef ISAP_RATE +#undef ISAP_sH +#undef ISAP_sE +#undef ISAP_sB +#undef ISAP_sK +#undef ISAP_STATE +#undef ISAP_PERMUTE +#undef ISAP_CONCAT_INNER +#undef ISAP_CONCAT diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak-avr.S b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.c b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-util.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.c b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.c new file mode 100644 index 0000000..26d50a3 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "isap.h" +#include "internal-keccak.h" +#include "internal-ascon.h" +#include + +aead_cipher_t const isap_keccak_128a_cipher = { + "ISAP-K-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128a_aead_encrypt, + isap_keccak_128a_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128a_cipher = { + "ISAP-A-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128a_aead_encrypt, + isap_ascon_128a_aead_decrypt +}; + +aead_cipher_t const isap_keccak_128_cipher = { + "ISAP-K-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128_aead_encrypt, + isap_keccak_128_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128_cipher = { + "ISAP-A-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128_aead_encrypt, + isap_ascon_128_aead_decrypt +}; + +/* ISAP-K-128A */ +#define ISAP_ALG_NAME isap_keccak_128a +#define ISAP_RATE (144 / 8) +#define ISAP_sH 16 +#define ISAP_sE 8 +#define ISAP_sB 1 +#define ISAP_sK 8 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128A */ +#define ISAP_ALG_NAME isap_ascon_128a +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 6 +#define ISAP_sB 1 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" + +/* ISAP-K-128 */ +#define ISAP_ALG_NAME isap_keccak_128 +#define ISAP_RATE (144 / 8) +#define ISAP_sH 20 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128 */ +#define ISAP_ALG_NAME isap_ascon_128 +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" diff --git a/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.h b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.h new file mode 100644 index 0000000..ddf8203 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128av20/rhys-avr/isap.h @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ISAP_H +#define LWCRYPTO_ISAP_H + +#include "aead-common.h" + +/** + * \file isap.h + * \brief ISAP authenticated encryption algorithm. + * + * ISAP is a family of authenticated encryption algorithms that are built + * around the Keccak-p[400] or ASCON permutations. There are four algorithms + * in the family, each of which have a 128-bit key, a 128-bit nonce, and a + * 128-bit tag: + * + * \li ISAP-K-128A based around the Keccak-p[400] permutation with a + * reduced number of rounds. This is the primary member in the family. + * \li ISAP-A-128A based around the ASCON permutation with a reduced + * number of rounds. + * \li ISAP-K-128 based around the Keccak-p[400] permutation. + * \li ISAP-A-128 based around the ASCON permutation. + * + * ISAP is designed to provide some protection against adversaries + * using differential power analysis to determine the key. The + * downside is that key setup is very slow. + * + * References: https://isap.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all ISAP family members. + */ +#define ISAP_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all ISAP family members. + */ +#define ISAP_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all ISAP family members. + */ +#define ISAP_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the ISAP-K-128A cipher. + */ +extern aead_cipher_t const isap_keccak_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128A cipher. + */ +extern aead_cipher_t const isap_ascon_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-K-128 cipher. + */ +extern aead_cipher_t const isap_keccak_128_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128 cipher. + */ +extern aead_cipher_t const isap_ascon_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128a_aead_decrypt() + */ +int isap_keccak_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128a_aead_encrypt() + */ +int isap_keccak_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128a_aead_decrypt() + */ +int isap_ascon_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128a_aead_encrypt() + */ +int isap_ascon_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128_aead_decrypt() + */ +int isap_keccak_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128_aead_encrypt() + */ +int isap_keccak_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128_aead_decrypt() + */ +int isap_ascon_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128_aead_encrypt() + */ +int isap_ascon_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.c b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/api.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/encrypt.c b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/encrypt.c new file mode 100644 index 0000000..7b2bc3a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "isap.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_ascon_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_ascon_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon-avr.S b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.c b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-isap.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-isap.h new file mode 100644 index 0000000..ba99f2a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-isap.h @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ISAP variant. + * + * ISAP_ALG_NAME Name of the ISAP algorithm; e.g. isap_keccak_128 + * ISAP_RATE Number of bytes in the rate for hashing and encryption. + * ISAP_sH Number of rounds for hashing. + * ISAP_sE Number of rounds for encryption. + * ISAP_sB Number of rounds for key bit absorption. + * ISAP_sK Number of rounds for keying. + * ISAP_STATE Type for the permuation state; e.g. ascon_state_t + * ISAP_PERMUTE(s,r) Permutes the state "s" with number of rounds "r". + */ +#if defined(ISAP_ALG_NAME) + +#define ISAP_CONCAT_INNER(name,suffix) name##suffix +#define ISAP_CONCAT(name,suffix) ISAP_CONCAT_INNER(name,suffix) + +/* IV string for initialising the associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_A) + [sizeof(ISAP_STATE) - ISAP_NONCE_SIZE] = { + 0x01, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for authenticating associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x02, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for encrypting payload data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x03, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/** + * \brief Re-keys the ISAP permutation state. + * + * \param state The permutation state to be re-keyed. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param iv Points to the initialization vector for this re-keying operation. + * \param data Points to the data to be absorbed to perform the re-keying. + * \param data_len Length of the data to be absorbed. + * + * The output key will be left in the leading bytes of \a state. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *iv, + const unsigned char *data, unsigned data_len) +{ + unsigned bit, num_bits; + + /* Initialize the state with the key and IV */ + memcpy(state->B, k, ISAP_KEY_SIZE); + memcpy(state->B + ISAP_KEY_SIZE, iv, sizeof(state->B) - ISAP_KEY_SIZE); + ISAP_PERMUTE(state, ISAP_sK); + + /* Absorb all of the bits of the data buffer one by one */ + num_bits = data_len * 8 - 1; + for (bit = 0; bit < num_bits; ++bit) { + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sB); + } + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sK); +} + +/** + * \brief Encrypts (or decrypts) a message payload with ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param c Buffer to receive the output ciphertext. + * \param m Buffer to receive the input plaintext. + * \param mlen Length of the input plaintext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_encrypt) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Set up the re-keyed encryption key and nonce in the state */ + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE), npub, ISAP_NONCE_SIZE); + memcpy(state->B + sizeof(ISAP_STATE) - ISAP_NONCE_SIZE, + npub, ISAP_NONCE_SIZE); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ISAP_RATE) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, ISAP_RATE); + c += ISAP_RATE; + m += ISAP_RATE; + mlen -= ISAP_RATE; + } + if (mlen > 0) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, (unsigned)mlen); + } +} + +/** + * \brief Authenticates the associated data and ciphertext using ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param ad Buffer containing the associated data. + * \param adlen Length of the associated data. + * \param c Buffer containing the ciphertext. + * \param clen Length of the ciphertext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *c, unsigned long long clen, + unsigned char *tag) +{ + unsigned char preserve[sizeof(ISAP_STATE) - ISAP_TAG_SIZE]; + unsigned temp; + + /* Absorb the associated data */ + memcpy(state->B, npub, ISAP_NONCE_SIZE); + memcpy(state->B + ISAP_NONCE_SIZE, ISAP_CONCAT(ISAP_ALG_NAME,_IV_A), + sizeof(state->B) - ISAP_NONCE_SIZE); + ISAP_PERMUTE(state, ISAP_sH); + while (adlen >= ISAP_RATE) { + lw_xor_block(state->B, ad, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + ad += ISAP_RATE; + adlen -= ISAP_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + state->B[sizeof(state->B) - 1] ^= 0x01; /* domain separation */ + + /* Absorb the ciphertext */ + while (clen >= ISAP_RATE) { + lw_xor_block(state->B, c, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + c += ISAP_RATE; + clen -= ISAP_RATE; + } + temp = (unsigned)clen; + lw_xor_block(state->B, c, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + + /* Re-key the state and generate the authentication tag */ + memcpy(tag, state->B, ISAP_TAG_SIZE); + memcpy(preserve, state->B + ISAP_TAG_SIZE, sizeof(preserve)); + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA), tag, ISAP_TAG_SIZE); + memcpy(state->B + ISAP_TAG_SIZE, preserve, sizeof(preserve)); + ISAP_PERMUTE(state, ISAP_sH); + memcpy(tag, state->B, ISAP_TAG_SIZE); +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ISAP_TAG_SIZE; + + /* Encrypt the plaintext to produce the ciphertext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, c, m, mlen); + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (&state, k, npub, ad, adlen, c, mlen, c + mlen); + return 0; +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + unsigned char tag[ISAP_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ISAP_TAG_SIZE) + return -1; + *mlen = clen - ISAP_TAG_SIZE; + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac)(&state, k, npub, ad, adlen, c, *mlen, tag); + + /* Decrypt the ciphertext to produce the plaintext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, m, c, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, tag, c + *mlen, ISAP_TAG_SIZE); +} + +#endif /* ISAP_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ISAP algorithm */ +#undef ISAP_ALG_NAME +#undef ISAP_RATE +#undef ISAP_sH +#undef ISAP_sE +#undef ISAP_sB +#undef ISAP_sK +#undef ISAP_STATE +#undef ISAP_PERMUTE +#undef ISAP_CONCAT_INNER +#undef ISAP_CONCAT diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak-avr.S b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.c b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-util.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.c b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.c new file mode 100644 index 0000000..26d50a3 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "isap.h" +#include "internal-keccak.h" +#include "internal-ascon.h" +#include + +aead_cipher_t const isap_keccak_128a_cipher = { + "ISAP-K-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128a_aead_encrypt, + isap_keccak_128a_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128a_cipher = { + "ISAP-A-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128a_aead_encrypt, + isap_ascon_128a_aead_decrypt +}; + +aead_cipher_t const isap_keccak_128_cipher = { + "ISAP-K-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128_aead_encrypt, + isap_keccak_128_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128_cipher = { + "ISAP-A-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128_aead_encrypt, + isap_ascon_128_aead_decrypt +}; + +/* ISAP-K-128A */ +#define ISAP_ALG_NAME isap_keccak_128a +#define ISAP_RATE (144 / 8) +#define ISAP_sH 16 +#define ISAP_sE 8 +#define ISAP_sB 1 +#define ISAP_sK 8 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128A */ +#define ISAP_ALG_NAME isap_ascon_128a +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 6 +#define ISAP_sB 1 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" + +/* ISAP-K-128 */ +#define ISAP_ALG_NAME isap_keccak_128 +#define ISAP_RATE (144 / 8) +#define ISAP_sH 20 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128 */ +#define ISAP_ALG_NAME isap_ascon_128 +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" diff --git a/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.h b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.h new file mode 100644 index 0000000..ddf8203 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapa128v20/rhys-avr/isap.h @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ISAP_H +#define LWCRYPTO_ISAP_H + +#include "aead-common.h" + +/** + * \file isap.h + * \brief ISAP authenticated encryption algorithm. + * + * ISAP is a family of authenticated encryption algorithms that are built + * around the Keccak-p[400] or ASCON permutations. There are four algorithms + * in the family, each of which have a 128-bit key, a 128-bit nonce, and a + * 128-bit tag: + * + * \li ISAP-K-128A based around the Keccak-p[400] permutation with a + * reduced number of rounds. This is the primary member in the family. + * \li ISAP-A-128A based around the ASCON permutation with a reduced + * number of rounds. + * \li ISAP-K-128 based around the Keccak-p[400] permutation. + * \li ISAP-A-128 based around the ASCON permutation. + * + * ISAP is designed to provide some protection against adversaries + * using differential power analysis to determine the key. The + * downside is that key setup is very slow. + * + * References: https://isap.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all ISAP family members. + */ +#define ISAP_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all ISAP family members. + */ +#define ISAP_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all ISAP family members. + */ +#define ISAP_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the ISAP-K-128A cipher. + */ +extern aead_cipher_t const isap_keccak_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128A cipher. + */ +extern aead_cipher_t const isap_ascon_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-K-128 cipher. + */ +extern aead_cipher_t const isap_keccak_128_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128 cipher. + */ +extern aead_cipher_t const isap_ascon_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128a_aead_decrypt() + */ +int isap_keccak_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128a_aead_encrypt() + */ +int isap_keccak_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128a_aead_decrypt() + */ +int isap_ascon_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128a_aead_encrypt() + */ +int isap_ascon_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128_aead_decrypt() + */ +int isap_keccak_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128_aead_encrypt() + */ +int isap_keccak_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128_aead_decrypt() + */ +int isap_ascon_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128_aead_encrypt() + */ +int isap_ascon_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.c b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/api.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/encrypt.c b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/encrypt.c new file mode 100644 index 0000000..c54de88 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "isap.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_keccak_128a_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_keccak_128a_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon-avr.S b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.c b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-isap.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-isap.h new file mode 100644 index 0000000..ba99f2a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-isap.h @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ISAP variant. + * + * ISAP_ALG_NAME Name of the ISAP algorithm; e.g. isap_keccak_128 + * ISAP_RATE Number of bytes in the rate for hashing and encryption. + * ISAP_sH Number of rounds for hashing. + * ISAP_sE Number of rounds for encryption. + * ISAP_sB Number of rounds for key bit absorption. + * ISAP_sK Number of rounds for keying. + * ISAP_STATE Type for the permuation state; e.g. ascon_state_t + * ISAP_PERMUTE(s,r) Permutes the state "s" with number of rounds "r". + */ +#if defined(ISAP_ALG_NAME) + +#define ISAP_CONCAT_INNER(name,suffix) name##suffix +#define ISAP_CONCAT(name,suffix) ISAP_CONCAT_INNER(name,suffix) + +/* IV string for initialising the associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_A) + [sizeof(ISAP_STATE) - ISAP_NONCE_SIZE] = { + 0x01, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for authenticating associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x02, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for encrypting payload data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x03, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/** + * \brief Re-keys the ISAP permutation state. + * + * \param state The permutation state to be re-keyed. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param iv Points to the initialization vector for this re-keying operation. + * \param data Points to the data to be absorbed to perform the re-keying. + * \param data_len Length of the data to be absorbed. + * + * The output key will be left in the leading bytes of \a state. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *iv, + const unsigned char *data, unsigned data_len) +{ + unsigned bit, num_bits; + + /* Initialize the state with the key and IV */ + memcpy(state->B, k, ISAP_KEY_SIZE); + memcpy(state->B + ISAP_KEY_SIZE, iv, sizeof(state->B) - ISAP_KEY_SIZE); + ISAP_PERMUTE(state, ISAP_sK); + + /* Absorb all of the bits of the data buffer one by one */ + num_bits = data_len * 8 - 1; + for (bit = 0; bit < num_bits; ++bit) { + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sB); + } + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sK); +} + +/** + * \brief Encrypts (or decrypts) a message payload with ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param c Buffer to receive the output ciphertext. + * \param m Buffer to receive the input plaintext. + * \param mlen Length of the input plaintext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_encrypt) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Set up the re-keyed encryption key and nonce in the state */ + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE), npub, ISAP_NONCE_SIZE); + memcpy(state->B + sizeof(ISAP_STATE) - ISAP_NONCE_SIZE, + npub, ISAP_NONCE_SIZE); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ISAP_RATE) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, ISAP_RATE); + c += ISAP_RATE; + m += ISAP_RATE; + mlen -= ISAP_RATE; + } + if (mlen > 0) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, (unsigned)mlen); + } +} + +/** + * \brief Authenticates the associated data and ciphertext using ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param ad Buffer containing the associated data. + * \param adlen Length of the associated data. + * \param c Buffer containing the ciphertext. + * \param clen Length of the ciphertext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *c, unsigned long long clen, + unsigned char *tag) +{ + unsigned char preserve[sizeof(ISAP_STATE) - ISAP_TAG_SIZE]; + unsigned temp; + + /* Absorb the associated data */ + memcpy(state->B, npub, ISAP_NONCE_SIZE); + memcpy(state->B + ISAP_NONCE_SIZE, ISAP_CONCAT(ISAP_ALG_NAME,_IV_A), + sizeof(state->B) - ISAP_NONCE_SIZE); + ISAP_PERMUTE(state, ISAP_sH); + while (adlen >= ISAP_RATE) { + lw_xor_block(state->B, ad, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + ad += ISAP_RATE; + adlen -= ISAP_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + state->B[sizeof(state->B) - 1] ^= 0x01; /* domain separation */ + + /* Absorb the ciphertext */ + while (clen >= ISAP_RATE) { + lw_xor_block(state->B, c, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + c += ISAP_RATE; + clen -= ISAP_RATE; + } + temp = (unsigned)clen; + lw_xor_block(state->B, c, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + + /* Re-key the state and generate the authentication tag */ + memcpy(tag, state->B, ISAP_TAG_SIZE); + memcpy(preserve, state->B + ISAP_TAG_SIZE, sizeof(preserve)); + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA), tag, ISAP_TAG_SIZE); + memcpy(state->B + ISAP_TAG_SIZE, preserve, sizeof(preserve)); + ISAP_PERMUTE(state, ISAP_sH); + memcpy(tag, state->B, ISAP_TAG_SIZE); +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ISAP_TAG_SIZE; + + /* Encrypt the plaintext to produce the ciphertext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, c, m, mlen); + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (&state, k, npub, ad, adlen, c, mlen, c + mlen); + return 0; +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + unsigned char tag[ISAP_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ISAP_TAG_SIZE) + return -1; + *mlen = clen - ISAP_TAG_SIZE; + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac)(&state, k, npub, ad, adlen, c, *mlen, tag); + + /* Decrypt the ciphertext to produce the plaintext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, m, c, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, tag, c + *mlen, ISAP_TAG_SIZE); +} + +#endif /* ISAP_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ISAP algorithm */ +#undef ISAP_ALG_NAME +#undef ISAP_RATE +#undef ISAP_sH +#undef ISAP_sE +#undef ISAP_sB +#undef ISAP_sK +#undef ISAP_STATE +#undef ISAP_PERMUTE +#undef ISAP_CONCAT_INNER +#undef ISAP_CONCAT diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak-avr.S b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.c b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-util.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.c b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.c new file mode 100644 index 0000000..26d50a3 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "isap.h" +#include "internal-keccak.h" +#include "internal-ascon.h" +#include + +aead_cipher_t const isap_keccak_128a_cipher = { + "ISAP-K-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128a_aead_encrypt, + isap_keccak_128a_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128a_cipher = { + "ISAP-A-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128a_aead_encrypt, + isap_ascon_128a_aead_decrypt +}; + +aead_cipher_t const isap_keccak_128_cipher = { + "ISAP-K-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128_aead_encrypt, + isap_keccak_128_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128_cipher = { + "ISAP-A-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128_aead_encrypt, + isap_ascon_128_aead_decrypt +}; + +/* ISAP-K-128A */ +#define ISAP_ALG_NAME isap_keccak_128a +#define ISAP_RATE (144 / 8) +#define ISAP_sH 16 +#define ISAP_sE 8 +#define ISAP_sB 1 +#define ISAP_sK 8 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128A */ +#define ISAP_ALG_NAME isap_ascon_128a +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 6 +#define ISAP_sB 1 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" + +/* ISAP-K-128 */ +#define ISAP_ALG_NAME isap_keccak_128 +#define ISAP_RATE (144 / 8) +#define ISAP_sH 20 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128 */ +#define ISAP_ALG_NAME isap_ascon_128 +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" diff --git a/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.h b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.h new file mode 100644 index 0000000..ddf8203 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128av20/rhys-avr/isap.h @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ISAP_H +#define LWCRYPTO_ISAP_H + +#include "aead-common.h" + +/** + * \file isap.h + * \brief ISAP authenticated encryption algorithm. + * + * ISAP is a family of authenticated encryption algorithms that are built + * around the Keccak-p[400] or ASCON permutations. There are four algorithms + * in the family, each of which have a 128-bit key, a 128-bit nonce, and a + * 128-bit tag: + * + * \li ISAP-K-128A based around the Keccak-p[400] permutation with a + * reduced number of rounds. This is the primary member in the family. + * \li ISAP-A-128A based around the ASCON permutation with a reduced + * number of rounds. + * \li ISAP-K-128 based around the Keccak-p[400] permutation. + * \li ISAP-A-128 based around the ASCON permutation. + * + * ISAP is designed to provide some protection against adversaries + * using differential power analysis to determine the key. The + * downside is that key setup is very slow. + * + * References: https://isap.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all ISAP family members. + */ +#define ISAP_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all ISAP family members. + */ +#define ISAP_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all ISAP family members. + */ +#define ISAP_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the ISAP-K-128A cipher. + */ +extern aead_cipher_t const isap_keccak_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128A cipher. + */ +extern aead_cipher_t const isap_ascon_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-K-128 cipher. + */ +extern aead_cipher_t const isap_keccak_128_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128 cipher. + */ +extern aead_cipher_t const isap_ascon_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128a_aead_decrypt() + */ +int isap_keccak_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128a_aead_encrypt() + */ +int isap_keccak_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128a_aead_decrypt() + */ +int isap_ascon_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128a_aead_encrypt() + */ +int isap_ascon_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128_aead_decrypt() + */ +int isap_keccak_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128_aead_encrypt() + */ +int isap_keccak_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128_aead_decrypt() + */ +int isap_ascon_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128_aead_encrypt() + */ +int isap_ascon_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.c b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/api.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/encrypt.c b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/encrypt.c new file mode 100644 index 0000000..72d2d68 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "isap.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_keccak_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return isap_keccak_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon-avr.S b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon-avr.S new file mode 100644 index 0000000..e8a4fb4 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon-avr.S @@ -0,0 +1,778 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global ascon_permute + .type ascon_permute, @function +ascon_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r18,15 + sub r18,r22 + swap r18 + or r22,r18 + ldd r3,Z+16 + ldd r2,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 +20: + eor r18,r22 + ldd r23,Z+7 + ldd r12,Z+15 + ldd r13,Z+31 + eor r23,r4 + eor r4,r13 + eor r18,r12 + mov r14,r23 + mov r15,r12 + mov r24,r18 + mov r25,r13 + mov r16,r4 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r18 + and r24,r13 + and r25,r4 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r18,r25 + eor r13,r16 + eor r4,r14 + eor r12,r23 + eor r23,r4 + eor r13,r18 + com r18 + std Z+7,r23 + std Z+15,r12 + std Z+31,r13 + std Z+39,r4 + ldd r23,Z+6 + ldd r12,Z+14 + ldd r13,Z+30 + eor r23,r5 + eor r5,r13 + eor r19,r12 + mov r14,r23 + mov r15,r12 + mov r24,r19 + mov r25,r13 + mov r16,r5 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r19 + and r24,r13 + and r25,r5 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r19,r25 + eor r13,r16 + eor r5,r14 + eor r12,r23 + eor r23,r5 + eor r13,r19 + com r19 + std Z+6,r23 + std Z+14,r12 + std Z+30,r13 + std Z+38,r5 + ldd r23,Z+5 + ldd r12,Z+13 + ldd r13,Z+29 + eor r23,r6 + eor r6,r13 + eor r20,r12 + mov r14,r23 + mov r15,r12 + mov r24,r20 + mov r25,r13 + mov r16,r6 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r20 + and r24,r13 + and r25,r6 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r20,r25 + eor r13,r16 + eor r6,r14 + eor r12,r23 + eor r23,r6 + eor r13,r20 + com r20 + std Z+5,r23 + std Z+13,r12 + std Z+29,r13 + std Z+37,r6 + ldd r23,Z+4 + ldd r12,Z+12 + ldd r13,Z+28 + eor r23,r7 + eor r7,r13 + eor r21,r12 + mov r14,r23 + mov r15,r12 + mov r24,r21 + mov r25,r13 + mov r16,r7 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r21 + and r24,r13 + and r25,r7 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r21,r25 + eor r13,r16 + eor r7,r14 + eor r12,r23 + eor r23,r7 + eor r13,r21 + com r21 + std Z+4,r23 + std Z+12,r12 + std Z+28,r13 + std Z+36,r7 + ldd r23,Z+3 + ldd r12,Z+11 + ldd r13,Z+27 + eor r23,r8 + eor r8,r13 + eor r26,r12 + mov r14,r23 + mov r15,r12 + mov r24,r26 + mov r25,r13 + mov r16,r8 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r26 + and r24,r13 + and r25,r8 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r26,r25 + eor r13,r16 + eor r8,r14 + eor r12,r23 + eor r23,r8 + eor r13,r26 + com r26 + std Z+3,r23 + std Z+11,r12 + std Z+27,r13 + std Z+35,r8 + ldd r23,Z+2 + ldd r12,Z+10 + ldd r13,Z+26 + eor r23,r9 + eor r9,r13 + eor r27,r12 + mov r14,r23 + mov r15,r12 + mov r24,r27 + mov r25,r13 + mov r16,r9 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r27 + and r24,r13 + and r25,r9 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r27,r25 + eor r13,r16 + eor r9,r14 + eor r12,r23 + eor r23,r9 + eor r13,r27 + com r27 + std Z+2,r23 + std Z+10,r12 + std Z+26,r13 + std Z+34,r9 + ldd r23,Z+1 + ldd r12,Z+9 + ldd r13,Z+25 + eor r23,r10 + eor r10,r13 + eor r2,r12 + mov r14,r23 + mov r15,r12 + mov r24,r2 + mov r25,r13 + mov r16,r10 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r2 + and r24,r13 + and r25,r10 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r2,r25 + eor r13,r16 + eor r10,r14 + eor r12,r23 + eor r23,r10 + eor r13,r2 + com r2 + std Z+1,r23 + std Z+9,r12 + std Z+25,r13 + std Z+33,r10 + ld r23,Z + ldd r12,Z+8 + ldd r13,Z+24 + eor r23,r11 + eor r11,r13 + eor r3,r12 + mov r14,r23 + mov r15,r12 + mov r24,r3 + mov r25,r13 + mov r16,r11 + com r14 + com r15 + com r24 + com r25 + com r16 + and r14,r12 + and r15,r3 + and r24,r13 + and r25,r11 + and r16,r23 + eor r23,r15 + eor r12,r24 + eor r3,r25 + eor r13,r16 + eor r11,r14 + eor r12,r23 + eor r23,r11 + eor r13,r3 + com r3 + st Z,r23 + std Z+8,r12 + std Z+24,r13 + std Z+32,r11 + ld r11,Z + ldd r10,Z+1 + ldd r9,Z+2 + ldd r8,Z+3 + ldd r7,Z+4 + ldd r6,Z+5 + ldd r5,Z+6 + ldd r4,Z+7 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r14 + mov r14,r24 + mov r24,r16 + mov r16,r0 + mov r0,r13 + mov r13,r15 + mov r15,r25 + mov r25,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r4 + mov r0,r5 + push r6 + mov r4,r7 + mov r5,r8 + mov r6,r9 + mov r7,r10 + mov r8,r11 + pop r11 + mov r10,r0 + mov r9,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + st Z,r11 + std Z+1,r10 + std Z+2,r9 + std Z+3,r8 + std Z+4,r7 + std Z+5,r6 + std Z+6,r5 + std Z+7,r4 + ldd r11,Z+8 + ldd r10,Z+9 + ldd r9,Z+10 + ldd r8,Z+11 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + lsl r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r4,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+8,r11 + std Z+9,r10 + std Z+10,r9 + std Z+11,r8 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + movw r12,r18 + movw r14,r20 + movw r24,r26 + movw r16,r2 + bst r12,0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + bld r17,7 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + eor r24,r26 + eor r25,r27 + eor r16,r2 + eor r17,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r26 + mov r26,r27 + mov r27,r2 + mov r2,r3 + mov r3,r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r2 + rol r3 + adc r18,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r26,r24 + eor r27,r25 + eor r2,r16 + eor r3,r17 + ldd r11,Z+24 + ldd r10,Z+25 + ldd r9,Z+26 + ldd r8,Z+27 + ldd r7,Z+28 + ldd r6,Z+29 + ldd r5,Z+30 + ldd r4,Z+31 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + mov r0,r1 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r0 + or r17,r0 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r0,r4 + mov r4,r6 + mov r6,r8 + mov r8,r10 + mov r10,r0 + mov r0,r5 + mov r5,r7 + mov r7,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + std Z+24,r11 + std Z+25,r10 + std Z+26,r9 + std Z+27,r8 + std Z+28,r7 + std Z+29,r6 + std Z+30,r5 + std Z+31,r4 + ldd r11,Z+32 + ldd r10,Z+33 + ldd r9,Z+34 + ldd r8,Z+35 + ldd r7,Z+36 + ldd r6,Z+37 + ldd r5,Z+38 + ldd r4,Z+39 + movw r12,r4 + movw r14,r6 + movw r24,r8 + movw r16,r10 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r24 + mov r24,r25 + mov r25,r16 + mov r16,r17 + mov r17,r0 + lsl r12 + rol r13 + rol r14 + rol r15 + rol r24 + rol r25 + rol r16 + rol r17 + adc r12,r1 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + mov r23,r9 + mov r0,r10 + push r11 + mov r11,r8 + mov r10,r7 + mov r9,r6 + mov r8,r5 + mov r7,r4 + pop r6 + mov r5,r0 + mov r4,r23 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r0 + or r11,r0 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + subi r22,15 + ldi r25,60 + cpse r22,r25 + rjmp 20b + std Z+16,r3 + std Z+17,r2 + std Z+18,r27 + std Z+19,r26 + std Z+20,r21 + std Z+21,r20 + std Z+22,r19 + std Z+23,r18 + std Z+32,r11 + std Z+33,r10 + std Z+34,r9 + std Z+35,r8 + std Z+36,r7 + std Z+37,r6 + std Z+38,r5 + std Z+39,r4 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size ascon_permute, .-ascon_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.c b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.c new file mode 100644 index 0000000..657aabe --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-ascon.h" + +#if !defined(__AVR__) + +void ascon_permute(ascon_state_t *state, uint8_t first_round) +{ + uint64_t t0, t1, t2, t3, t4; +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = be_load_word64(state->B); + uint64_t x1 = be_load_word64(state->B + 8); + uint64_t x2 = be_load_word64(state->B + 16); + uint64_t x3 = be_load_word64(state->B + 24); + uint64_t x4 = be_load_word64(state->B + 32); +#else + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; +#endif + while (first_round < 12) { + /* Add the round constant to the state */ + x2 ^= ((0x0F - first_round) << 4) | first_round; + + /* Substitution layer - apply the s-box using bit-slicing + * according to the algorithm recommended in the specification */ + x0 ^= x4; x4 ^= x3; x2 ^= x1; + t0 = ~x0; t1 = ~x1; t2 = ~x2; t3 = ~x3; t4 = ~x4; + t0 &= x1; t1 &= x2; t2 &= x3; t3 &= x4; t4 &= x0; + x0 ^= t1; x1 ^= t2; x2 ^= t3; x3 ^= t4; x4 ^= t0; + x1 ^= x0; x0 ^= x4; x3 ^= x2; x2 = ~x2; + + /* Linear diffusion layer */ + x0 ^= rightRotate19_64(x0) ^ rightRotate28_64(x0); + x1 ^= rightRotate61_64(x1) ^ rightRotate39_64(x1); + x2 ^= rightRotate1_64(x2) ^ rightRotate6_64(x2); + x3 ^= rightRotate10_64(x3) ^ rightRotate17_64(x3); + x4 ^= rightRotate7_64(x4) ^ rightRotate41_64(x4); + + /* Move onto the next round */ + ++first_round; + } +#if defined(LW_UTIL_LITTLE_ENDIAN) + be_store_word64(state->B, x0); + be_store_word64(state->B + 8, x1); + be_store_word64(state->B + 16, x2); + be_store_word64(state->B + 24, x3); + be_store_word64(state->B + 32, x4); +#else + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; +#endif +} + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.h new file mode 100644 index 0000000..d3fa3ca --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-ascon.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_ASCON_H +#define LW_INTERNAL_ASCON_H + +#include "internal-util.h" + +/** + * \file internal-ascon.h + * \brief Internal implementation of the ASCON permutation. + * + * References: http://competitions.cr.yp.to/round3/asconv12.pdf, + * http://ascon.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Structure of the internal state of the ASCON permutation. + */ +typedef union +{ + uint64_t S[5]; /**< Words of the state */ + uint8_t B[40]; /**< Bytes of the state */ + +} ascon_state_t; + +/** + * \brief Permutes the ASCON state. + * + * \param state The ASCON state to be permuted. + * \param first_round The first round (of 12) to be performed; 0, 4, or 6. + * + * The input and output \a state will be in big-endian byte order. + */ +void ascon_permute(ascon_state_t *state, uint8_t first_round); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-isap.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-isap.h new file mode 100644 index 0000000..ba99f2a --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-isap.h @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying ISAP variant. + * + * ISAP_ALG_NAME Name of the ISAP algorithm; e.g. isap_keccak_128 + * ISAP_RATE Number of bytes in the rate for hashing and encryption. + * ISAP_sH Number of rounds for hashing. + * ISAP_sE Number of rounds for encryption. + * ISAP_sB Number of rounds for key bit absorption. + * ISAP_sK Number of rounds for keying. + * ISAP_STATE Type for the permuation state; e.g. ascon_state_t + * ISAP_PERMUTE(s,r) Permutes the state "s" with number of rounds "r". + */ +#if defined(ISAP_ALG_NAME) + +#define ISAP_CONCAT_INNER(name,suffix) name##suffix +#define ISAP_CONCAT(name,suffix) ISAP_CONCAT_INNER(name,suffix) + +/* IV string for initialising the associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_A) + [sizeof(ISAP_STATE) - ISAP_NONCE_SIZE] = { + 0x01, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for authenticating associated data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x02, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/* IV string for encrypting payload data */ +static unsigned char const ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE) + [sizeof(ISAP_STATE) - ISAP_KEY_SIZE] = { + 0x03, ISAP_KEY_SIZE * 8, ISAP_RATE * 8, 1, + ISAP_sH, ISAP_sB, ISAP_sE, ISAP_sK +}; + +/** + * \brief Re-keys the ISAP permutation state. + * + * \param state The permutation state to be re-keyed. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param iv Points to the initialization vector for this re-keying operation. + * \param data Points to the data to be absorbed to perform the re-keying. + * \param data_len Length of the data to be absorbed. + * + * The output key will be left in the leading bytes of \a state. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *iv, + const unsigned char *data, unsigned data_len) +{ + unsigned bit, num_bits; + + /* Initialize the state with the key and IV */ + memcpy(state->B, k, ISAP_KEY_SIZE); + memcpy(state->B + ISAP_KEY_SIZE, iv, sizeof(state->B) - ISAP_KEY_SIZE); + ISAP_PERMUTE(state, ISAP_sK); + + /* Absorb all of the bits of the data buffer one by one */ + num_bits = data_len * 8 - 1; + for (bit = 0; bit < num_bits; ++bit) { + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sB); + } + state->B[0] ^= (data[bit / 8] << (bit % 8)) & 0x80; + ISAP_PERMUTE(state, ISAP_sK); +} + +/** + * \brief Encrypts (or decrypts) a message payload with ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param c Buffer to receive the output ciphertext. + * \param m Buffer to receive the input plaintext. + * \param mlen Length of the input plaintext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_encrypt) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Set up the re-keyed encryption key and nonce in the state */ + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KE), npub, ISAP_NONCE_SIZE); + memcpy(state->B + sizeof(ISAP_STATE) - ISAP_NONCE_SIZE, + npub, ISAP_NONCE_SIZE); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= ISAP_RATE) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, ISAP_RATE); + c += ISAP_RATE; + m += ISAP_RATE; + mlen -= ISAP_RATE; + } + if (mlen > 0) { + ISAP_PERMUTE(state, ISAP_sE); + lw_xor_block_2_src(c, state->B, m, (unsigned)mlen); + } +} + +/** + * \brief Authenticates the associated data and ciphertext using ISAP. + * + * \param state ISAP permutation state. + * \param k Points to the 128-bit key for the ISAP cipher. + * \param npub Points to the 128-bit nonce for the ISAP cipher. + * \param ad Buffer containing the associated data. + * \param adlen Length of the associated data. + * \param c Buffer containing the ciphertext. + * \param clen Length of the ciphertext. + */ +static void ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (ISAP_STATE *state, const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *c, unsigned long long clen, + unsigned char *tag) +{ + unsigned char preserve[sizeof(ISAP_STATE) - ISAP_TAG_SIZE]; + unsigned temp; + + /* Absorb the associated data */ + memcpy(state->B, npub, ISAP_NONCE_SIZE); + memcpy(state->B + ISAP_NONCE_SIZE, ISAP_CONCAT(ISAP_ALG_NAME,_IV_A), + sizeof(state->B) - ISAP_NONCE_SIZE); + ISAP_PERMUTE(state, ISAP_sH); + while (adlen >= ISAP_RATE) { + lw_xor_block(state->B, ad, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + ad += ISAP_RATE; + adlen -= ISAP_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + state->B[sizeof(state->B) - 1] ^= 0x01; /* domain separation */ + + /* Absorb the ciphertext */ + while (clen >= ISAP_RATE) { + lw_xor_block(state->B, c, ISAP_RATE); + ISAP_PERMUTE(state, ISAP_sH); + c += ISAP_RATE; + clen -= ISAP_RATE; + } + temp = (unsigned)clen; + lw_xor_block(state->B, c, temp); + state->B[temp] ^= 0x80; /* padding */ + ISAP_PERMUTE(state, ISAP_sH); + + /* Re-key the state and generate the authentication tag */ + memcpy(tag, state->B, ISAP_TAG_SIZE); + memcpy(preserve, state->B + ISAP_TAG_SIZE, sizeof(preserve)); + ISAP_CONCAT(ISAP_ALG_NAME,_rekey) + (state, k, ISAP_CONCAT(ISAP_ALG_NAME,_IV_KA), tag, ISAP_TAG_SIZE); + memcpy(state->B + ISAP_TAG_SIZE, preserve, sizeof(preserve)); + ISAP_PERMUTE(state, ISAP_sH); + memcpy(tag, state->B, ISAP_TAG_SIZE); +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ISAP_TAG_SIZE; + + /* Encrypt the plaintext to produce the ciphertext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, c, m, mlen); + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac) + (&state, k, npub, ad, adlen, c, mlen, c + mlen); + return 0; +} + +int ISAP_CONCAT(ISAP_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + ISAP_STATE state; + unsigned char tag[ISAP_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ISAP_TAG_SIZE) + return -1; + *mlen = clen - ISAP_TAG_SIZE; + + /* Authenticate the associated data and ciphertext to generate the tag */ + ISAP_CONCAT(ISAP_ALG_NAME,_mac)(&state, k, npub, ad, adlen, c, *mlen, tag); + + /* Decrypt the ciphertext to produce the plaintext */ + ISAP_CONCAT(ISAP_ALG_NAME,_encrypt)(&state, k, npub, m, c, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, tag, c + *mlen, ISAP_TAG_SIZE); +} + +#endif /* ISAP_ALG_NAME */ + +/* Now undefine everything so that we can include this file again for + * another variant on the ISAP algorithm */ +#undef ISAP_ALG_NAME +#undef ISAP_RATE +#undef ISAP_sH +#undef ISAP_sE +#undef ISAP_sB +#undef ISAP_sK +#undef ISAP_STATE +#undef ISAP_PERMUTE +#undef ISAP_CONCAT_INNER +#undef ISAP_CONCAT diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak-avr.S b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak-avr.S new file mode 100644 index 0000000..e50ccaf --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak-avr.S @@ -0,0 +1,1552 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global keccakp_200_permute + .type keccakp_200_permute, @function +keccakp_200_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r26,Z+6 + ldd r27,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r4,Z+12 + ldd r5,Z+13 + ldd r6,Z+14 + ldd r7,Z+15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + ldd r24,Z+24 + push r31 + push r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,130 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + mov r30,r1 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,1 + eor r18,r30 + rcall 82f + ldi r30,129 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,138 + eor r18,r30 + rcall 82f + ldi r30,136 + eor r18,r30 + rcall 82f + ldi r30,9 + eor r18,r30 + rcall 82f + ldi r30,10 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,139 + eor r18,r30 + rcall 82f + ldi r30,137 + eor r18,r30 + rcall 82f + ldi r30,3 + eor r18,r30 + rcall 82f + ldi r30,2 + eor r18,r30 + rcall 82f + ldi r30,128 + eor r18,r30 + rjmp 420f +82: + mov r30,r18 + eor r30,r23 + eor r30,r2 + eor r30,r7 + eor r30,r12 + mov r31,r19 + eor r31,r26 + eor r31,r3 + eor r31,r8 + eor r31,r13 + mov r25,r20 + eor r25,r27 + eor r25,r4 + eor r25,r9 + eor r25,r14 + mov r16,r21 + eor r16,r28 + eor r16,r5 + eor r16,r10 + eor r16,r15 + mov r17,r22 + eor r17,r29 + eor r17,r6 + eor r17,r11 + eor r17,r24 + mov r0,r31 + lsl r0 + adc r0,r1 + eor r0,r17 + eor r18,r0 + eor r23,r0 + eor r2,r0 + eor r7,r0 + eor r12,r0 + mov r0,r25 + lsl r0 + adc r0,r1 + eor r0,r30 + eor r19,r0 + eor r26,r0 + eor r3,r0 + eor r8,r0 + eor r13,r0 + mov r0,r16 + lsl r0 + adc r0,r1 + eor r0,r31 + eor r20,r0 + eor r27,r0 + eor r4,r0 + eor r9,r0 + eor r14,r0 + mov r0,r17 + lsl r0 + adc r0,r1 + eor r0,r25 + eor r21,r0 + eor r28,r0 + eor r5,r0 + eor r10,r0 + eor r15,r0 + mov r0,r30 + lsl r0 + adc r0,r1 + eor r0,r16 + eor r22,r0 + eor r29,r0 + eor r6,r0 + eor r11,r0 + eor r24,r0 + mov r30,r19 + swap r26 + mov r19,r26 + swap r29 + mov r26,r29 + mov r0,r1 + lsr r14 + ror r0 + lsr r14 + ror r0 + lsr r14 + ror r0 + or r14,r0 + mov r29,r14 + bst r6,0 + lsr r6 + bld r6,7 + mov r14,r6 + lsl r12 + adc r12,r1 + lsl r12 + adc r12,r1 + mov r6,r12 + mov r0,r1 + lsr r20 + ror r0 + lsr r20 + ror r0 + or r20,r0 + mov r12,r20 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + mov r20,r4 + lsl r5 + adc r5,r1 + mov r4,r5 + mov r5,r11 + mov r11,r15 + lsl r7 + adc r7,r1 + mov r15,r7 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + mov r7,r22 + mov r0,r1 + lsr r24 + ror r0 + lsr r24 + ror r0 + or r24,r0 + mov r22,r24 + lsl r13 + adc r13,r1 + lsl r13 + adc r13,r1 + mov r24,r13 + bst r28,0 + lsr r28 + bld r28,7 + mov r13,r28 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r28,r8 + swap r23 + mov r8,r23 + swap r21 + mov r23,r21 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r21,r10 + bst r9,0 + lsr r9 + bld r9,7 + mov r10,r9 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + mov r9,r3 + mov r0,r1 + lsr r27 + ror r0 + lsr r27 + ror r0 + or r27,r0 + mov r3,r27 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + mov r27,r2 + lsl r30 + adc r30,r1 + mov r2,r30 + mov r30,r18 + mov r31,r19 + mov r25,r20 + mov r16,r21 + mov r17,r22 + mov r18,r25 + mov r0,r31 + com r0 + and r18,r0 + eor r18,r30 + mov r19,r16 + mov r0,r25 + com r0 + and r19,r0 + eor r19,r31 + mov r20,r17 + mov r0,r16 + com r0 + and r20,r0 + eor r20,r25 + mov r21,r30 + mov r0,r17 + com r0 + and r21,r0 + eor r21,r16 + mov r22,r31 + mov r0,r30 + com r0 + and r22,r0 + eor r22,r17 + mov r30,r23 + mov r31,r26 + mov r25,r27 + mov r16,r28 + mov r17,r29 + mov r23,r25 + mov r0,r31 + com r0 + and r23,r0 + eor r23,r30 + mov r26,r16 + mov r0,r25 + com r0 + and r26,r0 + eor r26,r31 + mov r27,r17 + mov r0,r16 + com r0 + and r27,r0 + eor r27,r25 + mov r28,r30 + mov r0,r17 + com r0 + and r28,r0 + eor r28,r16 + mov r29,r31 + mov r0,r30 + com r0 + and r29,r0 + eor r29,r17 + mov r30,r2 + mov r31,r3 + mov r25,r4 + mov r16,r5 + mov r17,r6 + mov r2,r25 + mov r0,r31 + com r0 + and r2,r0 + eor r2,r30 + mov r3,r16 + mov r0,r25 + com r0 + and r3,r0 + eor r3,r31 + mov r4,r17 + mov r0,r16 + com r0 + and r4,r0 + eor r4,r25 + mov r5,r30 + mov r0,r17 + com r0 + and r5,r0 + eor r5,r16 + mov r6,r31 + mov r0,r30 + com r0 + and r6,r0 + eor r6,r17 + mov r30,r7 + mov r31,r8 + mov r25,r9 + mov r16,r10 + mov r17,r11 + mov r7,r25 + mov r0,r31 + com r0 + and r7,r0 + eor r7,r30 + mov r8,r16 + mov r0,r25 + com r0 + and r8,r0 + eor r8,r31 + mov r9,r17 + mov r0,r16 + com r0 + and r9,r0 + eor r9,r25 + mov r10,r30 + mov r0,r17 + com r0 + and r10,r0 + eor r10,r16 + mov r11,r31 + mov r0,r30 + com r0 + and r11,r0 + eor r11,r17 + mov r30,r12 + mov r31,r13 + mov r25,r14 + mov r16,r15 + mov r17,r24 + mov r12,r25 + mov r0,r31 + com r0 + and r12,r0 + eor r12,r30 + mov r13,r16 + mov r0,r25 + com r0 + and r13,r0 + eor r13,r31 + mov r14,r17 + mov r0,r16 + com r0 + and r14,r0 + eor r14,r25 + mov r15,r30 + mov r0,r17 + com r0 + and r15,r0 + eor r15,r16 + mov r24,r31 + mov r0,r30 + com r0 + and r24,r0 + eor r24,r17 + ret +420: + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r22 + std Z+5,r23 + std Z+6,r26 + std Z+7,r27 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r4 + std Z+13,r5 + std Z+14,r6 + std Z+15,r7 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + std Z+24,r24 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size keccakp_200_permute, .-keccakp_200_permute + + .text +.global keccakp_400_permute + .type keccakp_400_permute, @function +keccakp_400_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + movw r30,r24 +.L__stack_usage = 17 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + ldd r10,Z+4 + ldd r11,Z+5 + ldd r12,Z+6 + ldd r13,Z+7 + ldd r14,Z+8 + ldd r15,Z+9 + cpi r22,20 + brcs 15f + rcall 153f + ldi r23,1 + eor r6,r23 +15: + cpi r22,19 + brcs 23f + rcall 153f + ldi r23,130 + eor r6,r23 + ldi r17,128 + eor r7,r17 +23: + cpi r22,18 + brcs 31f + rcall 153f + ldi r23,138 + eor r6,r23 + ldi r17,128 + eor r7,r17 +31: + cpi r22,17 + brcs 37f + rcall 153f + ldi r23,128 + eor r7,r23 +37: + cpi r22,16 + brcs 45f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +45: + cpi r22,15 + brcs 51f + rcall 153f + ldi r23,1 + eor r6,r23 +51: + cpi r22,14 + brcs 59f + rcall 153f + ldi r23,129 + eor r6,r23 + ldi r17,128 + eor r7,r17 +59: + cpi r22,13 + brcs 67f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +67: + cpi r22,12 + brcs 73f + rcall 153f + ldi r23,138 + eor r6,r23 +73: + cpi r22,11 + brcs 79f + rcall 153f + ldi r23,136 + eor r6,r23 +79: + cpi r22,10 + brcs 87f + rcall 153f + ldi r23,9 + eor r6,r23 + ldi r17,128 + eor r7,r17 +87: + cpi r22,9 + brcs 93f + rcall 153f + ldi r23,10 + eor r6,r23 +93: + cpi r22,8 + brcs 101f + rcall 153f + ldi r23,139 + eor r6,r23 + ldi r17,128 + eor r7,r17 +101: + cpi r22,7 + brcs 107f + rcall 153f + ldi r23,139 + eor r6,r23 +107: + cpi r22,6 + brcs 115f + rcall 153f + ldi r23,137 + eor r6,r23 + ldi r17,128 + eor r7,r17 +115: + cpi r22,5 + brcs 123f + rcall 153f + ldi r23,3 + eor r6,r23 + ldi r17,128 + eor r7,r17 +123: + cpi r22,4 + brcs 131f + rcall 153f + ldi r23,2 + eor r6,r23 + ldi r17,128 + eor r7,r17 +131: + cpi r22,3 + brcs 137f + rcall 153f + ldi r23,128 + eor r6,r23 +137: + cpi r22,2 + brcs 145f + rcall 153f + ldi r23,10 + eor r6,r23 + ldi r17,128 + eor r7,r17 +145: + cpi r22,1 + brcs 151f + rcall 153f + ldi r23,10 + eor r6,r23 +151: + rjmp 1004f +153: + movw r18,r6 + ldd r0,Z+10 + eor r18,r0 + ldd r0,Z+11 + eor r19,r0 + ldd r0,Z+20 + eor r18,r0 + ldd r0,Z+21 + eor r19,r0 + ldd r0,Z+30 + eor r18,r0 + ldd r0,Z+31 + eor r19,r0 + ldd r0,Z+40 + eor r18,r0 + ldd r0,Z+41 + eor r19,r0 + movw r20,r8 + ldd r0,Z+12 + eor r20,r0 + ldd r0,Z+13 + eor r21,r0 + ldd r0,Z+22 + eor r20,r0 + ldd r0,Z+23 + eor r21,r0 + ldd r0,Z+32 + eor r20,r0 + ldd r0,Z+33 + eor r21,r0 + ldd r0,Z+42 + eor r20,r0 + ldd r0,Z+43 + eor r21,r0 + movw r26,r10 + ldd r0,Z+14 + eor r26,r0 + ldd r0,Z+15 + eor r27,r0 + ldd r0,Z+24 + eor r26,r0 + ldd r0,Z+25 + eor r27,r0 + ldd r0,Z+34 + eor r26,r0 + ldd r0,Z+35 + eor r27,r0 + ldd r0,Z+44 + eor r26,r0 + ldd r0,Z+45 + eor r27,r0 + movw r2,r12 + ldd r0,Z+16 + eor r2,r0 + ldd r0,Z+17 + eor r3,r0 + ldd r0,Z+26 + eor r2,r0 + ldd r0,Z+27 + eor r3,r0 + ldd r0,Z+36 + eor r2,r0 + ldd r0,Z+37 + eor r3,r0 + ldd r0,Z+46 + eor r2,r0 + ldd r0,Z+47 + eor r3,r0 + movw r4,r14 + ldd r0,Z+18 + eor r4,r0 + ldd r0,Z+19 + eor r5,r0 + ldd r0,Z+28 + eor r4,r0 + ldd r0,Z+29 + eor r5,r0 + ldd r0,Z+38 + eor r4,r0 + ldd r0,Z+39 + eor r5,r0 + ldd r0,Z+48 + eor r4,r0 + ldd r0,Z+49 + eor r5,r0 + movw r24,r20 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r4 + eor r25,r5 + eor r6,r24 + eor r7,r25 + ldd r0,Z+10 + eor r0,r24 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r25 + std Z+11,r0 + ldd r0,Z+20 + eor r0,r24 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r25 + std Z+21,r0 + ldd r0,Z+30 + eor r0,r24 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r25 + std Z+31,r0 + ldd r0,Z+40 + eor r0,r24 + std Z+40,r0 + ldd r0,Z+41 + eor r0,r25 + std Z+41,r0 + movw r24,r26 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r18 + eor r25,r19 + eor r8,r24 + eor r9,r25 + ldd r0,Z+12 + eor r0,r24 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r25 + std Z+13,r0 + ldd r0,Z+22 + eor r0,r24 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r25 + std Z+23,r0 + ldd r0,Z+32 + eor r0,r24 + std Z+32,r0 + ldd r0,Z+33 + eor r0,r25 + std Z+33,r0 + ldd r0,Z+42 + eor r0,r24 + std Z+42,r0 + ldd r0,Z+43 + eor r0,r25 + std Z+43,r0 + movw r24,r2 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r20 + eor r25,r21 + eor r10,r24 + eor r11,r25 + ldd r0,Z+14 + eor r0,r24 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r25 + std Z+15,r0 + ldd r0,Z+24 + eor r0,r24 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r25 + std Z+25,r0 + ldd r0,Z+34 + eor r0,r24 + std Z+34,r0 + ldd r0,Z+35 + eor r0,r25 + std Z+35,r0 + ldd r0,Z+44 + eor r0,r24 + std Z+44,r0 + ldd r0,Z+45 + eor r0,r25 + std Z+45,r0 + movw r24,r4 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r26 + eor r25,r27 + eor r12,r24 + eor r13,r25 + ldd r0,Z+16 + eor r0,r24 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r25 + std Z+17,r0 + ldd r0,Z+26 + eor r0,r24 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r25 + std Z+27,r0 + ldd r0,Z+36 + eor r0,r24 + std Z+36,r0 + ldd r0,Z+37 + eor r0,r25 + std Z+37,r0 + ldd r0,Z+46 + eor r0,r24 + std Z+46,r0 + ldd r0,Z+47 + eor r0,r25 + std Z+47,r0 + movw r24,r18 + lsl r24 + rol r25 + adc r24,r1 + eor r24,r2 + eor r25,r3 + eor r14,r24 + eor r15,r25 + ldd r0,Z+18 + eor r0,r24 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r25 + std Z+19,r0 + ldd r0,Z+28 + eor r0,r24 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r25 + std Z+29,r0 + ldd r0,Z+38 + eor r0,r24 + std Z+38,r0 + ldd r0,Z+39 + eor r0,r25 + std Z+39,r0 + ldd r0,Z+48 + eor r0,r24 + std Z+48,r0 + ldd r0,Z+49 + eor r0,r25 + std Z+49,r0 + movw r24,r8 + ldd r8,Z+12 + ldd r9,Z+13 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldd r18,Z+18 + ldd r19,Z+19 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+12,r18 + std Z+13,r19 + ldd r18,Z+44 + ldd r19,Z+45 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+18,r18 + std Z+19,r19 + ldd r18,Z+28 + ldd r19,Z+29 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+44,r18 + std Z+45,r19 + ldd r18,Z+40 + ldd r19,Z+41 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+28,r18 + std Z+29,r19 + movw r18,r10 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+40,r18 + std Z+41,r19 + ldd r10,Z+24 + ldd r11,Z+25 + mov r0,r11 + mov r11,r10 + mov r10,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldd r18,Z+26 + ldd r19,Z+27 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+24,r18 + std Z+25,r19 + ldd r18,Z+38 + ldd r19,Z+39 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+26,r18 + std Z+27,r19 + ldd r18,Z+46 + ldd r19,Z+47 + mov r0,r19 + mov r19,r18 + mov r18,r0 + std Z+38,r18 + std Z+39,r19 + ldd r18,Z+30 + ldd r19,Z+31 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + std Z+46,r18 + std Z+47,r19 + movw r18,r14 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+30,r18 + std Z+31,r19 + ldd r14,Z+48 + ldd r15,Z+49 + mov r0,r1 + lsr r15 + ror r14 + ror r0 + lsr r15 + ror r14 + ror r0 + or r15,r0 + ldd r18,Z+42 + ldd r19,Z+43 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+48,r18 + std Z+49,r19 + ldd r18,Z+16 + ldd r19,Z+17 + mov r0,r19 + mov r19,r18 + mov r18,r0 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+42,r18 + std Z+43,r19 + ldd r18,Z+32 + ldd r19,Z+33 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+16,r18 + std Z+17,r19 + ldd r18,Z+10 + ldd r19,Z+11 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+32,r18 + std Z+33,r19 + movw r18,r12 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+10,r18 + std Z+11,r19 + ldd r12,Z+36 + ldd r13,Z+37 + mov r0,r13 + mov r13,r12 + mov r12,r0 + mov r0,r1 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + lsr r13 + ror r12 + ror r0 + or r13,r0 + ldd r18,Z+34 + ldd r19,Z+35 + bst r18,0 + lsr r19 + ror r18 + bld r19,7 + std Z+36,r18 + std Z+37,r19 + ldd r18,Z+22 + ldd r19,Z+23 + mov r0,r19 + mov r19,r18 + mov r18,r0 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+34,r18 + std Z+35,r19 + ldd r18,Z+14 + ldd r19,Z+15 + mov r0,r19 + mov r19,r18 + mov r18,r0 + mov r0,r1 + lsr r19 + ror r18 + ror r0 + lsr r19 + ror r18 + ror r0 + or r19,r0 + std Z+22,r18 + std Z+23,r19 + ldd r18,Z+20 + ldd r19,Z+21 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + lsl r18 + rol r19 + adc r18,r1 + std Z+14,r18 + std Z+15,r19 + lsl r24 + rol r25 + adc r24,r1 + std Z+20,r24 + std Z+21,r25 + movw r18,r6 + movw r20,r8 + movw r26,r10 + movw r2,r12 + movw r4,r14 + movw r6,r26 + mov r0,r20 + com r0 + and r6,r0 + mov r0,r21 + com r0 + and r7,r0 + eor r6,r18 + eor r7,r19 + movw r8,r2 + mov r0,r26 + com r0 + and r8,r0 + mov r0,r27 + com r0 + and r9,r0 + eor r8,r20 + eor r9,r21 + movw r10,r4 + mov r0,r2 + com r0 + and r10,r0 + mov r0,r3 + com r0 + and r11,r0 + eor r10,r26 + eor r11,r27 + movw r12,r18 + mov r0,r4 + com r0 + and r12,r0 + mov r0,r5 + com r0 + and r13,r0 + eor r12,r2 + eor r13,r3 + movw r14,r20 + mov r0,r18 + com r0 + and r14,r0 + mov r0,r19 + com r0 + and r15,r0 + eor r14,r4 + eor r15,r5 + ldd r18,Z+10 + ldd r19,Z+11 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r26,Z+14 + ldd r27,Z+15 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+10,r24 + std Z+11,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+12,r24 + std Z+13,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+14,r24 + std Z+15,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+16,r24 + std Z+17,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+18,r24 + std Z+19,r25 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+20,r24 + std Z+21,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+22,r24 + std Z+23,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+24,r24 + std Z+25,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+26,r24 + std Z+27,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+28,r24 + std Z+29,r25 + ldd r18,Z+30 + ldd r19,Z+31 + ldd r20,Z+32 + ldd r21,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+30,r24 + std Z+31,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+32,r24 + std Z+33,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+34,r24 + std Z+35,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+36,r24 + std Z+37,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+38,r24 + std Z+39,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + ldd r26,Z+44 + ldd r27,Z+45 + ldd r2,Z+46 + ldd r3,Z+47 + ldd r4,Z+48 + ldd r5,Z+49 + movw r24,r26 + mov r0,r20 + com r0 + and r24,r0 + mov r0,r21 + com r0 + and r25,r0 + eor r24,r18 + eor r25,r19 + std Z+40,r24 + std Z+41,r25 + movw r24,r2 + mov r0,r26 + com r0 + and r24,r0 + mov r0,r27 + com r0 + and r25,r0 + eor r24,r20 + eor r25,r21 + std Z+42,r24 + std Z+43,r25 + movw r24,r4 + mov r0,r2 + com r0 + and r24,r0 + mov r0,r3 + com r0 + and r25,r0 + eor r24,r26 + eor r25,r27 + std Z+44,r24 + std Z+45,r25 + movw r24,r18 + mov r0,r4 + com r0 + and r24,r0 + mov r0,r5 + com r0 + and r25,r0 + eor r24,r2 + eor r25,r3 + std Z+46,r24 + std Z+47,r25 + movw r24,r20 + mov r0,r18 + com r0 + and r24,r0 + mov r0,r19 + com r0 + and r25,r0 + eor r24,r4 + eor r25,r5 + std Z+48,r24 + std Z+49,r25 + ret +1004: + st Z,r6 + std Z+1,r7 + std Z+2,r8 + std Z+3,r9 + std Z+4,r10 + std Z+5,r11 + std Z+6,r12 + std Z+7,r13 + std Z+8,r14 + std Z+9,r15 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size keccakp_400_permute, .-keccakp_400_permute + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.c b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.c new file mode 100644 index 0000000..60539df --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.c @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-keccak.h" + +#if !defined(__AVR__) + +/* Faster method to compute ((x + y) % 5) that avoids the division */ +static unsigned char const addMod5Table[9] = { + 0, 1, 2, 3, 4, 0, 1, 2, 3 +}; +#define addMod5(x, y) (addMod5Table[(x) + (y)]) + +void keccakp_200_permute(keccakp_200_state_t *state) +{ + static uint8_t const RC[18] = { + 0x01, 0x82, 0x8A, 0x00, 0x8B, 0x01, 0x81, 0x09, + 0x8A, 0x88, 0x09, 0x0A, 0x8B, 0x8B, 0x89, 0x03, + 0x02, 0x80 + }; + uint8_t C[5]; + uint8_t D; + unsigned round; + unsigned index, index2; + for (round = 0; round < 18; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_8(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate4_8(state->A[1][1]); + state->A[1][1] = leftRotate4_8(state->A[1][4]); + state->A[1][4] = leftRotate5_8(state->A[4][2]); + state->A[4][2] = leftRotate7_8(state->A[2][4]); + state->A[2][4] = leftRotate2_8(state->A[4][0]); + state->A[4][0] = leftRotate6_8(state->A[0][2]); + state->A[0][2] = leftRotate3_8(state->A[2][2]); + state->A[2][2] = leftRotate1_8(state->A[2][3]); + state->A[2][3] = state->A[3][4]; + state->A[3][4] = state->A[4][3]; + state->A[4][3] = leftRotate1_8(state->A[3][0]); + state->A[3][0] = leftRotate3_8(state->A[0][4]); + state->A[0][4] = leftRotate6_8(state->A[4][4]); + state->A[4][4] = leftRotate2_8(state->A[4][1]); + state->A[4][1] = leftRotate7_8(state->A[1][3]); + state->A[1][3] = leftRotate5_8(state->A[3][1]); + state->A[3][1] = leftRotate4_8(state->A[1][0]); + state->A[1][0] = leftRotate4_8(state->A[0][3]); + state->A[0][3] = leftRotate5_8(state->A[3][3]); + state->A[3][3] = leftRotate7_8(state->A[3][2]); + state->A[3][2] = leftRotate2_8(state->A[2][1]); + state->A[2][1] = leftRotate6_8(state->A[1][2]); + state->A[1][2] = leftRotate3_8(state->A[2][0]); + state->A[2][0] = leftRotate1_8(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define keccakp_400_permute_host keccakp_400_permute +#endif + +/* Keccak-p[400] that assumes that the input is already in host byte order */ +void keccakp_400_permute_host(keccakp_400_state_t *state, unsigned rounds) +{ + static uint16_t const RC[20] = { + 0x0001, 0x8082, 0x808A, 0x8000, 0x808B, 0x0001, 0x8081, 0x8009, + 0x008A, 0x0088, 0x8009, 0x000A, 0x808B, 0x008B, 0x8089, 0x8003, + 0x8002, 0x0080, 0x800A, 0x000A + }; + uint16_t C[5]; + uint16_t D; + unsigned round; + unsigned index, index2; + for (round = 20 - rounds; round < 20; ++round) { + /* Step mapping theta. The specification mentions two temporary + * arrays of size 5 called C and D. Compute D on the fly */ + for (index = 0; index < 5; ++index) { + C[index] = state->A[0][index] ^ state->A[1][index] ^ + state->A[2][index] ^ state->A[3][index] ^ + state->A[4][index]; + } + for (index = 0; index < 5; ++index) { + D = C[addMod5(index, 4)] ^ + leftRotate1_16(C[addMod5(index, 1)]); + for (index2 = 0; index2 < 5; ++index2) + state->A[index2][index] ^= D; + } + + /* Step mapping rho and pi combined into a single step. + * Rotate all lanes by a specific offset and rearrange */ + D = state->A[0][1]; + state->A[0][1] = leftRotate12_16(state->A[1][1]); + state->A[1][1] = leftRotate4_16 (state->A[1][4]); + state->A[1][4] = leftRotate13_16(state->A[4][2]); + state->A[4][2] = leftRotate7_16 (state->A[2][4]); + state->A[2][4] = leftRotate2_16 (state->A[4][0]); + state->A[4][0] = leftRotate14_16(state->A[0][2]); + state->A[0][2] = leftRotate11_16(state->A[2][2]); + state->A[2][2] = leftRotate9_16 (state->A[2][3]); + state->A[2][3] = leftRotate8_16 (state->A[3][4]); + state->A[3][4] = leftRotate8_16 (state->A[4][3]); + state->A[4][3] = leftRotate9_16 (state->A[3][0]); + state->A[3][0] = leftRotate11_16(state->A[0][4]); + state->A[0][4] = leftRotate14_16(state->A[4][4]); + state->A[4][4] = leftRotate2_16 (state->A[4][1]); + state->A[4][1] = leftRotate7_16 (state->A[1][3]); + state->A[1][3] = leftRotate13_16(state->A[3][1]); + state->A[3][1] = leftRotate4_16 (state->A[1][0]); + state->A[1][0] = leftRotate12_16(state->A[0][3]); + state->A[0][3] = leftRotate5_16 (state->A[3][3]); + state->A[3][3] = leftRotate15_16(state->A[3][2]); + state->A[3][2] = leftRotate10_16(state->A[2][1]); + state->A[2][1] = leftRotate6_16 (state->A[1][2]); + state->A[1][2] = leftRotate3_16 (state->A[2][0]); + state->A[2][0] = leftRotate1_16(D); + + /* Step mapping chi. Combine each lane with two others in its row */ + for (index = 0; index < 5; ++index) { + C[0] = state->A[index][0]; + C[1] = state->A[index][1]; + C[2] = state->A[index][2]; + C[3] = state->A[index][3]; + C[4] = state->A[index][4]; + for (index2 = 0; index2 < 5; ++index2) { + state->A[index][index2] = + C[index2] ^ + ((~C[addMod5(index2, 1)]) & C[addMod5(index2, 2)]); + } + } + + /* Step mapping iota. XOR A[0][0] with the round constant */ + state->A[0][0] ^= RC[round]; + } +} + +#if !defined(LW_UTIL_LITTLE_ENDIAN) + +/** + * \brief Reverses the bytes in a Keccak-p[400] state. + * + * \param state The Keccak-p[400] state to apply byte-reversal to. + */ +static void keccakp_400_reverse_bytes(keccakp_400_state_t *state) +{ + unsigned index; + unsigned char temp1; + unsigned char temp2; + for (index = 0; index < 50; index += 2) { + temp1 = state->B[index]; + temp2 = state->B[index + 1]; + state->B[index] = temp2; + state->B[index + 1] = temp1; + } +} + +/* Keccak-p[400] that requires byte reversal on input and output */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds) +{ + keccakp_400_reverse_bytes(state); + keccakp_400_permute_host(state, rounds); + keccakp_400_reverse_bytes(state); +} + +#endif + +#endif /* !__AVR__ */ diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.h new file mode 100644 index 0000000..2ffef42 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-keccak.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KECCAK_H +#define LW_INTERNAL_KECCAK_H + +#include "internal-util.h" + +/** + * \file internal-keccak.h + * \brief Internal implementation of the Keccak-p permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for the Keccak-p[200] permutation. + */ +#define KECCAKP_200_STATE_SIZE 25 + +/** + * \brief Size of the state for the Keccak-p[400] permutation. + */ +#define KECCAKP_400_STATE_SIZE 50 + +/** + * \brief Structure of the internal state of the Keccak-p[200] permutation. + */ +typedef union +{ + uint8_t A[5][5]; /**< Keccak-p[200] state as a 5x5 array of lanes */ + uint8_t B[25]; /**< Keccak-p[200] state as a byte array */ + +} keccakp_200_state_t; + +/** + * \brief Structure of the internal state of the Keccak-p[400] permutation. + */ +typedef union +{ + uint16_t A[5][5]; /**< Keccak-p[400] state as a 5x5 array of lanes */ + uint8_t B[50]; /**< Keccak-p[400] state as a byte array */ + +} keccakp_400_state_t; + +/** + * \brief Permutes the Keccak-p[200] state. + * + * \param state The Keccak-p[200] state to be permuted. + */ +void keccakp_200_permute(keccakp_200_state_t *state); + +/** + * \brief Permutes the Keccak-p[400] state, which is assumed to be in + * little-endian byte order. + * + * \param state The Keccak-p[400] state to be permuted. + * \param rounds The number of rounds to perform (up to 20). + */ +void keccakp_400_permute(keccakp_400_state_t *state, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-util.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.c b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.c new file mode 100644 index 0000000..26d50a3 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "isap.h" +#include "internal-keccak.h" +#include "internal-ascon.h" +#include + +aead_cipher_t const isap_keccak_128a_cipher = { + "ISAP-K-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128a_aead_encrypt, + isap_keccak_128a_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128a_cipher = { + "ISAP-A-128A", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128a_aead_encrypt, + isap_ascon_128a_aead_decrypt +}; + +aead_cipher_t const isap_keccak_128_cipher = { + "ISAP-K-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_keccak_128_aead_encrypt, + isap_keccak_128_aead_decrypt +}; + +aead_cipher_t const isap_ascon_128_cipher = { + "ISAP-A-128", + ISAP_KEY_SIZE, + ISAP_NONCE_SIZE, + ISAP_TAG_SIZE, + AEAD_FLAG_NONE, + isap_ascon_128_aead_encrypt, + isap_ascon_128_aead_decrypt +}; + +/* ISAP-K-128A */ +#define ISAP_ALG_NAME isap_keccak_128a +#define ISAP_RATE (144 / 8) +#define ISAP_sH 16 +#define ISAP_sE 8 +#define ISAP_sB 1 +#define ISAP_sK 8 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128A */ +#define ISAP_ALG_NAME isap_ascon_128a +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 6 +#define ISAP_sB 1 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" + +/* ISAP-K-128 */ +#define ISAP_ALG_NAME isap_keccak_128 +#define ISAP_RATE (144 / 8) +#define ISAP_sH 20 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE keccakp_400_state_t +#define ISAP_PERMUTE(s,r) keccakp_400_permute((s), (r)) +#include "internal-isap.h" + +/* ISAP-A-128 */ +#define ISAP_ALG_NAME isap_ascon_128 +#define ISAP_RATE (64 / 8) +#define ISAP_sH 12 +#define ISAP_sE 12 +#define ISAP_sB 12 +#define ISAP_sK 12 +#define ISAP_STATE ascon_state_t +#define ISAP_PERMUTE(s,r) ascon_permute((s), 12 - (r)) +#include "internal-isap.h" diff --git a/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.h b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.h new file mode 100644 index 0000000..ddf8203 --- /dev/null +++ b/isap/Implementations/crypto_aead/isapk128v20/rhys-avr/isap.h @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ISAP_H +#define LWCRYPTO_ISAP_H + +#include "aead-common.h" + +/** + * \file isap.h + * \brief ISAP authenticated encryption algorithm. + * + * ISAP is a family of authenticated encryption algorithms that are built + * around the Keccak-p[400] or ASCON permutations. There are four algorithms + * in the family, each of which have a 128-bit key, a 128-bit nonce, and a + * 128-bit tag: + * + * \li ISAP-K-128A based around the Keccak-p[400] permutation with a + * reduced number of rounds. This is the primary member in the family. + * \li ISAP-A-128A based around the ASCON permutation with a reduced + * number of rounds. + * \li ISAP-K-128 based around the Keccak-p[400] permutation. + * \li ISAP-A-128 based around the ASCON permutation. + * + * ISAP is designed to provide some protection against adversaries + * using differential power analysis to determine the key. The + * downside is that key setup is very slow. + * + * References: https://isap.iaik.tugraz.at/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all ISAP family members. + */ +#define ISAP_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all ISAP family members. + */ +#define ISAP_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all ISAP family members. + */ +#define ISAP_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the ISAP-K-128A cipher. + */ +extern aead_cipher_t const isap_keccak_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128A cipher. + */ +extern aead_cipher_t const isap_ascon_128a_cipher; + +/** + * \brief Meta-information block for the ISAP-K-128 cipher. + */ +extern aead_cipher_t const isap_keccak_128_cipher; + +/** + * \brief Meta-information block for the ISAP-A-128 cipher. + */ +extern aead_cipher_t const isap_ascon_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128a_aead_decrypt() + */ +int isap_keccak_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128a_aead_encrypt() + */ +int isap_keccak_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128A. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128a_aead_decrypt() + */ +int isap_ascon_128a_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128A. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128a_aead_encrypt() + */ +int isap_ascon_128a_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-K-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_keccak_128_aead_decrypt() + */ +int isap_keccak_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-K-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_keccak_128_aead_encrypt() + */ +int isap_keccak_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with ISAP-A-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa isap_ascon_128_aead_decrypt() + */ +int isap_ascon_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ISAP-A-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa isap_ascon_128_aead_encrypt() + */ +int isap_ascon_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.c b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.h b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/api.h b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/encrypt.c b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..0d644de --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "knot.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_128_256_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_128_256_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.c b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.h b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-util.h b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot-aead.c b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot-aead.c new file mode 100644 index 0000000..5825f01 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot-aead.c @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_cipher_t const knot_aead_128_256_cipher = { + "KNOT-AEAD-128-256", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_256_encrypt, + knot_aead_128_256_decrypt +}; + +aead_cipher_t const knot_aead_128_384_cipher = { + "KNOT-AEAD-128-384", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_384_encrypt, + knot_aead_128_384_decrypt +}; + +aead_cipher_t const knot_aead_192_384_cipher = { + "KNOT-AEAD-192-384", + KNOT_AEAD_192_KEY_SIZE, + KNOT_AEAD_192_NONCE_SIZE, + KNOT_AEAD_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_192_384_encrypt, + knot_aead_192_384_decrypt +}; + +aead_cipher_t const knot_aead_256_512_cipher = { + "KNOT-AEAD-256-512", + KNOT_AEAD_256_KEY_SIZE, + KNOT_AEAD_256_NONCE_SIZE, + KNOT_AEAD_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_256_512_encrypt, + knot_aead_256_512_decrypt +}; + +/** + * \brief Rate for KNOT-AEAD-128-256. + */ +#define KNOT_AEAD_128_256_RATE 8 + +/** + * \brief Rate for KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_384_RATE 24 + +/** + * \brief Rate for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_384_RATE 12 + +/** + * \brief Rate for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_512_RATE 16 + +/** + * \brief Absorbs the associated data into a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be at least 1. + */ +static void knot_aead_absorb_ad + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= rate) { + lw_xor_block((unsigned char *)state, ad, rate); + permute(state, rounds); + ad += rate; + adlen -= rate; + } + rate = (unsigned)adlen; + lw_xor_block((unsigned char *)state, ad, rate); + ((unsigned char *)state)[rate] ^= 0x01; + permute(state, rounds); +} + +/** + * \brief Encrypts plaintext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param c Buffer to receive the ciphertext. + * \param m Buffer containing the plaintext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_encrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +/** + * \brief Decrypts ciphertext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param m Buffer to receive the plaintext. + * \param c Buffer containing the ciphertext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_decrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot256_permute_6(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot256_permute_6(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 44); + memcpy(c + mlen, state.B, KNOT_AEAD_192_TAG_SIZE); + return 0; +} + +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_192_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_192_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 44); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_192_TAG_SIZE); +} + +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot512_permute_7(&state, 56); + memcpy(c + mlen, state.B, KNOT_AEAD_256_TAG_SIZE); + return 0; +} + +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_256_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_256_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot512_permute_7(&state, 56); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_256_TAG_SIZE); +} diff --git a/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot.h b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v1/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.c b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.h b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/api.h b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/encrypt.c b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/encrypt.c new file mode 100644 index 0000000..e80d720 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "knot.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_128_384_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_128_384_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.c b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.h b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-util.h b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot-aead.c b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot-aead.c new file mode 100644 index 0000000..5825f01 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot-aead.c @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_cipher_t const knot_aead_128_256_cipher = { + "KNOT-AEAD-128-256", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_256_encrypt, + knot_aead_128_256_decrypt +}; + +aead_cipher_t const knot_aead_128_384_cipher = { + "KNOT-AEAD-128-384", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_384_encrypt, + knot_aead_128_384_decrypt +}; + +aead_cipher_t const knot_aead_192_384_cipher = { + "KNOT-AEAD-192-384", + KNOT_AEAD_192_KEY_SIZE, + KNOT_AEAD_192_NONCE_SIZE, + KNOT_AEAD_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_192_384_encrypt, + knot_aead_192_384_decrypt +}; + +aead_cipher_t const knot_aead_256_512_cipher = { + "KNOT-AEAD-256-512", + KNOT_AEAD_256_KEY_SIZE, + KNOT_AEAD_256_NONCE_SIZE, + KNOT_AEAD_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_256_512_encrypt, + knot_aead_256_512_decrypt +}; + +/** + * \brief Rate for KNOT-AEAD-128-256. + */ +#define KNOT_AEAD_128_256_RATE 8 + +/** + * \brief Rate for KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_384_RATE 24 + +/** + * \brief Rate for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_384_RATE 12 + +/** + * \brief Rate for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_512_RATE 16 + +/** + * \brief Absorbs the associated data into a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be at least 1. + */ +static void knot_aead_absorb_ad + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= rate) { + lw_xor_block((unsigned char *)state, ad, rate); + permute(state, rounds); + ad += rate; + adlen -= rate; + } + rate = (unsigned)adlen; + lw_xor_block((unsigned char *)state, ad, rate); + ((unsigned char *)state)[rate] ^= 0x01; + permute(state, rounds); +} + +/** + * \brief Encrypts plaintext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param c Buffer to receive the ciphertext. + * \param m Buffer containing the plaintext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_encrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +/** + * \brief Decrypts ciphertext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param m Buffer to receive the plaintext. + * \param c Buffer containing the ciphertext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_decrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot256_permute_6(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot256_permute_6(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 44); + memcpy(c + mlen, state.B, KNOT_AEAD_192_TAG_SIZE); + return 0; +} + +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_192_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_192_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 44); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_192_TAG_SIZE); +} + +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot512_permute_7(&state, 56); + memcpy(c + mlen, state.B, KNOT_AEAD_256_TAG_SIZE); + return 0; +} + +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_256_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_256_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot512_permute_7(&state, 56); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_256_TAG_SIZE); +} diff --git a/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot.h b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot128v2/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.c b/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.h b/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/api.h b/knot/Implementations/crypto_aead/knot192/rhys-avr/api.h new file mode 100644 index 0000000..c340ebc --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 24 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 24 +#define CRYPTO_ABYTES 24 +#define CRYPTO_NOOVERLAP 1 diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/encrypt.c b/knot/Implementations/crypto_aead/knot192/rhys-avr/encrypt.c new file mode 100644 index 0000000..7d9ae8b --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "knot.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_192_384_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_192_384_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.c b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.h b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-util.h b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/knot-aead.c b/knot/Implementations/crypto_aead/knot192/rhys-avr/knot-aead.c new file mode 100644 index 0000000..5825f01 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/knot-aead.c @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_cipher_t const knot_aead_128_256_cipher = { + "KNOT-AEAD-128-256", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_256_encrypt, + knot_aead_128_256_decrypt +}; + +aead_cipher_t const knot_aead_128_384_cipher = { + "KNOT-AEAD-128-384", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_384_encrypt, + knot_aead_128_384_decrypt +}; + +aead_cipher_t const knot_aead_192_384_cipher = { + "KNOT-AEAD-192-384", + KNOT_AEAD_192_KEY_SIZE, + KNOT_AEAD_192_NONCE_SIZE, + KNOT_AEAD_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_192_384_encrypt, + knot_aead_192_384_decrypt +}; + +aead_cipher_t const knot_aead_256_512_cipher = { + "KNOT-AEAD-256-512", + KNOT_AEAD_256_KEY_SIZE, + KNOT_AEAD_256_NONCE_SIZE, + KNOT_AEAD_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_256_512_encrypt, + knot_aead_256_512_decrypt +}; + +/** + * \brief Rate for KNOT-AEAD-128-256. + */ +#define KNOT_AEAD_128_256_RATE 8 + +/** + * \brief Rate for KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_384_RATE 24 + +/** + * \brief Rate for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_384_RATE 12 + +/** + * \brief Rate for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_512_RATE 16 + +/** + * \brief Absorbs the associated data into a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be at least 1. + */ +static void knot_aead_absorb_ad + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= rate) { + lw_xor_block((unsigned char *)state, ad, rate); + permute(state, rounds); + ad += rate; + adlen -= rate; + } + rate = (unsigned)adlen; + lw_xor_block((unsigned char *)state, ad, rate); + ((unsigned char *)state)[rate] ^= 0x01; + permute(state, rounds); +} + +/** + * \brief Encrypts plaintext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param c Buffer to receive the ciphertext. + * \param m Buffer containing the plaintext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_encrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +/** + * \brief Decrypts ciphertext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param m Buffer to receive the plaintext. + * \param c Buffer containing the ciphertext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_decrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot256_permute_6(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot256_permute_6(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 44); + memcpy(c + mlen, state.B, KNOT_AEAD_192_TAG_SIZE); + return 0; +} + +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_192_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_192_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 44); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_192_TAG_SIZE); +} + +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot512_permute_7(&state, 56); + memcpy(c + mlen, state.B, KNOT_AEAD_256_TAG_SIZE); + return 0; +} + +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_256_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_256_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot512_permute_7(&state, 56); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_256_TAG_SIZE); +} diff --git a/knot/Implementations/crypto_aead/knot192/rhys-avr/knot.h b/knot/Implementations/crypto_aead/knot192/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot192/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.c b/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.h b/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/api.h b/knot/Implementations/crypto_aead/knot256/rhys-avr/api.h new file mode 100644 index 0000000..c11fc10 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 32 +#define CRYPTO_ABYTES 32 +#define CRYPTO_NOOVERLAP 1 diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/encrypt.c b/knot/Implementations/crypto_aead/knot256/rhys-avr/encrypt.c new file mode 100644 index 0000000..8f6225a --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "knot.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_256_512_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return knot_aead_256_512_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.c b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.h b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-util.h b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/knot-aead.c b/knot/Implementations/crypto_aead/knot256/rhys-avr/knot-aead.c new file mode 100644 index 0000000..5825f01 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/knot-aead.c @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_cipher_t const knot_aead_128_256_cipher = { + "KNOT-AEAD-128-256", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_256_encrypt, + knot_aead_128_256_decrypt +}; + +aead_cipher_t const knot_aead_128_384_cipher = { + "KNOT-AEAD-128-384", + KNOT_AEAD_128_KEY_SIZE, + KNOT_AEAD_128_NONCE_SIZE, + KNOT_AEAD_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_128_384_encrypt, + knot_aead_128_384_decrypt +}; + +aead_cipher_t const knot_aead_192_384_cipher = { + "KNOT-AEAD-192-384", + KNOT_AEAD_192_KEY_SIZE, + KNOT_AEAD_192_NONCE_SIZE, + KNOT_AEAD_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_192_384_encrypt, + knot_aead_192_384_decrypt +}; + +aead_cipher_t const knot_aead_256_512_cipher = { + "KNOT-AEAD-256-512", + KNOT_AEAD_256_KEY_SIZE, + KNOT_AEAD_256_NONCE_SIZE, + KNOT_AEAD_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_aead_256_512_encrypt, + knot_aead_256_512_decrypt +}; + +/** + * \brief Rate for KNOT-AEAD-128-256. + */ +#define KNOT_AEAD_128_256_RATE 8 + +/** + * \brief Rate for KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_384_RATE 24 + +/** + * \brief Rate for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_384_RATE 12 + +/** + * \brief Rate for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_512_RATE 16 + +/** + * \brief Absorbs the associated data into a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be at least 1. + */ +static void knot_aead_absorb_ad + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= rate) { + lw_xor_block((unsigned char *)state, ad, rate); + permute(state, rounds); + ad += rate; + adlen -= rate; + } + rate = (unsigned)adlen; + lw_xor_block((unsigned char *)state, ad, rate); + ((unsigned char *)state)[rate] ^= 0x01; + permute(state, rounds); +} + +/** + * \brief Encrypts plaintext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param c Buffer to receive the ciphertext. + * \param m Buffer containing the plaintext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_encrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_2_dest(c, (unsigned char *)state, m, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +/** + * \brief Decrypts ciphertext data with a KNOT permutation state. + * + * \param state Points to the KNOT permutation state. + * \param permute Points to the function to perform the KNOT permutation. + * \param rounds Number of rounds to perform. + * \param rate Rate of absorption to use with the permutation. + * \param m Buffer to receive the plaintext. + * \param c Buffer containing the ciphertext. + * \param len Length of the plaintext data, must be at least 1. + */ +static void knot_aead_decrypt + (void *state, knot_permute_t permute, uint8_t rounds, unsigned rate, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + while (len >= rate) { + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + permute(state, rounds); + c += rate; + m += rate; + len -= rate; + } + rate = (unsigned)len; + lw_xor_block_swap(m, (unsigned char *)state, c, rate); + ((unsigned char *)state)[rate] ^= 0x01; +} + +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot256_permute_6(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot256_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + knot256_permute_6(&state, 52); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot256_permute_6, + 28, KNOT_AEAD_128_256_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot256_permute_6(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 32); + memcpy(c + mlen, state.B, KNOT_AEAD_128_TAG_SIZE); + return 0; +} + +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_128_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_128_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_128_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_128_NONCE_SIZE, k, KNOT_AEAD_128_KEY_SIZE); + memset(state.B + KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE, + 0, 47 - (KNOT_AEAD_128_NONCE_SIZE + KNOT_AEAD_128_KEY_SIZE)); + state.B[47] = 0x80; + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_128_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 28, KNOT_AEAD_128_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 32); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_128_TAG_SIZE); +} + +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot384_permute_7(&state, 44); + memcpy(c + mlen, state.B, KNOT_AEAD_192_TAG_SIZE); + return 0; +} + +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_192_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_192_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_192_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_192_NONCE_SIZE, k, KNOT_AEAD_192_KEY_SIZE); + knot384_permute_7(&state, 76); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_192_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot384_permute_7, + 40, KNOT_AEAD_192_384_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot384_permute_7(&state, 44); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_192_TAG_SIZE); +} + +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Encrypts the plaintext to produce the ciphertext */ + if (mlen > 0) { + knot_aead_encrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, c, m, mlen); + } + + /* Compute the authentication tag */ + knot512_permute_7(&state, 56); + memcpy(c + mlen, state.B, KNOT_AEAD_256_TAG_SIZE); + return 0; +} + +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + knot512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < KNOT_AEAD_256_TAG_SIZE) + return -1; + *mlen = clen - KNOT_AEAD_256_TAG_SIZE; + + /* Initialize the permutation state to the nonce and the key */ + memcpy(state.B, npub, KNOT_AEAD_256_NONCE_SIZE); + memcpy(state.B + KNOT_AEAD_256_NONCE_SIZE, k, KNOT_AEAD_256_KEY_SIZE); + knot512_permute_7(&state, 100); + + /* Absorb the associated data */ + if (adlen > 0) { + knot_aead_absorb_ad + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, ad, adlen); + } + state.B[sizeof(state.B) - 1] ^= 0x80; /* Domain separation */ + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= KNOT_AEAD_256_TAG_SIZE; + if (clen > 0) { + knot_aead_decrypt + (&state, (knot_permute_t)knot512_permute_7, + 52, KNOT_AEAD_256_512_RATE, m, c, clen); + } + + /* Check the authentication tag */ + knot512_permute_7(&state, 56); + return aead_check_tag + (m, clen, state.B, c + clen, KNOT_AEAD_256_TAG_SIZE); +} diff --git a/knot/Implementations/crypto_aead/knot256/rhys-avr/knot.h b/knot/Implementations/crypto_aead/knot256/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_aead/knot256/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.c b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.h b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/api.h b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/hash.c b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/hash.c new file mode 100644 index 0000000..16409ba --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "knot.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return knot_hash_256_256(out, in, inlen); +} diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.c b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.h b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-util.h b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot-hash.c b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot-hash.c new file mode 100644 index 0000000..a4edecd --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot-hash.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_hash_algorithm_t const knot_hash_256_256_algorithm = { + "KNOT-HASH-256-256", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_256, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_256_384_algorithm = { + "KNOT-HASH-256-384", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_384_384_algorithm = { + "KNOT-HASH-384-384", + sizeof(int), + KNOT_HASH_384_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_384_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_512_512_algorithm = { + "KNOT-HASH-512-512", + sizeof(int), + KNOT_HASH_512_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_512_512, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Input rate for KNOT-HASH-256-256. + */ +#define KNOT_HASH_256_256_RATE 4 + +/** + * \brief Input rate for KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_384_RATE 16 + +/** + * \brief Input rate for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_384_RATE 6 + +/** + * \brief Input rate for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_512_RATE 8 + +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot256_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_256_256_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_256_RATE); + knot256_permute_7(&state, 68); + in += KNOT_HASH_256_256_RATE; + inlen -= KNOT_HASH_256_256_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot256_permute_7(&state, 68); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot256_permute_7(&state, 68); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + state.B[sizeof(state.B) - 1] ^= 0x80; + while (inlen >= KNOT_HASH_256_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_384_RATE); + knot384_permute_7(&state, 80); + in += KNOT_HASH_256_384_RATE; + inlen -= KNOT_HASH_256_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 80); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot384_permute_7(&state, 80); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_384_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_384_384_RATE); + knot384_permute_7(&state, 104); + in += KNOT_HASH_384_384_RATE; + inlen -= KNOT_HASH_384_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 104); + memcpy(out, state.B, KNOT_HASH_384_SIZE / 2); + knot384_permute_7(&state, 104); + memcpy(out + KNOT_HASH_384_SIZE / 2, state.B, KNOT_HASH_384_SIZE / 2); + return 0; +} + +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot512_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_512_512_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_512_512_RATE); + knot512_permute_8(&state, 140); + in += KNOT_HASH_512_512_RATE; + inlen -= KNOT_HASH_512_512_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot512_permute_8(&state, 140); + memcpy(out, state.B, KNOT_HASH_512_SIZE / 2); + knot512_permute_8(&state, 140); + memcpy(out + KNOT_HASH_512_SIZE / 2, state.B, KNOT_HASH_512_SIZE / 2); + return 0; +} diff --git a/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot.h b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v1/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.c b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.h b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/api.h b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/hash.c b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/hash.c new file mode 100644 index 0000000..43a2745 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "knot.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return knot_hash_256_384(out, in, inlen); +} diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.c b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.h b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-util.h b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot-hash.c b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot-hash.c new file mode 100644 index 0000000..a4edecd --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot-hash.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_hash_algorithm_t const knot_hash_256_256_algorithm = { + "KNOT-HASH-256-256", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_256, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_256_384_algorithm = { + "KNOT-HASH-256-384", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_384_384_algorithm = { + "KNOT-HASH-384-384", + sizeof(int), + KNOT_HASH_384_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_384_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_512_512_algorithm = { + "KNOT-HASH-512-512", + sizeof(int), + KNOT_HASH_512_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_512_512, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Input rate for KNOT-HASH-256-256. + */ +#define KNOT_HASH_256_256_RATE 4 + +/** + * \brief Input rate for KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_384_RATE 16 + +/** + * \brief Input rate for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_384_RATE 6 + +/** + * \brief Input rate for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_512_RATE 8 + +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot256_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_256_256_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_256_RATE); + knot256_permute_7(&state, 68); + in += KNOT_HASH_256_256_RATE; + inlen -= KNOT_HASH_256_256_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot256_permute_7(&state, 68); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot256_permute_7(&state, 68); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + state.B[sizeof(state.B) - 1] ^= 0x80; + while (inlen >= KNOT_HASH_256_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_384_RATE); + knot384_permute_7(&state, 80); + in += KNOT_HASH_256_384_RATE; + inlen -= KNOT_HASH_256_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 80); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot384_permute_7(&state, 80); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_384_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_384_384_RATE); + knot384_permute_7(&state, 104); + in += KNOT_HASH_384_384_RATE; + inlen -= KNOT_HASH_384_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 104); + memcpy(out, state.B, KNOT_HASH_384_SIZE / 2); + knot384_permute_7(&state, 104); + memcpy(out + KNOT_HASH_384_SIZE / 2, state.B, KNOT_HASH_384_SIZE / 2); + return 0; +} + +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot512_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_512_512_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_512_512_RATE); + knot512_permute_8(&state, 140); + in += KNOT_HASH_512_512_RATE; + inlen -= KNOT_HASH_512_512_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot512_permute_8(&state, 140); + memcpy(out, state.B, KNOT_HASH_512_SIZE / 2); + knot512_permute_8(&state, 140); + memcpy(out + KNOT_HASH_512_SIZE / 2, state.B, KNOT_HASH_512_SIZE / 2); + return 0; +} diff --git a/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot.h b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot256v2/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.c b/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.h b/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/api.h b/knot/Implementations/crypto_hash/knot384/rhys-avr/api.h new file mode 100644 index 0000000..d507385 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 48 diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/hash.c b/knot/Implementations/crypto_hash/knot384/rhys-avr/hash.c new file mode 100644 index 0000000..2f63a7a --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "knot.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return knot_hash_384_384(out, in, inlen); +} diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.c b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.h b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-util.h b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/knot-hash.c b/knot/Implementations/crypto_hash/knot384/rhys-avr/knot-hash.c new file mode 100644 index 0000000..a4edecd --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/knot-hash.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_hash_algorithm_t const knot_hash_256_256_algorithm = { + "KNOT-HASH-256-256", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_256, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_256_384_algorithm = { + "KNOT-HASH-256-384", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_384_384_algorithm = { + "KNOT-HASH-384-384", + sizeof(int), + KNOT_HASH_384_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_384_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_512_512_algorithm = { + "KNOT-HASH-512-512", + sizeof(int), + KNOT_HASH_512_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_512_512, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Input rate for KNOT-HASH-256-256. + */ +#define KNOT_HASH_256_256_RATE 4 + +/** + * \brief Input rate for KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_384_RATE 16 + +/** + * \brief Input rate for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_384_RATE 6 + +/** + * \brief Input rate for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_512_RATE 8 + +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot256_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_256_256_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_256_RATE); + knot256_permute_7(&state, 68); + in += KNOT_HASH_256_256_RATE; + inlen -= KNOT_HASH_256_256_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot256_permute_7(&state, 68); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot256_permute_7(&state, 68); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + state.B[sizeof(state.B) - 1] ^= 0x80; + while (inlen >= KNOT_HASH_256_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_384_RATE); + knot384_permute_7(&state, 80); + in += KNOT_HASH_256_384_RATE; + inlen -= KNOT_HASH_256_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 80); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot384_permute_7(&state, 80); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_384_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_384_384_RATE); + knot384_permute_7(&state, 104); + in += KNOT_HASH_384_384_RATE; + inlen -= KNOT_HASH_384_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 104); + memcpy(out, state.B, KNOT_HASH_384_SIZE / 2); + knot384_permute_7(&state, 104); + memcpy(out + KNOT_HASH_384_SIZE / 2, state.B, KNOT_HASH_384_SIZE / 2); + return 0; +} + +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot512_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_512_512_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_512_512_RATE); + knot512_permute_8(&state, 140); + in += KNOT_HASH_512_512_RATE; + inlen -= KNOT_HASH_512_512_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot512_permute_8(&state, 140); + memcpy(out, state.B, KNOT_HASH_512_SIZE / 2); + knot512_permute_8(&state, 140); + memcpy(out + KNOT_HASH_512_SIZE / 2, state.B, KNOT_HASH_512_SIZE / 2); + return 0; +} diff --git a/knot/Implementations/crypto_hash/knot384/rhys-avr/knot.h b/knot/Implementations/crypto_hash/knot384/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot384/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.c b/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.h b/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/api.h b/knot/Implementations/crypto_hash/knot512/rhys-avr/api.h new file mode 100644 index 0000000..de9380d --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 64 diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/hash.c b/knot/Implementations/crypto_hash/knot512/rhys-avr/hash.c new file mode 100644 index 0000000..7c0a3b3 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "knot.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return knot_hash_512_512(out, in, inlen); +} diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-256-avr.S b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-256-avr.S new file mode 100644 index 0000000..15e6389 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-256-avr.S @@ -0,0 +1,1093 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_6, @object + .size table_6, 52 +table_6: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 33 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 49 + .byte 34 + .byte 5 + .byte 10 + .byte 20 + .byte 41 + .byte 19 + .byte 39 + .byte 15 + .byte 30 + .byte 61 + .byte 58 + .byte 52 + .byte 40 + .byte 17 + .byte 35 + .byte 7 + .byte 14 + .byte 28 + .byte 57 + .byte 50 + .byte 36 + .byte 9 + .byte 18 + .byte 37 + .byte 11 + .byte 22 + .byte 45 + .byte 27 + .byte 55 + .byte 46 + .byte 29 + .byte 59 + .byte 54 + .byte 44 + .byte 25 + .byte 51 + .byte 38 + .byte 13 + .byte 26 + .byte 53 + .byte 42 + + .text +.global knot256_permute_6 + .type knot256_permute_6, @function +knot256_permute_6: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_6) + ldi r31,hi8(table_6) +#if defined(RAMPZ) + ldi r17,hh8(table_6) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_6, .-knot256_permute_6 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot256_permute_7 + .type knot256_permute_7, @function +knot256_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 57 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Z+16 + ldd r9,Z+17 + ldd r10,Z+18 + ldd r11,Z+19 + ldd r12,Z+20 + ldd r13,Z+21 + ldd r14,Z+22 + ldd r15,Z+23 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r8 + std Y+18,r9 + std Y+19,r10 + std Y+20,r11 + std Y+21,r12 + std Y+22,r13 + std Y+23,r14 + std Y+24,r15 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +59: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r18,r23 + inc r30 + ldd r23,Y+1 + ldd r4,Y+9 + ldd r5,Y+17 + mov r24,r18 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+33,r7 + mov r16,r5 + eor r16,r24 + mov r8,r23 + or r8,r4 + eor r8,r16 + mov r24,r23 + eor r24,r5 + mov r18,r25 + and r18,r16 + eor r18,r24 + mov r6,r8 + and r6,r24 + eor r6,r25 + std Y+25,r6 + ldd r23,Y+2 + ldd r4,Y+10 + ldd r5,Y+18 + mov r24,r19 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+34,r7 + mov r16,r5 + eor r16,r24 + mov r9,r23 + or r9,r4 + eor r9,r16 + mov r24,r23 + eor r24,r5 + mov r19,r25 + and r19,r16 + eor r19,r24 + mov r6,r9 + and r6,r24 + eor r6,r25 + std Y+26,r6 + ldd r23,Y+3 + ldd r4,Y+11 + ldd r5,Y+19 + mov r24,r20 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+35,r7 + mov r16,r5 + eor r16,r24 + mov r10,r23 + or r10,r4 + eor r10,r16 + mov r24,r23 + eor r24,r5 + mov r20,r25 + and r20,r16 + eor r20,r24 + mov r6,r10 + and r6,r24 + eor r6,r25 + std Y+27,r6 + ldd r23,Y+4 + ldd r4,Y+12 + ldd r5,Y+20 + mov r24,r21 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+36,r7 + mov r16,r5 + eor r16,r24 + mov r11,r23 + or r11,r4 + eor r11,r16 + mov r24,r23 + eor r24,r5 + mov r21,r25 + and r21,r16 + eor r21,r24 + mov r6,r11 + and r6,r24 + eor r6,r25 + std Y+28,r6 + ldd r23,Y+5 + ldd r4,Y+13 + ldd r5,Y+21 + mov r24,r26 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+37,r7 + mov r16,r5 + eor r16,r24 + mov r12,r23 + or r12,r4 + eor r12,r16 + mov r24,r23 + eor r24,r5 + mov r26,r25 + and r26,r16 + eor r26,r24 + mov r6,r12 + and r6,r24 + eor r6,r25 + std Y+29,r6 + ldd r23,Y+6 + ldd r4,Y+14 + ldd r5,Y+22 + mov r24,r27 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+38,r7 + mov r16,r5 + eor r16,r24 + mov r13,r23 + or r13,r4 + eor r13,r16 + mov r24,r23 + eor r24,r5 + mov r27,r25 + and r27,r16 + eor r27,r24 + mov r6,r13 + and r6,r24 + eor r6,r25 + std Y+30,r6 + ldd r23,Y+7 + ldd r4,Y+15 + ldd r5,Y+23 + mov r24,r2 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+39,r7 + mov r16,r5 + eor r16,r24 + mov r14,r23 + or r14,r4 + eor r14,r16 + mov r24,r23 + eor r24,r5 + mov r2,r25 + and r2,r16 + eor r2,r24 + mov r6,r14 + and r6,r24 + eor r6,r25 + std Y+31,r6 + ldd r23,Y+8 + ldd r4,Y+16 + ldd r5,Y+24 + mov r24,r3 + com r24 + mov r25,r23 + and r25,r24 + eor r25,r4 + mov r7,r5 + eor r7,r25 + std Y+40,r7 + mov r16,r5 + eor r16,r24 + mov r15,r23 + or r15,r4 + eor r15,r16 + mov r24,r23 + eor r24,r5 + mov r3,r25 + and r3,r16 + eor r3,r24 + mov r6,r15 + and r6,r24 + eor r6,r25 + std Y+32,r6 + std Y+9,r15 + std Y+10,r8 + std Y+11,r9 + std Y+12,r10 + std Y+13,r11 + std Y+14,r12 + std Y+15,r13 + std Y+16,r14 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + std Y+5,r12 + std Y+6,r13 + std Y+7,r14 + std Y+8,r15 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + ldd r12,Y+37 + ldd r13,Y+38 + ldd r14,Y+39 + ldd r15,Y+40 + lsl r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r8,r1 + std Y+17,r13 + std Y+18,r14 + std Y+19,r15 + std Y+20,r8 + std Y+21,r9 + std Y+22,r10 + std Y+23,r11 + std Y+24,r12 + dec r22 + breq 5322f + rjmp 59b +5322: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + std Z+4,r26 + std Z+5,r27 + std Z+6,r2 + std Z+7,r3 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + std Z+16,r8 + std Z+17,r9 + std Z+18,r10 + std Z+19,r11 + std Z+20,r12 + std Z+21,r13 + std Z+22,r14 + std Z+23,r15 + ldd r8,Y+17 + ldd r9,Y+18 + ldd r10,Y+19 + ldd r11,Y+20 + ldd r12,Y+21 + ldd r13,Y+22 + ldd r14,Y+23 + ldd r15,Y+24 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + adiw r28,40 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot256_permute_7, .-knot256_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-384-avr.S b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-384-avr.S new file mode 100644 index 0000000..4d15898 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-384-avr.S @@ -0,0 +1,833 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot384_permute_7 + .type knot384_permute_7, @function +knot384_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,72 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 87 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + ldd r4,Z+16 + ldd r5,Z+17 + ldd r6,Z+18 + ldd r7,Z+19 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r4,Z+28 + ldd r5,Z+29 + ldd r6,Z+30 + ldd r7,Z+31 + ldd r8,Z+32 + ldd r9,Z+33 + ldd r10,Z+34 + ldd r11,Z+35 + std Y+25,r26 + std Y+26,r27 + std Y+27,r2 + std Y+28,r3 + std Y+29,r4 + std Y+30,r5 + std Y+31,r6 + std Y+32,r7 + std Y+33,r8 + std Y+34,r9 + std Y+35,r10 + std Y+36,r11 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+37,r26 + std Y+38,r27 + std Y+39,r2 + std Y+40,r3 + std Y+41,r4 + std Y+42,r5 + std Y+43,r6 + std Y+44,r7 + std Y+45,r8 + std Y+46,r9 + std Y+47,r10 + std Y+48,r11 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r24,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif +99: + ldd r12,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r30 + ldd r18,Y+13 + ldd r19,Y+25 + ldd r20,Y+37 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+61,r23 + mov r14,r20 + eor r14,r12 + mov r26,r18 + or r26,r19 + eor r26,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+1,r21 + mov r21,r26 + and r21,r12 + eor r21,r13 + std Y+49,r21 + ldd r12,Y+2 + ldd r18,Y+14 + ldd r19,Y+26 + ldd r20,Y+38 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+62,r23 + mov r14,r20 + eor r14,r12 + mov r27,r18 + or r27,r19 + eor r27,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+2,r21 + mov r21,r27 + and r21,r12 + eor r21,r13 + std Y+50,r21 + ldd r12,Y+3 + ldd r18,Y+15 + ldd r19,Y+27 + ldd r20,Y+39 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + std Y+63,r23 + mov r14,r20 + eor r14,r12 + mov r2,r18 + or r2,r19 + eor r2,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+3,r21 + mov r21,r2 + and r21,r12 + eor r21,r13 + std Y+51,r21 + ldd r12,Y+4 + ldd r18,Y+16 + ldd r19,Y+28 + ldd r20,Y+40 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,192 + sbci r29,255 + st Y,r23 + subi r28,64 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r3,r18 + or r3,r19 + eor r3,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+4,r21 + mov r21,r3 + and r21,r12 + eor r21,r13 + std Y+52,r21 + ldd r12,Y+5 + ldd r18,Y+17 + ldd r19,Y+29 + ldd r20,Y+41 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,191 + sbci r29,255 + st Y,r23 + subi r28,65 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r4,r18 + or r4,r19 + eor r4,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+5,r21 + mov r21,r4 + and r21,r12 + eor r21,r13 + std Y+53,r21 + ldd r12,Y+6 + ldd r18,Y+18 + ldd r19,Y+30 + ldd r20,Y+42 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,190 + sbci r29,255 + st Y,r23 + subi r28,66 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r5,r18 + or r5,r19 + eor r5,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+6,r21 + mov r21,r5 + and r21,r12 + eor r21,r13 + std Y+54,r21 + ldd r12,Y+7 + ldd r18,Y+19 + ldd r19,Y+31 + ldd r20,Y+43 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,189 + sbci r29,255 + st Y,r23 + subi r28,67 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r6,r18 + or r6,r19 + eor r6,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+7,r21 + mov r21,r6 + and r21,r12 + eor r21,r13 + std Y+55,r21 + ldd r12,Y+8 + ldd r18,Y+20 + ldd r19,Y+32 + ldd r20,Y+44 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,188 + sbci r29,255 + st Y,r23 + subi r28,68 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r7,r18 + or r7,r19 + eor r7,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+8,r21 + mov r21,r7 + and r21,r12 + eor r21,r13 + std Y+56,r21 + ldd r12,Y+9 + ldd r18,Y+21 + ldd r19,Y+33 + ldd r20,Y+45 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,187 + sbci r29,255 + st Y,r23 + subi r28,69 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r8,r18 + or r8,r19 + eor r8,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+9,r21 + mov r21,r8 + and r21,r12 + eor r21,r13 + std Y+57,r21 + ldd r12,Y+10 + ldd r18,Y+22 + ldd r19,Y+34 + ldd r20,Y+46 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,186 + sbci r29,255 + st Y,r23 + subi r28,70 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r9,r18 + or r9,r19 + eor r9,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+10,r21 + mov r21,r9 + and r21,r12 + eor r21,r13 + std Y+58,r21 + ldd r12,Y+11 + ldd r18,Y+23 + ldd r19,Y+35 + ldd r20,Y+47 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,185 + sbci r29,255 + st Y,r23 + subi r28,71 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r10,r18 + or r10,r19 + eor r10,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+11,r21 + mov r21,r10 + and r21,r12 + eor r21,r13 + std Y+59,r21 + ldd r12,Y+12 + ldd r18,Y+24 + ldd r19,Y+36 + ldd r20,Y+48 + com r12 + mov r13,r18 + and r13,r12 + eor r13,r19 + mov r23,r20 + eor r23,r13 + subi r28,184 + sbci r29,255 + st Y,r23 + subi r28,72 + sbc r29,r1 + mov r14,r20 + eor r14,r12 + mov r11,r18 + or r11,r19 + eor r11,r14 + mov r12,r18 + eor r12,r20 + mov r21,r13 + and r21,r14 + eor r21,r12 + std Y+12,r21 + mov r21,r11 + and r21,r12 + eor r21,r13 + std Y+60,r21 + std Y+25,r11 + std Y+26,r26 + std Y+27,r27 + std Y+28,r2 + std Y+29,r3 + std Y+30,r4 + std Y+31,r5 + std Y+32,r6 + std Y+33,r7 + std Y+34,r8 + std Y+35,r9 + std Y+36,r10 + ldd r26,Y+49 + ldd r27,Y+50 + ldd r2,Y+51 + ldd r3,Y+52 + ldd r4,Y+53 + ldd r5,Y+54 + ldd r6,Y+55 + ldd r7,Y+56 + ldd r8,Y+57 + ldd r9,Y+58 + ldd r10,Y+59 + ldd r11,Y+60 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + adc r26,r1 + std Y+13,r26 + std Y+14,r27 + std Y+15,r2 + std Y+16,r3 + std Y+17,r4 + std Y+18,r5 + std Y+19,r6 + std Y+20,r7 + std Y+21,r8 + std Y+22,r9 + std Y+23,r10 + std Y+24,r11 + adiw r28,61 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y + subi r28,72 + sbc r29,r1 + bst r26,0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + ror r27 + ror r26 + bld r11,7 + std Y+37,r5 + std Y+38,r6 + std Y+39,r7 + std Y+40,r8 + std Y+41,r9 + std Y+42,r10 + std Y+43,r11 + std Y+44,r26 + std Y+45,r27 + std Y+46,r2 + std Y+47,r3 + std Y+48,r4 + dec r22 + breq 5542f + rjmp 99b +5542: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + ldd r4,Y+17 + ldd r5,Y+18 + ldd r6,Y+19 + ldd r7,Y+20 + ldd r8,Y+21 + ldd r9,Y+22 + ldd r10,Y+23 + ldd r11,Y+24 + std Z+12,r26 + std Z+13,r27 + std Z+14,r2 + std Z+15,r3 + std Z+16,r4 + std Z+17,r5 + std Z+18,r6 + std Z+19,r7 + std Z+20,r8 + std Z+21,r9 + std Z+22,r10 + std Z+23,r11 + ldd r26,Y+25 + ldd r27,Y+26 + ldd r2,Y+27 + ldd r3,Y+28 + ldd r4,Y+29 + ldd r5,Y+30 + ldd r6,Y+31 + ldd r7,Y+32 + ldd r8,Y+33 + ldd r9,Y+34 + ldd r10,Y+35 + ldd r11,Y+36 + std Z+24,r26 + std Z+25,r27 + std Z+26,r2 + std Z+27,r3 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+32,r8 + std Z+33,r9 + std Z+34,r10 + std Z+35,r11 + ldd r26,Y+37 + ldd r27,Y+38 + ldd r2,Y+39 + ldd r3,Y+40 + ldd r4,Y+41 + ldd r5,Y+42 + ldd r6,Y+43 + ldd r7,Y+44 + ldd r8,Y+45 + ldd r9,Y+46 + ldd r10,Y+47 + ldd r11,Y+48 + std Z+36,r26 + std Z+37,r27 + std Z+38,r2 + std Z+39,r3 + std Z+40,r4 + std Z+41,r5 + std Z+42,r6 + std Z+43,r7 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + subi r28,184 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot384_permute_7, .-knot384_permute_7 + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-512-avr.S b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-512-avr.S new file mode 100644 index 0000000..6f92ac3 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot-512-avr.S @@ -0,0 +1,2315 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_7, @object + .size table_7, 104 +table_7: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 16 + .byte 32 + .byte 65 + .byte 3 + .byte 6 + .byte 12 + .byte 24 + .byte 48 + .byte 97 + .byte 66 + .byte 5 + .byte 10 + .byte 20 + .byte 40 + .byte 81 + .byte 35 + .byte 71 + .byte 15 + .byte 30 + .byte 60 + .byte 121 + .byte 114 + .byte 100 + .byte 72 + .byte 17 + .byte 34 + .byte 69 + .byte 11 + .byte 22 + .byte 44 + .byte 89 + .byte 51 + .byte 103 + .byte 78 + .byte 29 + .byte 58 + .byte 117 + .byte 106 + .byte 84 + .byte 41 + .byte 83 + .byte 39 + .byte 79 + .byte 31 + .byte 62 + .byte 125 + .byte 122 + .byte 116 + .byte 104 + .byte 80 + .byte 33 + .byte 67 + .byte 7 + .byte 14 + .byte 28 + .byte 56 + .byte 113 + .byte 98 + .byte 68 + .byte 9 + .byte 18 + .byte 36 + .byte 73 + .byte 19 + .byte 38 + .byte 77 + .byte 27 + .byte 54 + .byte 109 + .byte 90 + .byte 53 + .byte 107 + .byte 86 + .byte 45 + .byte 91 + .byte 55 + .byte 111 + .byte 94 + .byte 61 + .byte 123 + .byte 118 + .byte 108 + .byte 88 + .byte 49 + .byte 99 + .byte 70 + .byte 13 + .byte 26 + .byte 52 + .byte 105 + .byte 82 + .byte 37 + .byte 75 + .byte 23 + .byte 46 + .byte 93 + .byte 59 + .byte 119 + .byte 110 + .byte 92 + + .text +.global knot512_permute_7 + .type knot512_permute_7, @function +knot512_permute_7: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_7) + ldi r31,hi8(table_7) +#if defined(RAMPZ) + ldi r17,hh8(table_7) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_7, .-knot512_permute_7 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_8, @object + .size table_8, 140 +table_8: + .byte 1 + .byte 2 + .byte 4 + .byte 8 + .byte 17 + .byte 35 + .byte 71 + .byte 142 + .byte 28 + .byte 56 + .byte 113 + .byte 226 + .byte 196 + .byte 137 + .byte 18 + .byte 37 + .byte 75 + .byte 151 + .byte 46 + .byte 92 + .byte 184 + .byte 112 + .byte 224 + .byte 192 + .byte 129 + .byte 3 + .byte 6 + .byte 12 + .byte 25 + .byte 50 + .byte 100 + .byte 201 + .byte 146 + .byte 36 + .byte 73 + .byte 147 + .byte 38 + .byte 77 + .byte 155 + .byte 55 + .byte 110 + .byte 220 + .byte 185 + .byte 114 + .byte 228 + .byte 200 + .byte 144 + .byte 32 + .byte 65 + .byte 130 + .byte 5 + .byte 10 + .byte 21 + .byte 43 + .byte 86 + .byte 173 + .byte 91 + .byte 182 + .byte 109 + .byte 218 + .byte 181 + .byte 107 + .byte 214 + .byte 172 + .byte 89 + .byte 178 + .byte 101 + .byte 203 + .byte 150 + .byte 44 + .byte 88 + .byte 176 + .byte 97 + .byte 195 + .byte 135 + .byte 15 + .byte 31 + .byte 62 + .byte 125 + .byte 251 + .byte 246 + .byte 237 + .byte 219 + .byte 183 + .byte 111 + .byte 222 + .byte 189 + .byte 122 + .byte 245 + .byte 235 + .byte 215 + .byte 174 + .byte 93 + .byte 186 + .byte 116 + .byte 232 + .byte 209 + .byte 162 + .byte 68 + .byte 136 + .byte 16 + .byte 33 + .byte 67 + .byte 134 + .byte 13 + .byte 27 + .byte 54 + .byte 108 + .byte 216 + .byte 177 + .byte 99 + .byte 199 + .byte 143 + .byte 30 + .byte 60 + .byte 121 + .byte 243 + .byte 231 + .byte 206 + .byte 156 + .byte 57 + .byte 115 + .byte 230 + .byte 204 + .byte 152 + .byte 49 + .byte 98 + .byte 197 + .byte 139 + .byte 22 + .byte 45 + .byte 90 + .byte 180 + .byte 105 + .byte 210 + .byte 164 + .byte 72 + .byte 145 + .byte 34 + .byte 69 + + .text +.global knot512_permute_8 + .type knot512_permute_8, @function +knot512_permute_8: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + movw r30,r24 + in r28,0x3d + in r29,0x3e + subi r28,96 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 113 + ld r26,Z + ldd r27,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + std Y+1,r26 + std Y+2,r27 + std Y+3,r2 + std Y+4,r3 + std Y+5,r4 + std Y+6,r5 + std Y+7,r6 + std Y+8,r7 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + std Y+13,r12 + std Y+14,r13 + std Y+15,r14 + std Y+16,r15 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r8,Z+24 + ldd r9,Z+25 + ldd r10,Z+26 + ldd r11,Z+27 + ldd r12,Z+28 + ldd r13,Z+29 + ldd r14,Z+30 + ldd r15,Z+31 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + ldd r26,Z+32 + ldd r27,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r8,Z+40 + ldd r9,Z+41 + ldd r10,Z+42 + ldd r11,Z+43 + ldd r12,Z+44 + ldd r13,Z+45 + ldd r14,Z+46 + ldd r15,Z+47 + std Y+33,r26 + std Y+34,r27 + std Y+35,r2 + std Y+36,r3 + std Y+37,r4 + std Y+38,r5 + std Y+39,r6 + std Y+40,r7 + std Y+41,r8 + std Y+42,r9 + std Y+43,r10 + std Y+44,r11 + std Y+45,r12 + std Y+46,r13 + std Y+47,r14 + std Y+48,r15 + ldd r26,Z+48 + ldd r27,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r8,Z+56 + ldd r9,Z+57 + ldd r10,Z+58 + ldd r11,Z+59 + ldd r12,Z+60 + ldd r13,Z+61 + ldd r14,Z+62 + ldd r15,Z+63 + adiw r28,49 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y+,r12 + st Y+,r13 + st Y+,r14 + st Y,r15 + subi r28,64 + sbc r29,r1 + push r31 + push r30 + ldi r30,lo8(table_8) + ldi r31,hi8(table_8) +#if defined(RAMPZ) + ldi r17,hh8(table_8) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif +134: + ldd r24,Y+1 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r24,r18 + inc r30 + ldd r18,Y+17 + ldd r19,Y+33 + ldd r20,Y+49 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,175 + sbci r29,255 + st Y,r23 + subi r28,81 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r26,r18 + or r26,r19 + eor r26,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+1,r21 + mov r21,r26 + and r21,r24 + eor r21,r25 + subi r28,191 + sbci r29,255 + st Y,r21 + subi r28,65 + sbc r29,r1 + ldd r24,Y+2 + ldd r18,Y+18 + ldd r19,Y+34 + ldd r20,Y+50 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,174 + sbci r29,255 + st Y,r23 + subi r28,82 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r27,r18 + or r27,r19 + eor r27,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+2,r21 + mov r21,r27 + and r21,r24 + eor r21,r25 + subi r28,190 + sbci r29,255 + st Y,r21 + subi r28,66 + sbc r29,r1 + ldd r24,Y+3 + ldd r18,Y+19 + ldd r19,Y+35 + ldd r20,Y+51 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,173 + sbci r29,255 + st Y,r23 + subi r28,83 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r2,r18 + or r2,r19 + eor r2,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+3,r21 + mov r21,r2 + and r21,r24 + eor r21,r25 + subi r28,189 + sbci r29,255 + st Y,r21 + subi r28,67 + sbc r29,r1 + ldd r24,Y+4 + ldd r18,Y+20 + ldd r19,Y+36 + ldd r20,Y+52 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,172 + sbci r29,255 + st Y,r23 + subi r28,84 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r3,r18 + or r3,r19 + eor r3,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+4,r21 + mov r21,r3 + and r21,r24 + eor r21,r25 + subi r28,188 + sbci r29,255 + st Y,r21 + subi r28,68 + sbc r29,r1 + ldd r24,Y+5 + ldd r18,Y+21 + ldd r19,Y+37 + ldd r20,Y+53 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,171 + sbci r29,255 + st Y,r23 + subi r28,85 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r4,r18 + or r4,r19 + eor r4,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+5,r21 + mov r21,r4 + and r21,r24 + eor r21,r25 + subi r28,187 + sbci r29,255 + st Y,r21 + subi r28,69 + sbc r29,r1 + ldd r24,Y+6 + ldd r18,Y+22 + ldd r19,Y+38 + ldd r20,Y+54 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,170 + sbci r29,255 + st Y,r23 + subi r28,86 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r5,r18 + or r5,r19 + eor r5,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+6,r21 + mov r21,r5 + and r21,r24 + eor r21,r25 + subi r28,186 + sbci r29,255 + st Y,r21 + subi r28,70 + sbc r29,r1 + ldd r24,Y+7 + ldd r18,Y+23 + ldd r19,Y+39 + ldd r20,Y+55 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,169 + sbci r29,255 + st Y,r23 + subi r28,87 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r6,r18 + or r6,r19 + eor r6,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+7,r21 + mov r21,r6 + and r21,r24 + eor r21,r25 + subi r28,185 + sbci r29,255 + st Y,r21 + subi r28,71 + sbc r29,r1 + ldd r24,Y+8 + ldd r18,Y+24 + ldd r19,Y+40 + ldd r20,Y+56 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,168 + sbci r29,255 + st Y,r23 + subi r28,88 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r7,r18 + or r7,r19 + eor r7,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+8,r21 + mov r21,r7 + and r21,r24 + eor r21,r25 + subi r28,184 + sbci r29,255 + st Y,r21 + subi r28,72 + sbc r29,r1 + ldd r24,Y+9 + ldd r18,Y+25 + ldd r19,Y+41 + ldd r20,Y+57 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,167 + sbci r29,255 + st Y,r23 + subi r28,89 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r8,r18 + or r8,r19 + eor r8,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+9,r21 + mov r21,r8 + and r21,r24 + eor r21,r25 + subi r28,183 + sbci r29,255 + st Y,r21 + subi r28,73 + sbc r29,r1 + ldd r24,Y+10 + ldd r18,Y+26 + ldd r19,Y+42 + ldd r20,Y+58 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,166 + sbci r29,255 + st Y,r23 + subi r28,90 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r9,r18 + or r9,r19 + eor r9,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+10,r21 + mov r21,r9 + and r21,r24 + eor r21,r25 + subi r28,182 + sbci r29,255 + st Y,r21 + subi r28,74 + sbc r29,r1 + ldd r24,Y+11 + ldd r18,Y+27 + ldd r19,Y+43 + ldd r20,Y+59 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,165 + sbci r29,255 + st Y,r23 + subi r28,91 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r10,r18 + or r10,r19 + eor r10,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+11,r21 + mov r21,r10 + and r21,r24 + eor r21,r25 + subi r28,181 + sbci r29,255 + st Y,r21 + subi r28,75 + sbc r29,r1 + ldd r24,Y+12 + ldd r18,Y+28 + ldd r19,Y+44 + ldd r20,Y+60 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,164 + sbci r29,255 + st Y,r23 + subi r28,92 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r11,r18 + or r11,r19 + eor r11,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+12,r21 + mov r21,r11 + and r21,r24 + eor r21,r25 + subi r28,180 + sbci r29,255 + st Y,r21 + subi r28,76 + sbc r29,r1 + ldd r24,Y+13 + ldd r18,Y+29 + ldd r19,Y+45 + ldd r20,Y+61 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,163 + sbci r29,255 + st Y,r23 + subi r28,93 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r12,r18 + or r12,r19 + eor r12,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+13,r21 + mov r21,r12 + and r21,r24 + eor r21,r25 + subi r28,179 + sbci r29,255 + st Y,r21 + subi r28,77 + sbc r29,r1 + ldd r24,Y+14 + ldd r18,Y+30 + ldd r19,Y+46 + ldd r20,Y+62 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,162 + sbci r29,255 + st Y,r23 + subi r28,94 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r13,r18 + or r13,r19 + eor r13,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+14,r21 + mov r21,r13 + and r21,r24 + eor r21,r25 + subi r28,178 + sbci r29,255 + st Y,r21 + subi r28,78 + sbc r29,r1 + ldd r24,Y+15 + ldd r18,Y+31 + ldd r19,Y+47 + ldd r20,Y+63 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,161 + sbci r29,255 + st Y,r23 + subi r28,95 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r14,r18 + or r14,r19 + eor r14,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+15,r21 + mov r21,r14 + and r21,r24 + eor r21,r25 + subi r28,177 + sbci r29,255 + st Y,r21 + subi r28,79 + sbc r29,r1 + ldd r24,Y+16 + ldd r18,Y+32 + ldd r19,Y+48 + subi r28,192 + sbci r29,255 + ld r20,Y + subi r28,64 + sbc r29,r1 + com r24 + mov r25,r18 + and r25,r24 + eor r25,r19 + mov r23,r20 + eor r23,r25 + subi r28,160 + sbci r29,255 + st Y,r23 + subi r28,96 + sbc r29,r1 + mov r16,r20 + eor r16,r24 + mov r15,r18 + or r15,r19 + eor r15,r16 + mov r24,r18 + eor r24,r20 + mov r21,r25 + and r21,r16 + eor r21,r24 + std Y+16,r21 + mov r21,r15 + and r21,r24 + eor r21,r25 + subi r28,176 + sbci r29,255 + st Y,r21 + subi r28,80 + sbc r29,r1 + std Y+33,r14 + std Y+34,r15 + std Y+35,r26 + std Y+36,r27 + std Y+37,r2 + std Y+38,r3 + std Y+39,r4 + std Y+40,r5 + std Y+41,r6 + std Y+42,r7 + std Y+43,r8 + std Y+44,r9 + std Y+45,r10 + std Y+46,r11 + std Y+47,r12 + std Y+48,r13 + subi r28,191 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,80 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + std Y+17,r26 + std Y+18,r27 + std Y+19,r2 + std Y+20,r3 + std Y+21,r4 + std Y+22,r5 + std Y+23,r6 + std Y+24,r7 + std Y+25,r8 + std Y+26,r9 + std Y+27,r10 + std Y+28,r11 + std Y+29,r12 + std Y+30,r13 + std Y+31,r14 + std Y+32,r15 + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,96 + sbc r29,r1 + lsl r26 + rol r27 + rol r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + rol r10 + rol r11 + rol r12 + rol r13 + rol r14 + rol r15 + adc r26,r1 + adiw r28,49 + st Y+,r13 + st Y+,r14 + st Y+,r15 + st Y+,r26 + st Y+,r27 + st Y+,r2 + st Y+,r3 + st Y+,r4 + st Y+,r5 + st Y+,r6 + st Y+,r7 + st Y+,r8 + st Y+,r9 + st Y+,r10 + st Y+,r11 + st Y,r12 + subi r28,64 + sbc r29,r1 + dec r22 + breq 5812f + rjmp 134b +5812: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r2,Y+3 + ldd r3,Y+4 + ldd r4,Y+5 + ldd r5,Y+6 + ldd r6,Y+7 + ldd r7,Y+8 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + ldd r12,Y+13 + ldd r13,Y+14 + ldd r14,Y+15 + ldd r15,Y+16 + st Z,r26 + std Z+1,r27 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + ldd r26,Y+17 + ldd r27,Y+18 + ldd r2,Y+19 + ldd r3,Y+20 + ldd r4,Y+21 + ldd r5,Y+22 + ldd r6,Y+23 + ldd r7,Y+24 + ldd r8,Y+25 + ldd r9,Y+26 + ldd r10,Y+27 + ldd r11,Y+28 + ldd r12,Y+29 + ldd r13,Y+30 + ldd r14,Y+31 + ldd r15,Y+32 + std Z+16,r26 + std Z+17,r27 + std Z+18,r2 + std Z+19,r3 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r8 + std Z+25,r9 + std Z+26,r10 + std Z+27,r11 + std Z+28,r12 + std Z+29,r13 + std Z+30,r14 + std Z+31,r15 + ldd r26,Y+33 + ldd r27,Y+34 + ldd r2,Y+35 + ldd r3,Y+36 + ldd r4,Y+37 + ldd r5,Y+38 + ldd r6,Y+39 + ldd r7,Y+40 + ldd r8,Y+41 + ldd r9,Y+42 + ldd r10,Y+43 + ldd r11,Y+44 + ldd r12,Y+45 + ldd r13,Y+46 + ldd r14,Y+47 + ldd r15,Y+48 + std Z+32,r26 + std Z+33,r27 + std Z+34,r2 + std Z+35,r3 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r8 + std Z+41,r9 + std Z+42,r10 + std Z+43,r11 + std Z+44,r12 + std Z+45,r13 + std Z+46,r14 + std Z+47,r15 + adiw r28,49 + ld r26,Y+ + ld r27,Y+ + ld r2,Y+ + ld r3,Y+ + ld r4,Y+ + ld r5,Y+ + ld r6,Y+ + ld r7,Y+ + ld r8,Y+ + ld r9,Y+ + ld r10,Y+ + ld r11,Y+ + ld r12,Y+ + ld r13,Y+ + ld r14,Y+ + ld r15,Y + subi r28,64 + sbc r29,r1 + std Z+48,r26 + std Z+49,r27 + std Z+50,r2 + std Z+51,r3 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + std Z+56,r8 + std Z+57,r9 + std Z+58,r10 + std Z+59,r11 + std Z+60,r12 + std Z+61,r13 + std Z+62,r14 + std Z+63,r15 + subi r28,160 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size knot512_permute_8, .-knot512_permute_8 + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.c b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.c new file mode 100644 index 0000000..f8b378e --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.c @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-knot.h" + +#if !defined(__AVR__) + +/* Round constants for the KNOT-256, KNOT-384, and KNOT-512 permutations */ +static uint8_t const rc6[52] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x21, 0x03, 0x06, 0x0c, 0x18, 0x31, 0x22, + 0x05, 0x0a, 0x14, 0x29, 0x13, 0x27, 0x0f, 0x1e, 0x3d, 0x3a, 0x34, 0x28, + 0x11, 0x23, 0x07, 0x0e, 0x1c, 0x39, 0x32, 0x24, 0x09, 0x12, 0x25, 0x0b, + 0x16, 0x2d, 0x1b, 0x37, 0x2e, 0x1d, 0x3b, 0x36, 0x2c, 0x19, 0x33, 0x26, + 0x0d, 0x1a, 0x35, 0x2a +}; +static uint8_t const rc7[104] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x41, 0x03, 0x06, 0x0c, 0x18, 0x30, + 0x61, 0x42, 0x05, 0x0a, 0x14, 0x28, 0x51, 0x23, 0x47, 0x0f, 0x1e, 0x3c, + 0x79, 0x72, 0x64, 0x48, 0x11, 0x22, 0x45, 0x0b, 0x16, 0x2c, 0x59, 0x33, + 0x67, 0x4e, 0x1d, 0x3a, 0x75, 0x6a, 0x54, 0x29, 0x53, 0x27, 0x4f, 0x1f, + 0x3e, 0x7d, 0x7a, 0x74, 0x68, 0x50, 0x21, 0x43, 0x07, 0x0e, 0x1c, 0x38, + 0x71, 0x62, 0x44, 0x09, 0x12, 0x24, 0x49, 0x13, 0x26, 0x4d, 0x1b, 0x36, + 0x6d, 0x5a, 0x35, 0x6b, 0x56, 0x2d, 0x5b, 0x37, 0x6f, 0x5e, 0x3d, 0x7b, + 0x76, 0x6c, 0x58, 0x31, 0x63, 0x46, 0x0d, 0x1a, 0x34, 0x69, 0x52, 0x25, + 0x4b, 0x17, 0x2e, 0x5d, 0x3b, 0x77, 0x6e, 0x5c +}; +static uint8_t const rc8[140] = { + 0x01, 0x02, 0x04, 0x08, 0x11, 0x23, 0x47, 0x8e, 0x1c, 0x38, 0x71, 0xe2, + 0xc4, 0x89, 0x12, 0x25, 0x4b, 0x97, 0x2e, 0x5c, 0xb8, 0x70, 0xe0, 0xc0, + 0x81, 0x03, 0x06, 0x0c, 0x19, 0x32, 0x64, 0xc9, 0x92, 0x24, 0x49, 0x93, + 0x26, 0x4d, 0x9b, 0x37, 0x6e, 0xdc, 0xb9, 0x72, 0xe4, 0xc8, 0x90, 0x20, + 0x41, 0x82, 0x05, 0x0a, 0x15, 0x2b, 0x56, 0xad, 0x5b, 0xb6, 0x6d, 0xda, + 0xb5, 0x6b, 0xd6, 0xac, 0x59, 0xb2, 0x65, 0xcb, 0x96, 0x2c, 0x58, 0xb0, + 0x61, 0xc3, 0x87, 0x0f, 0x1f, 0x3e, 0x7d, 0xfb, 0xf6, 0xed, 0xdb, 0xb7, + 0x6f, 0xde, 0xbd, 0x7a, 0xf5, 0xeb, 0xd7, 0xae, 0x5d, 0xba, 0x74, 0xe8, + 0xd1, 0xa2, 0x44, 0x88, 0x10, 0x21, 0x43, 0x86, 0x0d, 0x1b, 0x36, 0x6c, + 0xd8, 0xb1, 0x63, 0xc7, 0x8f, 0x1e, 0x3c, 0x79, 0xf3, 0xe7, 0xce, 0x9c, + 0x39, 0x73, 0xe6, 0xcc, 0x98, 0x31, 0x62, 0xc5, 0x8b, 0x16, 0x2d, 0x5a, + 0xb4, 0x69, 0xd2, 0xa4, 0x48, 0x91, 0x22, 0x45 +}; + +/* Applies the KNOT S-box to four 64-bit words in bit-sliced mode */ +#define knot_sbox64(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint64_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +/* Applies the KNOT S-box to four 32-bit words in bit-sliced mode */ +#define knot_sbox32(a0, a1, a2, a3, b1, b2, b3) \ + do { \ + uint32_t t1, t3, t6; \ + t1 = ~(a0); \ + t3 = (a2) ^ ((a1) & t1); \ + (b3) = (a3) ^ t3; \ + t6 = (a3) ^ t1; \ + (b2) = ((a1) | (a2)) ^ t6; \ + t1 = (a1) ^ (a3); \ + (a0) = t1 ^ (t3 & t6); \ + (b1) = t3 ^ ((b2) & t1); \ + } while (0) + +static void knot256_permute + (knot256_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b1, b2, b3; + + /* Load the input state into local variables; each row is 64 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x1, x2, x3, b1, b2, b3); + + /* Linear diffusion layer */ + x1 = leftRotate1_64(b1); + x2 = leftRotate8_64(b2); + x3 = leftRotate25_64(b3); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); +#endif +} + +void knot256_permute_6(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc6, rounds); +} + +void knot256_permute_7(knot256_state_t *state, uint8_t rounds) +{ + knot256_permute(state, rc7, rounds); +} + +void knot384_permute_7(knot384_state_t *state, uint8_t rounds) +{ + const uint8_t *rc = rc7; + uint64_t b2, b4, b6; + uint32_t b3, b5, b7; + + /* Load the input state into local variables; each row is 96 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint32_t x1 = state->W[2]; + uint64_t x2 = state->W[3] | (((uint64_t)(state->W[4])) << 32); + uint32_t x3 = state->W[5]; + uint64_t x4 = state->S[3]; + uint32_t x5 = state->W[8]; + uint64_t x6 = state->W[9] | (((uint64_t)(state->W[10])) << 32); + uint32_t x7 = state->W[11]; +#else + uint64_t x0 = le_load_word64(state->B); + uint32_t x1 = le_load_word32(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 12); + uint32_t x3 = le_load_word32(state->B + 20); + uint64_t x4 = le_load_word64(state->B + 24); + uint32_t x5 = le_load_word32(state->B + 32); + uint64_t x6 = le_load_word64(state->B + 36); + uint32_t x7 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox32(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotateShort_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (32 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + #define leftRotateLong_96(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | \ + (((uint64_t)(b1)) << ((bits) - 32)) | \ + ((b0) >> (96 - (bits))); \ + (a1) = (uint32_t)(((b0) << ((bits) - 32)) >> 32); \ + } while (0) + leftRotateShort_96(x2, x3, b2, b3, 1); + leftRotateShort_96(x4, x5, b4, b5, 8); + leftRotateLong_96(x6, x7, b6, b7, 55); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->W[2] = x1; + state->W[3] = (uint32_t)x2; + state->W[4] = (uint32_t)(x2 >> 32); + state->W[5] = x3; + state->S[3] = x4; + state->W[8] = x5; + state->W[9] = (uint32_t)x6; + state->W[10] = (uint32_t)(x6 >> 32); + state->W[11] = x7; +#else + le_store_word64(state->B, x0); + le_store_word32(state->B + 8, x1); + le_store_word64(state->B + 12, x2); + le_store_word32(state->B + 20, x3); + le_store_word64(state->B + 24, x4); + le_store_word32(state->B + 32, x5); + le_store_word64(state->B + 36, x6); + le_store_word32(state->B + 44, x7); +#endif +} + +static void knot512_permute + (knot512_state_t *state, const uint8_t *rc, uint8_t rounds) +{ + uint64_t b2, b3, b4, b5, b6, b7; + + /* Load the input state into local variables; each row is 128 bits */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + uint64_t x0 = state->S[0]; + uint64_t x1 = state->S[1]; + uint64_t x2 = state->S[2]; + uint64_t x3 = state->S[3]; + uint64_t x4 = state->S[4]; + uint64_t x5 = state->S[5]; + uint64_t x6 = state->S[6]; + uint64_t x7 = state->S[7]; +#else + uint64_t x0 = le_load_word64(state->B); + uint64_t x1 = le_load_word64(state->B + 8); + uint64_t x2 = le_load_word64(state->B + 16); + uint64_t x3 = le_load_word64(state->B + 24); + uint64_t x4 = le_load_word64(state->B + 32); + uint64_t x5 = le_load_word64(state->B + 40); + uint64_t x6 = le_load_word64(state->B + 48); + uint64_t x7 = le_load_word64(state->B + 56); +#endif + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds) { + /* Add the next round constant to the state */ + x0 ^= *rc++; + + /* Substitution layer */ + knot_sbox64(x0, x2, x4, x6, b2, b4, b6); + knot_sbox64(x1, x3, x5, x7, b3, b5, b7); + + /* Linear diffusion layer */ + #define leftRotate_128(a0, a1, b0, b1, bits) \ + do { \ + (a0) = ((b0) << (bits)) | ((b1) >> (64 - (bits))); \ + (a1) = ((b1) << (bits)) | ((b0) >> (64 - (bits))); \ + } while (0) + leftRotate_128(x2, x3, b2, b3, 1); + leftRotate_128(x4, x5, b4, b5, 16); + leftRotate_128(x6, x7, b6, b7, 25); + } + + /* Store the local variables to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0] = x0; + state->S[1] = x1; + state->S[2] = x2; + state->S[3] = x3; + state->S[4] = x4; + state->S[5] = x5; + state->S[6] = x6; + state->S[7] = x7; +#else + le_store_word64(state->B, x0); + le_store_word64(state->B + 8, x1); + le_store_word64(state->B + 16, x2); + le_store_word64(state->B + 24, x3); + le_store_word64(state->B + 32, x4); + le_store_word64(state->B + 40, x5); + le_store_word64(state->B + 48, x6); + le_store_word64(state->B + 56, x7); +#endif +} + +void knot512_permute_7(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc7, rounds); +} + +void knot512_permute_8(knot512_state_t *state, uint8_t rounds) +{ + knot512_permute(state, rc8, rounds); +} + +#endif /* !__AVR__ */ diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.h b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.h new file mode 100644 index 0000000..88a782c --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-knot.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_KNOT_H +#define LW_INTERNAL_KNOT_H + +#include "internal-util.h" + +/** + * \file internal-knot.h + * \brief Permutations that are used by the KNOT AEAD and hash algorithms. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Internal state of the KNOT-256 permutation. + */ +typedef union +{ + uint64_t S[4]; /**< Words of the state */ + uint8_t B[32]; /**< Bytes of the state */ + +} knot256_state_t; + +/** + * \brief Internal state of the KNOT-384 permutation. + */ +typedef union +{ + uint64_t S[6]; /**< 64-bit words of the state */ + uint32_t W[12]; /**< 32-bit words of the state */ + uint8_t B[48]; /**< Bytes of the state */ + +} knot384_state_t; + +/** + * \brief Internal state of the KNOT-512 permutation. + */ +typedef union +{ + uint64_t S[8]; /**< Words of the state */ + uint8_t B[64]; /**< Bytes of the state */ + +} knot512_state_t; + +/** + * \brief Permutes the KNOT-256 state, using 6-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 52. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_6(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-256 state, using 7-bit round constants. + * + * \param state The KNOT-256 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot256_permute_7(knot256_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-384 state, using 7-bit round constants. + * + * \param state The KNOT-384 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot384_permute_7(knot384_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 7-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 104. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_7(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Permutes the KNOT-512 state, using 8-bit round constants. + * + * \param state The KNOT-512 state to be permuted. + * \param rounds The number of rounds to be performed, 1 to 140. + * + * The input and output \a state will be in little-endian byte order. + */ +void knot512_permute_8(knot512_state_t *state, uint8_t rounds); + +/** + * \brief Generic pointer to a function that performs a KNOT permutation. + * + * \param state Points to the permutation state. + * \param round Number of rounds to perform. + */ +typedef void (*knot_permute_t)(void *state, uint8_t rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-util.h b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/knot-hash.c b/knot/Implementations/crypto_hash/knot512/rhys-avr/knot-hash.c new file mode 100644 index 0000000..a4edecd --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/knot-hash.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "knot.h" +#include "internal-knot.h" +#include + +aead_hash_algorithm_t const knot_hash_256_256_algorithm = { + "KNOT-HASH-256-256", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_256, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_256_384_algorithm = { + "KNOT-HASH-256-384", + sizeof(int), + KNOT_HASH_256_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_256_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_384_384_algorithm = { + "KNOT-HASH-384-384", + sizeof(int), + KNOT_HASH_384_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_384_384, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const knot_hash_512_512_algorithm = { + "KNOT-HASH-512-512", + sizeof(int), + KNOT_HASH_512_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + knot_hash_512_512, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Input rate for KNOT-HASH-256-256. + */ +#define KNOT_HASH_256_256_RATE 4 + +/** + * \brief Input rate for KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_384_RATE 16 + +/** + * \brief Input rate for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_384_RATE 6 + +/** + * \brief Input rate for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_512_RATE 8 + +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot256_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_256_256_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_256_RATE); + knot256_permute_7(&state, 68); + in += KNOT_HASH_256_256_RATE; + inlen -= KNOT_HASH_256_256_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot256_permute_7(&state, 68); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot256_permute_7(&state, 68); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + state.B[sizeof(state.B) - 1] ^= 0x80; + while (inlen >= KNOT_HASH_256_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_256_384_RATE); + knot384_permute_7(&state, 80); + in += KNOT_HASH_256_384_RATE; + inlen -= KNOT_HASH_256_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 80); + memcpy(out, state.B, KNOT_HASH_256_SIZE / 2); + knot384_permute_7(&state, 80); + memcpy(out + KNOT_HASH_256_SIZE / 2, state.B, KNOT_HASH_256_SIZE / 2); + return 0; +} + +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot384_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_384_384_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_384_384_RATE); + knot384_permute_7(&state, 104); + in += KNOT_HASH_384_384_RATE; + inlen -= KNOT_HASH_384_384_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot384_permute_7(&state, 104); + memcpy(out, state.B, KNOT_HASH_384_SIZE / 2); + knot384_permute_7(&state, 104); + memcpy(out + KNOT_HASH_384_SIZE / 2, state.B, KNOT_HASH_384_SIZE / 2); + return 0; +} + +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + knot512_state_t state; + unsigned temp; + memset(state.B, 0, sizeof(state.B)); + while (inlen >= KNOT_HASH_512_512_RATE) { + lw_xor_block(state.B, in, KNOT_HASH_512_512_RATE); + knot512_permute_8(&state, 140); + in += KNOT_HASH_512_512_RATE; + inlen -= KNOT_HASH_512_512_RATE; + } + temp = (unsigned)inlen; + lw_xor_block(state.B, in, temp); + state.B[temp] ^= 0x01; + knot512_permute_8(&state, 140); + memcpy(out, state.B, KNOT_HASH_512_SIZE / 2); + knot512_permute_8(&state, 140); + memcpy(out + KNOT_HASH_512_SIZE / 2, state.B, KNOT_HASH_512_SIZE / 2); + return 0; +} diff --git a/knot/Implementations/crypto_hash/knot512/rhys-avr/knot.h b/knot/Implementations/crypto_hash/knot512/rhys-avr/knot.h new file mode 100644 index 0000000..e2c5198 --- /dev/null +++ b/knot/Implementations/crypto_hash/knot512/rhys-avr/knot.h @@ -0,0 +1,459 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_KNOT_H +#define LWCRYPTO_KNOT_H + +#include "aead-common.h" + +/** + * \file knot.h + * \brief KNOT authenticated encryption and hash algorithms. + * + * KNOT is a family of authenticated encryption and hash algorithms built + * around a permutation and the MonkeyDuplex sponge construction. The + * family members are: + * + * \li KNOT-AEAD-128-256 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 256-bit permutation. This is the primary + * encryption member of the family. + * \li KNOT-AEAD-128-384 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-192-384 with a 192-bit key, a 192-bit nonce, and a + * 192-bit tag, built around a 384-bit permutation. + * \li KNOT-AEAD-256-512 with a 256-bit key, a 256-bit nonce, and a + * 256-bit tag, built around a 512-bit permutation. + * \li KNOT-HASH-256-256 with a 256-bit hash output, built around a + * 256-bit permutation. This is the primary hashing member of the family. + * \li KNOT-HASH-256-384 with a 256-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-384-384 with a 384-bit hash output, built around a + * 384-bit permutation. + * \li KNOT-HASH-512-512 with a 512-bit hash output, built around a + * 512-bit permutation. + * + * References: https://csrc.nist.gov/CSRC/media/Projects/lightweight-cryptography/documents/round-2/spec-doc-rnd2/knot-spec-round.pdf + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-128-256 and + * KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-192-384. + */ +#define KNOT_AEAD_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for KNOT-AEAD-256-512. + */ +#define KNOT_AEAD_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for KNOT-AEAD-128-256 and KNOT-AEAD-128-384. + */ +#define KNOT_AEAD_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-256-256 and KNOT-HASH-256-384. + */ +#define KNOT_HASH_256_SIZE 32 + +/** + * \brief Size of the hash for KNOT-HASH-384-384. + */ +#define KNOT_HASH_384_SIZE 48 + +/** + * \brief Size of the hash for KNOT-HASH-512-512. + */ +#define KNOT_HASH_512_SIZE 64 + +/** + * \brief Meta-information block for the KNOT-AEAD-128-256 cipher. + */ +extern aead_cipher_t const knot_aead_128_256_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-128-384 cipher. + */ +extern aead_cipher_t const knot_aead_128_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-192-384 cipher. + */ +extern aead_cipher_t const knot_aead_192_384_cipher; + +/** + * \brief Meta-information block for the KNOT-AEAD-256-512 cipher. + */ +extern aead_cipher_t const knot_aead_256_512_cipher; + +/** + * \brief Meta-information block for the KNOT-HASH-256-256 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_256_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-256-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_256_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-384-384 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_384_384_algorithm; + +/** + * \brief Meta-information block for the KNOT-HASH-512-512 algorithm. + */ +extern aead_hash_algorithm_t const knot_hash_512_512_algorithm; + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_256_decrypt() + */ +int knot_aead_128_256_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_256_encrypt() + */ +int knot_aead_128_256_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_128_384_decrypt() + */ +int knot_aead_128_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-128-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_128_384_encrypt() + */ +int knot_aead_128_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_192_384_decrypt() + */ +int knot_aead_192_384_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-192-384. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_192_384_encrypt() + */ +int knot_aead_192_384_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa knot_aead_256_512_decrypt() + */ +int knot_aead_256_512_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with KNOT-AEAD-256-512. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa knot_aead_256_512_encrypt() + */ +int knot_aead_256_512_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-256. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_256 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-256-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_256_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_256_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-384-384. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_384_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_384_384 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with KNOT-HASH-512-512. + * + * \param out Buffer to receive the hash output which must be at least + * KNOT_HASH_512_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int knot_hash_512_512 + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.c b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.h b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/api.h b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/api.h new file mode 100644 index 0000000..4bf8f5c --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/encrypt.c b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..1573370 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "lotus-locus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return locus_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return locus_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64-avr.S b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64-avr.S new file mode 100644 index 0000000..fdb668d --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64-avr.S @@ -0,0 +1,6047 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gift64n_init + .type gift64n_init, @function +gift64n_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ret + .size gift64n_init, .-gift64n_init + + .text +.global gift64n_encrypt + .type gift64n_encrypt, @function +gift64n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 28 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,0 + bst r18,1 + bld r22,0 + bst r18,2 + bld r2,0 + bst r18,3 + bld r4,0 + bst r18,4 + bld r20,1 + bst r18,5 + bld r22,1 + bst r18,6 + bld r2,1 + bst r18,7 + bld r4,1 + bst r19,0 + bld r20,2 + bst r19,1 + bld r22,2 + bst r19,2 + bld r2,2 + bst r19,3 + bld r4,2 + bst r19,4 + bld r20,3 + bst r19,5 + bld r22,3 + bst r19,6 + bld r2,3 + bst r19,7 + bld r4,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,4 + bst r18,1 + bld r22,4 + bst r18,2 + bld r2,4 + bst r18,3 + bld r4,4 + bst r18,4 + bld r20,5 + bst r18,5 + bld r22,5 + bst r18,6 + bld r2,5 + bst r18,7 + bld r4,5 + bst r19,0 + bld r20,6 + bst r19,1 + bld r22,6 + bst r19,2 + bld r2,6 + bst r19,3 + bld r4,6 + bst r19,4 + bld r20,7 + bst r19,5 + bld r22,7 + bst r19,6 + bld r2,7 + bst r19,7 + bld r4,7 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,0 + bst r18,1 + bld r23,0 + bst r18,2 + bld r3,0 + bst r18,3 + bld r5,0 + bst r18,4 + bld r21,1 + bst r18,5 + bld r23,1 + bst r18,6 + bld r3,1 + bst r18,7 + bld r5,1 + bst r19,0 + bld r21,2 + bst r19,1 + bld r23,2 + bst r19,2 + bld r3,2 + bst r19,3 + bld r5,2 + bst r19,4 + bld r21,3 + bst r19,5 + bld r23,3 + bst r19,6 + bld r3,3 + bst r19,7 + bld r5,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,4 + bst r18,1 + bld r23,4 + bst r18,2 + bld r3,4 + bst r18,3 + bld r5,4 + bst r18,4 + bld r21,5 + bst r18,5 + bld r23,5 + bst r18,6 + bld r3,5 + bst r18,7 + bld r5,5 + bst r19,0 + bld r21,6 + bst r19,1 + bld r23,6 + bst r19,2 + bld r3,6 + bst r19,3 + bld r5,6 + bst r19,4 + bld r21,7 + bst r19,5 + bld r23,7 + bst r19,6 + bld r3,7 + bst r19,7 + bld r5,7 + rcall 1061f + ldi r18,1 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,3 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,7 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,15 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,31 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,62 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,61 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,59 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,55 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,47 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,30 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,60 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,57 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,51 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,39 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,14 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,29 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,58 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,53 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,43 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,22 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,44 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,24 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,48 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,33 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,2 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,5 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,11 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rjmp 1252f +1061: + mov r0,r20 + and r0,r2 + eor r22,r0 + mov r0,r21 + and r0,r3 + eor r23,r0 + mov r0,r22 + and r0,r4 + eor r20,r0 + mov r0,r23 + and r0,r5 + eor r21,r0 + mov r0,r20 + or r0,r22 + eor r2,r0 + mov r0,r21 + or r0,r23 + eor r3,r0 + eor r4,r2 + eor r5,r3 + eor r22,r4 + eor r23,r5 + com r4 + com r5 + movw r18,r20 + mov r0,r22 + and r0,r18 + eor r2,r0 + mov r0,r23 + and r0,r19 + eor r3,r0 + movw r20,r4 + movw r4,r18 + bst r20,1 + bld r0,0 + bst r20,4 + bld r20,1 + bst r20,3 + bld r20,4 + bst r21,4 + bld r20,3 + bst r0,0 + bld r21,4 + bst r20,2 + bld r0,0 + bst r21,0 + bld r20,2 + bst r0,0 + bld r21,0 + bst r20,5 + bld r0,0 + bst r20,7 + bld r20,5 + bst r21,7 + bld r20,7 + bst r21,5 + bld r21,7 + bst r0,0 + bld r21,5 + bst r20,6 + bld r0,0 + bst r21,3 + bld r20,6 + bst r21,6 + bld r21,3 + bst r21,1 + bld r21,6 + bst r0,0 + bld r21,1 + bst r22,0 + bld r0,0 + bst r22,1 + bld r22,0 + bst r22,5 + bld r22,1 + bst r22,4 + bld r22,5 + bst r0,0 + bld r22,4 + bst r22,2 + bld r0,0 + bst r23,1 + bld r22,2 + bst r22,7 + bld r23,1 + bst r23,4 + bld r22,7 + bst r0,0 + bld r23,4 + bst r22,3 + bld r0,0 + bst r23,5 + bld r22,3 + bst r22,6 + bld r23,5 + bst r23,0 + bld r22,6 + bst r0,0 + bld r23,0 + bst r23,2 + bld r0,0 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r23,6 + bld r23,7 + bst r0,0 + bld r23,6 + bst r2,0 + bld r0,0 + bst r2,2 + bld r2,0 + bst r3,2 + bld r2,2 + bst r3,0 + bld r3,2 + bst r0,0 + bld r3,0 + bst r2,1 + bld r0,0 + bst r2,6 + bld r2,1 + bst r3,1 + bld r2,6 + bst r2,4 + bld r3,1 + bst r0,0 + bld r2,4 + bst r2,3 + bld r0,0 + bst r3,6 + bld r2,3 + bst r3,3 + bld r3,6 + bst r3,4 + bld r3,3 + bst r0,0 + bld r3,4 + bst r2,7 + bld r0,0 + bst r3,5 + bld r2,7 + bst r0,0 + bld r3,5 + bst r4,0 + bld r0,0 + bst r4,3 + bld r4,0 + bst r5,7 + bld r4,3 + bst r5,4 + bld r5,7 + bst r0,0 + bld r5,4 + bst r4,1 + bld r0,0 + bst r4,7 + bld r4,1 + bst r5,6 + bld r4,7 + bst r5,0 + bld r5,6 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,3 + bld r4,2 + bst r5,5 + bld r5,3 + bst r4,4 + bld r5,5 + bst r0,0 + bld r4,4 + bst r4,5 + bld r0,0 + bst r4,6 + bld r4,5 + bst r5,2 + bld r4,6 + bst r5,1 + bld r5,2 + bst r0,0 + bld r5,1 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + ret +1252: + ldd r26,Y+17 + ldd r27,Y+18 + bst r20,0 + bld r18,0 + bst r22,0 + bld r18,1 + bst r2,0 + bld r18,2 + bst r4,0 + bld r18,3 + bst r20,1 + bld r18,4 + bst r22,1 + bld r18,5 + bst r2,1 + bld r18,6 + bst r4,1 + bld r18,7 + bst r20,2 + bld r19,0 + bst r22,2 + bld r19,1 + bst r2,2 + bld r19,2 + bst r4,2 + bld r19,3 + bst r20,3 + bld r19,4 + bst r22,3 + bld r19,5 + bst r2,3 + bld r19,6 + bst r4,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r20,4 + bld r18,0 + bst r22,4 + bld r18,1 + bst r2,4 + bld r18,2 + bst r4,4 + bld r18,3 + bst r20,5 + bld r18,4 + bst r22,5 + bld r18,5 + bst r2,5 + bld r18,6 + bst r4,5 + bld r18,7 + bst r20,6 + bld r19,0 + bst r22,6 + bld r19,1 + bst r2,6 + bld r19,2 + bst r4,6 + bld r19,3 + bst r20,7 + bld r19,4 + bst r22,7 + bld r19,5 + bst r2,7 + bld r19,6 + bst r4,7 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,0 + bld r18,0 + bst r23,0 + bld r18,1 + bst r3,0 + bld r18,2 + bst r5,0 + bld r18,3 + bst r21,1 + bld r18,4 + bst r23,1 + bld r18,5 + bst r3,1 + bld r18,6 + bst r5,1 + bld r18,7 + bst r21,2 + bld r19,0 + bst r23,2 + bld r19,1 + bst r3,2 + bld r19,2 + bst r5,2 + bld r19,3 + bst r21,3 + bld r19,4 + bst r23,3 + bld r19,5 + bst r3,3 + bld r19,6 + bst r5,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,4 + bld r18,0 + bst r23,4 + bld r18,1 + bst r3,4 + bld r18,2 + bst r5,4 + bld r18,3 + bst r21,5 + bld r18,4 + bst r23,5 + bld r18,5 + bst r3,5 + bld r18,6 + bst r5,5 + bld r18,7 + bst r21,6 + bld r19,0 + bst r23,6 + bld r19,1 + bst r3,6 + bld r19,2 + bst r5,6 + bld r19,3 + bst r21,7 + bld r19,4 + bst r23,7 + bld r19,5 + bst r3,7 + bld r19,6 + bst r5,7 + bld r19,7 + st X+,r18 + st X+,r19 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64n_encrypt, .-gift64n_encrypt + + .text +.global gift64n_decrypt + .type gift64n_decrypt, @function +gift64n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 28 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,0 + bst r18,1 + bld r22,0 + bst r18,2 + bld r2,0 + bst r18,3 + bld r4,0 + bst r18,4 + bld r20,1 + bst r18,5 + bld r22,1 + bst r18,6 + bld r2,1 + bst r18,7 + bld r4,1 + bst r19,0 + bld r20,2 + bst r19,1 + bld r22,2 + bst r19,2 + bld r2,2 + bst r19,3 + bld r4,2 + bst r19,4 + bld r20,3 + bst r19,5 + bld r22,3 + bst r19,6 + bld r2,3 + bst r19,7 + bld r4,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,4 + bst r18,1 + bld r22,4 + bst r18,2 + bld r2,4 + bst r18,3 + bld r4,4 + bst r18,4 + bld r20,5 + bst r18,5 + bld r22,5 + bst r18,6 + bld r2,5 + bst r18,7 + bld r4,5 + bst r19,0 + bld r20,6 + bst r19,1 + bld r22,6 + bst r19,2 + bld r2,6 + bst r19,3 + bld r4,6 + bst r19,4 + bld r20,7 + bst r19,5 + bld r22,7 + bst r19,6 + bld r2,7 + bst r19,7 + bld r4,7 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,0 + bst r18,1 + bld r23,0 + bst r18,2 + bld r3,0 + bst r18,3 + bld r5,0 + bst r18,4 + bld r21,1 + bst r18,5 + bld r23,1 + bst r18,6 + bld r3,1 + bst r18,7 + bld r5,1 + bst r19,0 + bld r21,2 + bst r19,1 + bld r23,2 + bst r19,2 + bld r3,2 + bst r19,3 + bld r5,2 + bst r19,4 + bld r21,3 + bst r19,5 + bld r23,3 + bst r19,6 + bld r3,3 + bst r19,7 + bld r5,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,4 + bst r18,1 + bld r23,4 + bst r18,2 + bld r3,4 + bst r18,3 + bld r5,4 + bst r18,4 + bld r21,5 + bst r18,5 + bld r23,5 + bst r18,6 + bld r3,5 + bst r18,7 + bld r5,5 + bst r19,0 + bld r21,6 + bst r19,1 + bld r23,6 + bst r19,2 + bld r3,6 + bst r19,3 + bld r5,6 + bst r19,4 + bld r21,7 + bst r19,5 + bld r23,7 + bst r19,6 + bld r3,7 + bst r19,7 + bld r5,7 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,11 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,5 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,2 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,33 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,48 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,24 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,44 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,22 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,43 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,53 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,58 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,29 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,14 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,39 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,51 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,57 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,60 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,30 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,47 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,55 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,59 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,61 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,62 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,31 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,15 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,7 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,3 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,1 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + rjmp 1362f +1173: + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + bst r20,1 + bld r0,0 + bst r21,4 + bld r20,1 + bst r20,3 + bld r21,4 + bst r20,4 + bld r20,3 + bst r0,0 + bld r20,4 + bst r20,2 + bld r0,0 + bst r21,0 + bld r20,2 + bst r0,0 + bld r21,0 + bst r20,5 + bld r0,0 + bst r21,5 + bld r20,5 + bst r21,7 + bld r21,5 + bst r20,7 + bld r21,7 + bst r0,0 + bld r20,7 + bst r20,6 + bld r0,0 + bst r21,1 + bld r20,6 + bst r21,6 + bld r21,1 + bst r21,3 + bld r21,6 + bst r0,0 + bld r21,3 + bst r22,0 + bld r0,0 + bst r22,4 + bld r22,0 + bst r22,5 + bld r22,4 + bst r22,1 + bld r22,5 + bst r0,0 + bld r22,1 + bst r22,2 + bld r0,0 + bst r23,4 + bld r22,2 + bst r22,7 + bld r23,4 + bst r23,1 + bld r22,7 + bst r0,0 + bld r23,1 + bst r22,3 + bld r0,0 + bst r23,0 + bld r22,3 + bst r22,6 + bld r23,0 + bst r23,5 + bld r22,6 + bst r0,0 + bld r23,5 + bst r23,2 + bld r0,0 + bst r23,6 + bld r23,2 + bst r23,7 + bld r23,6 + bst r23,3 + bld r23,7 + bst r0,0 + bld r23,3 + bst r2,0 + bld r0,0 + bst r3,0 + bld r2,0 + bst r3,2 + bld r3,0 + bst r2,2 + bld r3,2 + bst r0,0 + bld r2,2 + bst r2,1 + bld r0,0 + bst r2,4 + bld r2,1 + bst r3,1 + bld r2,4 + bst r2,6 + bld r3,1 + bst r0,0 + bld r2,6 + bst r2,3 + bld r0,0 + bst r3,4 + bld r2,3 + bst r3,3 + bld r3,4 + bst r3,6 + bld r3,3 + bst r0,0 + bld r3,6 + bst r2,7 + bld r0,0 + bst r3,5 + bld r2,7 + bst r0,0 + bld r3,5 + bst r4,0 + bld r0,0 + bst r5,4 + bld r4,0 + bst r5,7 + bld r5,4 + bst r4,3 + bld r5,7 + bst r0,0 + bld r4,3 + bst r4,1 + bld r0,0 + bst r5,0 + bld r4,1 + bst r5,6 + bld r5,0 + bst r4,7 + bld r5,6 + bst r0,0 + bld r4,7 + bst r4,2 + bld r0,0 + bst r4,4 + bld r4,2 + bst r5,5 + bld r4,4 + bst r5,3 + bld r5,5 + bst r0,0 + bld r5,3 + bst r4,5 + bld r0,0 + bst r5,1 + bld r4,5 + bst r5,2 + bld r5,1 + bst r4,6 + bld r5,2 + bst r0,0 + bld r4,6 + movw r18,r4 + movw r4,r20 + movw r20,r18 + and r18,r22 + and r19,r23 + eor r2,r18 + eor r3,r19 + com r4 + com r5 + eor r22,r4 + eor r23,r5 + eor r4,r2 + eor r5,r3 + mov r0,r20 + or r0,r22 + eor r2,r0 + mov r0,r21 + or r0,r23 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r20,r0 + mov r0,r23 + and r0,r5 + eor r21,r0 + mov r0,r20 + and r0,r2 + eor r22,r0 + mov r0,r21 + and r0,r3 + eor r23,r0 + ret +1362: + ldd r26,Y+17 + ldd r27,Y+18 + bst r20,0 + bld r18,0 + bst r22,0 + bld r18,1 + bst r2,0 + bld r18,2 + bst r4,0 + bld r18,3 + bst r20,1 + bld r18,4 + bst r22,1 + bld r18,5 + bst r2,1 + bld r18,6 + bst r4,1 + bld r18,7 + bst r20,2 + bld r19,0 + bst r22,2 + bld r19,1 + bst r2,2 + bld r19,2 + bst r4,2 + bld r19,3 + bst r20,3 + bld r19,4 + bst r22,3 + bld r19,5 + bst r2,3 + bld r19,6 + bst r4,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r20,4 + bld r18,0 + bst r22,4 + bld r18,1 + bst r2,4 + bld r18,2 + bst r4,4 + bld r18,3 + bst r20,5 + bld r18,4 + bst r22,5 + bld r18,5 + bst r2,5 + bld r18,6 + bst r4,5 + bld r18,7 + bst r20,6 + bld r19,0 + bst r22,6 + bld r19,1 + bst r2,6 + bld r19,2 + bst r4,6 + bld r19,3 + bst r20,7 + bld r19,4 + bst r22,7 + bld r19,5 + bst r2,7 + bld r19,6 + bst r4,7 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,0 + bld r18,0 + bst r23,0 + bld r18,1 + bst r3,0 + bld r18,2 + bst r5,0 + bld r18,3 + bst r21,1 + bld r18,4 + bst r23,1 + bld r18,5 + bst r3,1 + bld r18,6 + bst r5,1 + bld r18,7 + bst r21,2 + bld r19,0 + bst r23,2 + bld r19,1 + bst r3,2 + bld r19,2 + bst r5,2 + bld r19,3 + bst r21,3 + bld r19,4 + bst r23,3 + bld r19,5 + bst r3,3 + bld r19,6 + bst r5,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,4 + bld r18,0 + bst r23,4 + bld r18,1 + bst r3,4 + bld r18,2 + bst r5,4 + bld r18,3 + bst r21,5 + bld r18,4 + bst r23,5 + bld r18,5 + bst r3,5 + bld r18,6 + bst r5,5 + bld r18,7 + bst r21,6 + bld r19,0 + bst r23,6 + bld r19,1 + bst r3,6 + bld r19,2 + bst r5,6 + bld r19,3 + bst r21,7 + bld r19,4 + bst r23,7 + bld r19,5 + bst r3,7 + bld r19,6 + bst r5,7 + bld r19,7 + st X+,r18 + st X+,r19 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64n_decrypt, .-gift64n_decrypt + + .text +.global gift64t_encrypt + .type gift64t_encrypt, @function +gift64t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 30 + ld r8,Z + ldd r9,Z+1 + ldd r10,Z+2 + ldd r11,Z+3 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,0 + bst r20,1 + bld r2,0 + bst r20,2 + bld r4,0 + bst r20,3 + bld r6,0 + bst r20,4 + bld r22,1 + bst r20,5 + bld r2,1 + bst r20,6 + bld r4,1 + bst r20,7 + bld r6,1 + bst r21,0 + bld r22,2 + bst r21,1 + bld r2,2 + bst r21,2 + bld r4,2 + bst r21,3 + bld r6,2 + bst r21,4 + bld r22,3 + bst r21,5 + bld r2,3 + bst r21,6 + bld r4,3 + bst r21,7 + bld r6,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,4 + bst r20,1 + bld r2,4 + bst r20,2 + bld r4,4 + bst r20,3 + bld r6,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r2,5 + bst r20,6 + bld r4,5 + bst r20,7 + bld r6,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r2,6 + bst r21,2 + bld r4,6 + bst r21,3 + bld r6,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r2,7 + bst r21,6 + bld r4,7 + bst r21,7 + bld r6,7 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,0 + bst r20,1 + bld r3,0 + bst r20,2 + bld r5,0 + bst r20,3 + bld r7,0 + bst r20,4 + bld r23,1 + bst r20,5 + bld r3,1 + bst r20,6 + bld r5,1 + bst r20,7 + bld r7,1 + bst r21,0 + bld r23,2 + bst r21,1 + bld r3,2 + bst r21,2 + bld r5,2 + bst r21,3 + bld r7,2 + bst r21,4 + bld r23,3 + bst r21,5 + bld r3,3 + bst r21,6 + bld r5,3 + bst r21,7 + bld r7,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,4 + bst r20,1 + bld r3,4 + bst r20,2 + bld r5,4 + bst r20,3 + bld r7,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r3,5 + bst r20,6 + bld r5,5 + bst r20,7 + bld r7,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r3,6 + bst r21,2 + bld r5,6 + bst r21,3 + bld r7,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r3,7 + bst r21,6 + bld r5,7 + bst r21,7 + bld r7,7 + rcall 1073f + ldi r20,1 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,3 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,7 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,15 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,31 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,62 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,61 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,59 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,55 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,47 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,30 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,60 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,57 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,51 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,39 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,14 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,29 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,58 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,53 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,43 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,22 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,44 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,24 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,48 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,33 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,2 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,5 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,11 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rjmp 1264f +1073: + mov r0,r22 + and r0,r4 + eor r2,r0 + mov r0,r23 + and r0,r5 + eor r3,r0 + mov r0,r2 + and r0,r6 + eor r22,r0 + mov r0,r3 + and r0,r7 + eor r23,r0 + mov r0,r22 + or r0,r2 + eor r4,r0 + mov r0,r23 + or r0,r3 + eor r5,r0 + eor r6,r4 + eor r7,r5 + eor r2,r6 + eor r3,r7 + com r6 + com r7 + movw r20,r22 + mov r0,r2 + and r0,r20 + eor r4,r0 + mov r0,r3 + and r0,r21 + eor r5,r0 + movw r22,r6 + movw r6,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r22,3 + bld r22,4 + bst r23,4 + bld r22,3 + bst r0,0 + bld r23,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r0,0 + bld r23,0 + bst r22,5 + bld r0,0 + bst r22,7 + bld r22,5 + bst r23,7 + bld r22,7 + bst r23,5 + bld r23,7 + bst r0,0 + bld r23,5 + bst r22,6 + bld r0,0 + bst r23,3 + bld r22,6 + bst r23,6 + bld r23,3 + bst r23,1 + bld r23,6 + bst r0,0 + bld r23,1 + bst r2,0 + bld r0,0 + bst r2,1 + bld r2,0 + bst r2,5 + bld r2,1 + bst r2,4 + bld r2,5 + bst r0,0 + bld r2,4 + bst r2,2 + bld r0,0 + bst r3,1 + bld r2,2 + bst r2,7 + bld r3,1 + bst r3,4 + bld r2,7 + bst r0,0 + bld r3,4 + bst r2,3 + bld r0,0 + bst r3,5 + bld r2,3 + bst r2,6 + bld r3,5 + bst r3,0 + bld r2,6 + bst r0,0 + bld r3,0 + bst r3,2 + bld r0,0 + bst r3,3 + bld r3,2 + bst r3,7 + bld r3,3 + bst r3,6 + bld r3,7 + bst r0,0 + bld r3,6 + bst r4,0 + bld r0,0 + bst r4,2 + bld r4,0 + bst r5,2 + bld r4,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,1 + bld r0,0 + bst r4,6 + bld r4,1 + bst r5,1 + bld r4,6 + bst r4,4 + bld r5,1 + bst r0,0 + bld r4,4 + bst r4,3 + bld r0,0 + bst r5,6 + bld r4,3 + bst r5,3 + bld r5,6 + bst r5,4 + bld r5,3 + bst r0,0 + bld r5,4 + bst r4,7 + bld r0,0 + bst r5,5 + bld r4,7 + bst r0,0 + bld r5,5 + bst r6,0 + bld r0,0 + bst r6,3 + bld r6,0 + bst r7,7 + bld r6,3 + bst r7,4 + bld r7,7 + bst r0,0 + bld r7,4 + bst r6,1 + bld r0,0 + bst r6,7 + bld r6,1 + bst r7,6 + bld r6,7 + bst r7,0 + bld r7,6 + bst r0,0 + bld r7,0 + bst r6,2 + bld r0,0 + bst r7,3 + bld r6,2 + bst r7,5 + bld r7,3 + bst r6,4 + bld r7,5 + bst r0,0 + bld r6,4 + bst r6,5 + bld r0,0 + bst r6,6 + bld r6,5 + bst r7,2 + bld r6,6 + bst r7,1 + bld r7,2 + bst r0,0 + bld r7,1 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ret +1264: + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r20,0 + bst r2,0 + bld r20,1 + bst r4,0 + bld r20,2 + bst r6,0 + bld r20,3 + bst r22,1 + bld r20,4 + bst r2,1 + bld r20,5 + bst r4,1 + bld r20,6 + bst r6,1 + bld r20,7 + bst r22,2 + bld r21,0 + bst r2,2 + bld r21,1 + bst r4,2 + bld r21,2 + bst r6,2 + bld r21,3 + bst r22,3 + bld r21,4 + bst r2,3 + bld r21,5 + bst r4,3 + bld r21,6 + bst r6,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r22,4 + bld r20,0 + bst r2,4 + bld r20,1 + bst r4,4 + bld r20,2 + bst r6,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r2,5 + bld r20,5 + bst r4,5 + bld r20,6 + bst r6,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r2,6 + bld r21,1 + bst r4,6 + bld r21,2 + bst r6,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r2,7 + bld r21,5 + bst r4,7 + bld r21,6 + bst r6,7 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,0 + bld r20,0 + bst r3,0 + bld r20,1 + bst r5,0 + bld r20,2 + bst r7,0 + bld r20,3 + bst r23,1 + bld r20,4 + bst r3,1 + bld r20,5 + bst r5,1 + bld r20,6 + bst r7,1 + bld r20,7 + bst r23,2 + bld r21,0 + bst r3,2 + bld r21,1 + bst r5,2 + bld r21,2 + bst r7,2 + bld r21,3 + bst r23,3 + bld r21,4 + bst r3,3 + bld r21,5 + bst r5,3 + bld r21,6 + bst r7,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,4 + bld r20,0 + bst r3,4 + bld r20,1 + bst r5,4 + bld r20,2 + bst r7,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r3,5 + bld r20,5 + bst r5,5 + bld r20,6 + bst r7,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r3,6 + bld r21,1 + bst r5,6 + bld r21,2 + bst r7,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r3,7 + bld r21,5 + bst r5,7 + bld r21,6 + bst r7,7 + bld r21,7 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64t_encrypt, .-gift64t_encrypt + + .text +.global gift64t_decrypt + .type gift64t_decrypt, @function +gift64t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 30 + ld r8,Z + ldd r9,Z+1 + ldd r10,Z+2 + ldd r11,Z+3 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,0 + bst r20,1 + bld r2,0 + bst r20,2 + bld r4,0 + bst r20,3 + bld r6,0 + bst r20,4 + bld r22,1 + bst r20,5 + bld r2,1 + bst r20,6 + bld r4,1 + bst r20,7 + bld r6,1 + bst r21,0 + bld r22,2 + bst r21,1 + bld r2,2 + bst r21,2 + bld r4,2 + bst r21,3 + bld r6,2 + bst r21,4 + bld r22,3 + bst r21,5 + bld r2,3 + bst r21,6 + bld r4,3 + bst r21,7 + bld r6,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,4 + bst r20,1 + bld r2,4 + bst r20,2 + bld r4,4 + bst r20,3 + bld r6,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r2,5 + bst r20,6 + bld r4,5 + bst r20,7 + bld r6,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r2,6 + bst r21,2 + bld r4,6 + bst r21,3 + bld r6,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r2,7 + bst r21,6 + bld r4,7 + bst r21,7 + bld r6,7 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,0 + bst r20,1 + bld r3,0 + bst r20,2 + bld r5,0 + bst r20,3 + bld r7,0 + bst r20,4 + bld r23,1 + bst r20,5 + bld r3,1 + bst r20,6 + bld r5,1 + bst r20,7 + bld r7,1 + bst r21,0 + bld r23,2 + bst r21,1 + bld r3,2 + bst r21,2 + bld r5,2 + bst r21,3 + bld r7,2 + bst r21,4 + bld r23,3 + bst r21,5 + bld r3,3 + bst r21,6 + bld r5,3 + bst r21,7 + bld r7,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,4 + bst r20,1 + bld r3,4 + bst r20,2 + bld r5,4 + bst r20,3 + bld r7,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r3,5 + bst r20,6 + bld r5,5 + bst r20,7 + bld r7,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r3,6 + bst r21,2 + bld r5,6 + bst r21,3 + bld r7,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r3,7 + bst r21,6 + bld r5,7 + bst r21,7 + bld r7,7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,11 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,5 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,2 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,33 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,48 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,24 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,44 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,22 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,43 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,53 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,58 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,29 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,14 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,39 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,51 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,57 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,60 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,30 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,47 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,55 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,59 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,61 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,62 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,31 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,15 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,7 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,3 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,1 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + rjmp 1374f +1185: + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + bst r22,1 + bld r0,0 + bst r23,4 + bld r22,1 + bst r22,3 + bld r23,4 + bst r22,4 + bld r22,3 + bst r0,0 + bld r22,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r0,0 + bld r23,0 + bst r22,5 + bld r0,0 + bst r23,5 + bld r22,5 + bst r23,7 + bld r23,5 + bst r22,7 + bld r23,7 + bst r0,0 + bld r22,7 + bst r22,6 + bld r0,0 + bst r23,1 + bld r22,6 + bst r23,6 + bld r23,1 + bst r23,3 + bld r23,6 + bst r0,0 + bld r23,3 + bst r2,0 + bld r0,0 + bst r2,4 + bld r2,0 + bst r2,5 + bld r2,4 + bst r2,1 + bld r2,5 + bst r0,0 + bld r2,1 + bst r2,2 + bld r0,0 + bst r3,4 + bld r2,2 + bst r2,7 + bld r3,4 + bst r3,1 + bld r2,7 + bst r0,0 + bld r3,1 + bst r2,3 + bld r0,0 + bst r3,0 + bld r2,3 + bst r2,6 + bld r3,0 + bst r3,5 + bld r2,6 + bst r0,0 + bld r3,5 + bst r3,2 + bld r0,0 + bst r3,6 + bld r3,2 + bst r3,7 + bld r3,6 + bst r3,3 + bld r3,7 + bst r0,0 + bld r3,3 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r4,2 + bld r5,2 + bst r0,0 + bld r4,2 + bst r4,1 + bld r0,0 + bst r4,4 + bld r4,1 + bst r5,1 + bld r4,4 + bst r4,6 + bld r5,1 + bst r0,0 + bld r4,6 + bst r4,3 + bld r0,0 + bst r5,4 + bld r4,3 + bst r5,3 + bld r5,4 + bst r5,6 + bld r5,3 + bst r0,0 + bld r5,6 + bst r4,7 + bld r0,0 + bst r5,5 + bld r4,7 + bst r0,0 + bld r5,5 + bst r6,0 + bld r0,0 + bst r7,4 + bld r6,0 + bst r7,7 + bld r7,4 + bst r6,3 + bld r7,7 + bst r0,0 + bld r6,3 + bst r6,1 + bld r0,0 + bst r7,0 + bld r6,1 + bst r7,6 + bld r7,0 + bst r6,7 + bld r7,6 + bst r0,0 + bld r6,7 + bst r6,2 + bld r0,0 + bst r6,4 + bld r6,2 + bst r7,5 + bld r6,4 + bst r7,3 + bld r7,5 + bst r0,0 + bld r7,3 + bst r6,5 + bld r0,0 + bst r7,1 + bld r6,5 + bst r7,2 + bld r7,1 + bst r6,6 + bld r7,2 + bst r0,0 + bld r6,6 + movw r20,r6 + movw r6,r22 + movw r22,r20 + and r20,r2 + and r21,r3 + eor r4,r20 + eor r5,r21 + com r6 + com r7 + eor r2,r6 + eor r3,r7 + eor r6,r4 + eor r7,r5 + mov r0,r22 + or r0,r2 + eor r4,r0 + mov r0,r23 + or r0,r3 + eor r5,r0 + mov r0,r2 + and r0,r6 + eor r22,r0 + mov r0,r3 + and r0,r7 + eor r23,r0 + mov r0,r22 + and r0,r4 + eor r2,r0 + mov r0,r23 + and r0,r5 + eor r3,r0 + ret +1374: + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r20,0 + bst r2,0 + bld r20,1 + bst r4,0 + bld r20,2 + bst r6,0 + bld r20,3 + bst r22,1 + bld r20,4 + bst r2,1 + bld r20,5 + bst r4,1 + bld r20,6 + bst r6,1 + bld r20,7 + bst r22,2 + bld r21,0 + bst r2,2 + bld r21,1 + bst r4,2 + bld r21,2 + bst r6,2 + bld r21,3 + bst r22,3 + bld r21,4 + bst r2,3 + bld r21,5 + bst r4,3 + bld r21,6 + bst r6,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r22,4 + bld r20,0 + bst r2,4 + bld r20,1 + bst r4,4 + bld r20,2 + bst r6,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r2,5 + bld r20,5 + bst r4,5 + bld r20,6 + bst r6,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r2,6 + bld r21,1 + bst r4,6 + bld r21,2 + bst r6,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r2,7 + bld r21,5 + bst r4,7 + bld r21,6 + bst r6,7 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,0 + bld r20,0 + bst r3,0 + bld r20,1 + bst r5,0 + bld r20,2 + bst r7,0 + bld r20,3 + bst r23,1 + bld r20,4 + bst r3,1 + bld r20,5 + bst r5,1 + bld r20,6 + bst r7,1 + bld r20,7 + bst r23,2 + bld r21,0 + bst r3,2 + bld r21,1 + bst r5,2 + bld r21,2 + bst r7,2 + bld r21,3 + bst r23,3 + bld r21,4 + bst r3,3 + bld r21,5 + bst r5,3 + bld r21,6 + bst r7,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,4 + bld r20,0 + bst r3,4 + bld r20,1 + bst r5,4 + bld r20,2 + bst r7,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r3,5 + bld r20,5 + bst r5,5 + bld r20,6 + bst r7,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r3,6 + bld r21,1 + bst r5,6 + bld r21,2 + bst r7,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r3,7 + bld r21,5 + bst r5,7 + bld r21,6 + bst r7,7 + bld r21,7 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64t_decrypt, .-gift64t_decrypt + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.c b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.c new file mode 100644 index 0000000..81bc8a3 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.c @@ -0,0 +1,1205 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift64.h" +#include "internal-util.h" +#include + +#if !GIFT64_LOW_MEMORY + +/* Round constants for GIFT-64 in the fixsliced representation */ +static uint32_t const GIFT64_RC[28] = { + 0x22000011, 0x00002299, 0x11118811, 0x880000ff, 0x33111199, 0x990022ee, + 0x22119933, 0x880033bb, 0x22119999, 0x880022ff, 0x11119922, 0x880033cc, + 0x33008899, 0x99002299, 0x33118811, 0x880000ee, 0x33110099, 0x990022aa, + 0x22118833, 0x880022bb, 0x22111188, 0x88002266, 0x00009922, 0x88003300, + 0x22008811, 0x00002288, 0x00118811, 0x880000bb +}; + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift64b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t t = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= t; \ + (a) ^= t << (shift); \ + } while (0) + +/** + * \brief Performs the GIFT-64 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift64b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-64 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift64b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/* Rotates a state word left by 1 position in the fixsliced representation: + * + * 0 1 2 3 1 2 3 0 + * 4 5 6 7 ==> 5 6 7 4 + * 8 9 10 11 9 10 11 8 + * 12 13 14 15 13 14 14 12 + */ +#define gift64b_rotate_left_1(x) \ + ((((x) >> 1) & 0x77777777U) | (((x) & 0x11111111U) << 3)) + +/* Rotates a state word left by 2 positions in the fixsliced representation: + * + * 0 1 2 3 2 3 0 1 + * 4 5 6 7 ==> 6 7 4 5 + * 8 9 10 11 10 11 8 9 + * 12 13 14 15 14 15 12 13 + */ +#define gift64b_rotate_left_2(x) \ + ((((x) >> 2) & 0x33333333U) | (((x) & 0x33333333U) << 2)) + +/* Rotates a state word left by 3 positions in the fixsliced representation: + * + * 0 1 2 3 3 0 1 2 + * 4 5 6 7 ==> 7 4 5 6 + * 8 9 10 11 11 8 9 10 + * 12 13 14 15 15 12 13 14 + */ +#define gift64b_rotate_left_3(x) \ + ((((x) >> 3) & 0x11111111U) | (((x) & 0x77777777U) << 1)) + +/* Rotates a state word right by 1 position in the fixsliced representation */ +#define gift64b_rotate_right_1(x) gift64b_rotate_left_3(x) + +/* Rotates a state word right by 2 positions in the fixsliced representation */ +#define gift64b_rotate_right_2(x) gift64b_rotate_left_2(x) + +/* Rotates a state word right by 3 positions in the fixsliced representation */ +#define gift64b_rotate_right_3(x) gift64b_rotate_left_1(x) + +/* Rotates a state word up by 1 position in the fixsliced representation: + * + * 0 1 2 3 4 5 6 7 + * 4 5 6 7 ==> 8 9 10 11 + * 8 9 10 11 12 13 14 15 + * 12 13 14 15 0 1 2 3 + */ +#define gift64b_rotate_up_1(x) (rightRotate8((x))) + +/* Rotates a state word up by 2 positions in the fixsliced representation: + * + * 0 1 2 3 8 9 10 11 + * 4 5 6 7 ==> 12 13 14 15 + * 8 9 10 11 0 1 2 3 + * 12 13 14 15 4 5 6 7 + */ +#define gift64b_rotate_up_2(x) (rightRotate16((x))) + +/* Rotates a state word up by 3 positions in the fixsliced representation: + * + * 0 1 2 3 12 13 14 15 + * 4 5 6 7 ==> 0 1 2 3 + * 8 9 10 11 4 5 6 7 + * 12 13 14 15 8 9 10 11 + */ +#define gift64b_rotate_up_3(x) (rightRotate24((x))) + +/* Rotates a state word down by 1 position in the fixsliced representation */ +#define gift64b_rotate_down_1(x) gift64b_rotate_up_3(x) + +/* Rotates a state word down by 2 positions in the fixsliced representation */ +#define gift64b_rotate_down_2(x) gift64b_rotate_up_2(x) + +/* Rotates a state word down by 3 positions in the fixsliced representation */ +#define gift64b_rotate_down_3(x) gift64b_rotate_up_1(x) + +/* Permutation code to rearrange key bits into fixsliced form. Permutations + * generated wth "http://programming.sirrida.de/calcperm.php" */ +#define gift64b_rearrange1_transpose_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 8 16 24 3 11 19 27 2 10 18 26 1 9 17 25 * */ \ + bit_permute_step(out, 0x0000CCCCU, 16); \ + bit_permute_step(out, 0x30030330U, 2); \ + bit_permute_step(out, 0x00960096U, 8); \ + bit_permute_step(out, 0x05500550U, 1); \ + bit_permute_step(out, 0x0A0A0A0AU, 4); \ + } while (0) +#define gift64b_rearrange1_transpose_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 8 16 24 3 11 19 27 2 10 18 26 1 9 17 25 * */ \ + bit_permute_step(out, 0x0000CCCCU, 16); \ + bit_permute_step(out, 0x30030330U, 2); \ + bit_permute_step(out, 0x00960096U, 8); \ + bit_permute_step(out, 0x05500550U, 1); \ + bit_permute_step(out, 0x0A0A0A0AU, 4); \ + } while (0) +#define gift64b_rearrange1_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 1 2 3 24 25 26 27 16 17 18 19 8 9 10 11 * */ \ + out = (out & 0x0000000FU) | ((out & 0x00000F00U) << 8) | \ + ((out & 0x000000F0U) << 20) | ((out & 0x0000F000U) >> 4); \ + } while (0) +#define gift64b_rearrange1_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 1 2 3 24 25 26 27 16 17 18 19 8 9 10 11 * */ \ + out = (out & 0x0000000FU) | ((out & 0x00000F00U) << 8) | \ + ((out & 0x000000F0U) << 20) | ((out & 0x0000F000U) >> 4); \ + } while (0) +#define gift64b_rearrange2_transpose_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 * */ \ + bit_permute_step(out, 0x0A0A0A0AU, 3); \ + bit_permute_step(out, 0x00CC00CCU, 6); \ + bit_permute_step(out, 0x0000F0F0U, 12); \ + bit_permute_step(out, 0x0000FF00U, 8); \ + } while (0) +#define gift64b_rearrange2_transpose_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 * */ \ + bit_permute_step(out, 0x0A0A0A0AU, 3); \ + bit_permute_step(out, 0x00CC00CCU, 6); \ + bit_permute_step(out, 0x0000F0F0U, 12); \ + bit_permute_step(out, 0x0000FF00U, 8); \ + } while (0) +#define gift64b_rearrange2_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27 * */ \ + out = (out & 0x0000000FU) | ((out & 0x000000F0U) << 4) | \ + ((out & 0x00000F00U) << 8) | ((out & 0x0000F000U) << 12); \ + } while (0) +#define gift64b_rearrange2_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27 * */ \ + out = (out & 0x0000000FU) | ((out & 0x000000F0U) << 4) | \ + ((out & 0x00000F00U) << 8) | ((out & 0x0000F000U) << 12); \ + } while (0) + +void gift64n_update_round_keys(gift64n_key_schedule_t *ks) +{ + uint32_t x; + + /* First round */ + gift64b_rearrange1_transpose_low(x, ks->k[3]); + ks->rk[0] = ~(x | (x << 4)); + gift64b_rearrange1_transpose_high(x, ks->k[3]); + ks->rk[1] = x | (x << 4); + + /* Second round */ + gift64b_rearrange1_low(x, ks->k[2]); + x = x | (x << 4); + gift64b_swap_move(x, x, 0x22222222U, 2); + ks->rk[2] = ~x; + gift64b_rearrange1_high(x, ks->k[2]); + x = x | (x << 4); + gift64b_swap_move(x, x, 0x22222222U, 2); + ks->rk[3] = x; + + /* Third round */ + gift64b_rearrange2_transpose_low(x, ks->k[1]); + gift64b_swap_move(x, x, 0x00000F00U, 16); + ks->rk[4] = ~(x | (x << 4)); + gift64b_rearrange2_transpose_high(x, ks->k[1]); + gift64b_swap_move(x, x, 0x00000F00U, 16); + ks->rk[5] = x | (x << 4); + + /* Fourth round */ + gift64b_rearrange2_low(x, ks->k[0]); + ks->rk[6] = ~(x | (x << 4)); + gift64b_rearrange2_high(x, ks->k[0]); + ks->rk[7] = x | (x << 4); +} + +/** + * \brief Perform the core of GIFT-64 encryption on two blocks in parallel. + * + * \param ks Points to the key schedule to use to encrypt the blocks. + * \param state Buffer containing the two blocks in bit-sliced form, + * on input and output. + * \param Tweak value or zero if there is no tweak. + */ +static void gift64b_encrypt_core + (const gift64n_key_schedule_t *ks, uint32_t state[4], uint32_t tweak) +{ + const uint32_t *rc = GIFT64_RC; + uint32_t s0, s1, s2, s3, temp; + uint32_t rk[8]; + uint8_t round; + + /* Start with the pre-computed round keys for the first four rounds */ + memcpy(rk, ks->rk, sizeof(ks->rk)); + + /* Load the state into local variables */ + s0 = state[0]; + s1 = state[1]; + s2 = state[2]; + s3 = state[3]; + + /* Perform all 28 rounds four at a time. We use the "fixslicing" method. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of four rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 4 rounds. + */ + for (round = 0; round < 28; round += 4, rc += 4) { + /* 1st round - S-box, rotate left, add round key */ + gift64b_sbox(s0, s1, s2, s3); + s1 = gift64b_rotate_left_1(s1); + s2 = gift64b_rotate_left_2(s2); + s0 = gift64b_rotate_left_3(s0); + s3 ^= rk[0]; + s1 ^= rk[1]; + s0 ^= rc[0]; + + /* 2nd round - S-box, rotate up, add round key (s0 and s3 swapped) */ + gift64b_sbox(s3, s1, s2, s0); + s1 = gift64b_rotate_up_1(s1); + s2 = gift64b_rotate_up_2(s2); + s3 = gift64b_rotate_up_3(s3); + s0 ^= rk[2]; + s1 ^= rk[3]; + s3 ^= rc[1]; + + /* 3rd round - S-box, rotate right, add round key */ + gift64b_sbox(s0, s1, s2, s3); + s1 = gift64b_rotate_right_1(s1); + s2 = gift64b_rotate_right_2(s2); + s0 = gift64b_rotate_right_3(s0); + s3 ^= rk[4]; + s1 ^= rk[5]; + s0 ^= rc[2]; + + /* 4th round - S-box, rotate down, add round key (s0 and s3 swapped) */ + gift64b_sbox(s3, s1, s2, s0); + s1 = gift64b_rotate_down_1(s1); + s2 = gift64b_rotate_down_2(s2); + s3 = gift64b_rotate_down_3(s3); + s0 ^= rk[6]; + s1 ^= rk[7]; + s3 ^= rc[3]; + + /* Add the tweak every four encryption rounds except the last */ + if (round < 24) + s2 ^= tweak; + + /* Derive the round keys for the next 4 rounds */ + rk[0] = gift64b_rotate_left_1(rk[0]); + rk[1] = (gift64b_rotate_left_3(rk[1]) << 16) | (rk[1] >> 16); + rk[2] = rightRotate8(rk[2]); + temp = gift64b_rotate_left_2(rk[3]); + rk[3] = (temp & 0x99999999U) | leftRotate8(temp & 0x66666666U); + rk[4] = gift64b_rotate_left_3(rk[4]); + temp = rightRotate16(rk[5]); + rk[5] = (gift64b_rotate_left_1(temp) & 0x00FFFF00U) | + (temp & 0xFF0000FFU); + rk[6] = leftRotate8(rk[6]); + temp = gift64b_rotate_left_2(rk[7]); + rk[7] = (temp & 0x33333333U) | rightRotate8(temp & 0xCCCCCCCCU); + } + + /* Copy the local variables to the output state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +/** + * \brief Perform the core of GIFT-64 decryption on two blocks in parallel. + * + * \param ks Points to the key schedule to use to encrypt the blocks. + * \param state Buffer containing the two blocks in bit-sliced form, + * on input and output. + * \param Tweak value or zero if there is no tweak. + */ +static void gift64b_decrypt_core + (const gift64n_key_schedule_t *ks, uint32_t state[4], uint32_t tweak) +{ + const uint32_t *rc = GIFT64_RC + 28 - 4; + uint32_t s0, s1, s2, s3, temp; + uint32_t rk[8]; + uint8_t round; + + /* Start with the pre-computed round keys for the first four rounds */ + memcpy(rk, ks->rk, sizeof(ks->rk)); + + /* Fast forward the key schedule to the end by permuting each round + * key by the amount it would see under the full set of rounds. + * Generated with "http://programming.sirrida.de/calcperm.php" */ + /* P0: 1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 + * 19 16 21 22 23 20 25 26 27 24 29 30 31 28 */ + rk[0] = ((rk[0] & 0x77777777U) << 1) | ((rk[0] & 0x88888888U) >> 3); + /* P1: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + * 31 3 0 1 2 7 4 5 6 11 8 9 10 15 12 13 14 */ + rk[1] = ((rk[1] & 0xEEEE0000U) >> 17) | ((rk[1] & 0x0000FFFFU) << 16) | + ((rk[1] & 0x11110000U) >> 13); + /* P2: 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + * 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 */ + rk[2] = leftRotate8(rk[2]); + /* P3: 2 27 24 1 6 31 28 5 10 3 0 9 14 7 4 13 18 11 + * 8 17 22 15 12 21 26 19 16 25 30 23 20 29 */ + rk[3] = ((rk[3] & 0x11111111U) << 2) | leftRotate22(rk[3] & 0x44444444U) | + leftRotate26(rk[3] & 0x22222222U) | ((rk[3] & 0x88888888U) >> 2); + /* P4: 3 0 1 2 7 4 5 6 11 8 9 10 15 12 13 14 19 16 + * 17 18 23 20 21 22 27 24 25 26 31 28 29 30 */ + rk[4] = ((rk[4] & 0x11111111U) << 3) | ((rk[4] & 0xEEEEEEEEU) >> 1); + /* P5: 16 17 18 19 20 21 22 23 25 26 27 24 29 30 31 + * 28 1 2 3 0 5 6 7 4 8 9 10 11 12 13 14 15 */ + rk[5] = leftRotate13(rk[5] & 0x00888800U) | + leftRotate16(rk[5] & 0xFF0000FFU) | + leftRotate17(rk[5] & 0x00777700U); + /* P6: 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 8 9 10 + * 11 12 13 14 15 16 17 18 19 20 21 22 23 */ + rk[6] = leftRotate24(rk[6]); + /* P7: 2 3 8 9 6 7 12 13 10 11 16 17 14 15 20 21 18 19 + * 24 25 22 23 28 29 26 27 0 1 30 31 4 5 */ + rk[7] = ((rk[7] & 0x33333333U) << 2) | leftRotate6(rk[7] & 0xCCCCCCCCU); + + /* Load the state into local variables */ + s0 = state[0]; + s1 = state[1]; + s2 = state[2]; + s3 = state[3]; + + /* Perform all 28 rounds four at a time. We use the "fixslicing" method. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of four rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 4 rounds. + */ + for (round = 0; round < 28; round += 4, rc -= 4) { + /* Derive the round keys for the previous 4 rounds */ + rk[0] = gift64b_rotate_right_1(rk[0]); + temp = rk[1] >> 16; + rk[1] = gift64b_rotate_right_3(temp) | (rk[1] << 16); + rk[2] = leftRotate8(rk[2]); + temp = (rk[3] & 0x99999999U) | rightRotate8(rk[3] & 0x66666666U); + rk[3] = gift64b_rotate_right_2(temp); + rk[4] = gift64b_rotate_right_3(rk[4]); + temp = (gift64b_rotate_right_1(rk[5]) & 0x00FFFF00U) | + (rk[5] & 0xFF0000FFU); + rk[5] = leftRotate16(temp); + rk[6] = rightRotate8(rk[6]); + temp = (rk[7] & 0x33333333U) | leftRotate8(rk[7] & 0xCCCCCCCCU); + rk[7] = gift64b_rotate_right_2(temp); + + /* Add the tweak every four decryption rounds except the first */ + if (round != 0) + s2 ^= tweak; + + /* 4th round - S-box, rotate down, add round key (s0 and s3 swapped) */ + s0 ^= rk[6]; + s1 ^= rk[7]; + s3 ^= rc[3]; + s1 = gift64b_rotate_up_1(s1); + s2 = gift64b_rotate_up_2(s2); + s3 = gift64b_rotate_up_3(s3); + gift64b_inv_sbox(s0, s1, s2, s3); + + /* 3rd round - S-box, rotate right, add round key */ + s3 ^= rk[4]; + s1 ^= rk[5]; + s0 ^= rc[2]; + s1 = gift64b_rotate_left_1(s1); + s2 = gift64b_rotate_left_2(s2); + s0 = gift64b_rotate_left_3(s0); + gift64b_inv_sbox(s3, s1, s2, s0); + + /* 2nd round - S-box, rotate up, add round key (s0 and s3 swapped) */ + s0 ^= rk[2]; + s1 ^= rk[3]; + s3 ^= rc[1]; + s1 = gift64b_rotate_down_1(s1); + s2 = gift64b_rotate_down_2(s2); + s3 = gift64b_rotate_down_3(s3); + gift64b_inv_sbox(s0, s1, s2, s3); + + /* 1st round - S-box, rotate left, add round key */ + s3 ^= rk[0]; + s1 ^= rk[1]; + s0 ^= rc[0]; + s1 = gift64b_rotate_right_1(s1); + s2 = gift64b_rotate_right_2(s2); + s0 = gift64b_rotate_right_3(s0); + gift64b_inv_sbox(s3, s1, s2, s0); + } + + /* Copy the local variables to the output state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian byte order from the LOTUS-AEAD submission */ + ks->k[0] = le_load_word32(key + 12); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key); + gift64n_update_round_keys(ks); +} + +/** + * \brief Converts the GIFT-64 nibble-based representation into word-based + * (littlen-endian version). + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The output words will be in fixsliced form. Technically the output will + * contain two blocks for gift64b_encrypt_core() to process in parallel but + * both blocks will have the same value. + */ +static void gift64n_to_words(uint32_t output[4], const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input block into 32-bit words */ + s0 = le_load_word32(input); + s2 = le_load_word32(input + 4); + + /* Rearrange the bits in the block */ + gift64b_swap_move(s0, s0, 0x0A0A0A0AU, 3); + gift64b_swap_move(s0, s0, 0x00CC00CCU, 6); + gift64b_swap_move(s0, s0, 0x0000FF00U, 8); + gift64b_swap_move(s2, s2, 0x0A0A0A0AU, 3); + gift64b_swap_move(s2, s2, 0x00CC00CCU, 6); + gift64b_swap_move(s2, s2, 0x0000FF00U, 8); + + /* Split into two identical blocks in fixsliced form */ + s1 = s0; + s3 = s2; + gift64b_swap_move(s0, s1, 0x0F0F0F0FU, 4); + gift64b_swap_move(s2, s3, 0x0F0F0F0FU, 4); + gift64b_swap_move(s0, s2, 0x0000FFFFU, 16); + gift64b_swap_move(s1, s3, 0x0000FFFFU, 16); + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +/** + * \brief Converts the GIFT-64 word-based representation into nibble-based + * (little-endian version). + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + * + * The input words are in fixsliced form. Technically there are two + * identical blocks in the input. We drop one when we write to the output. + */ +static void gift64n_to_nibbles(unsigned char *output, const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Load the state and split the two blocks into separate words */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + gift64b_swap_move(s0, s2, 0x0000FFFFU, 16); + gift64b_swap_move(s1, s3, 0x0000FFFFU, 16); + gift64b_swap_move(s0, s1, 0x0F0F0F0FU, 4); + gift64b_swap_move(s2, s3, 0x0F0F0F0FU, 4); + + /* Rearrange the bits in the first block back into nibble form */ + gift64b_swap_move(s0, s0, 0x0000FF00U, 8); + gift64b_swap_move(s0, s0, 0x00CC00CCU, 6); + gift64b_swap_move(s0, s0, 0x0A0A0A0AU, 3); + gift64b_swap_move(s2, s2, 0x0000FF00U, 8); + gift64b_swap_move(s2, s2, 0x00CC00CCU, 6); + gift64b_swap_move(s2, s2, 0x0A0A0A0AU, 3); + le_store_word32(output, s0); + le_store_word32(output + 4, s2); +} + +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_encrypt_core(ks, state, 0); + gift64n_to_nibbles(output, state); +} + +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_decrypt_core(ks, state, 0); + gift64n_to_nibbles(output, state); +} + +/* 4-bit tweak values expanded to 32-bit in fixsliced form */ +static uint32_t const GIFT64_tweaks[16] = { + 0x00000000, 0xee11ee11, 0xdd22dd22, 0x33333333, 0xbb44bb44, 0x55555555, + 0x66666666, 0x88778877, 0x77887788, 0x99999999, 0xaaaaaaaa, 0x44bb44bb, + 0xcccccccc, 0x22dd22dd, 0x11ee11ee, 0xffffffff +}; + +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_encrypt_core(ks, state, GIFT64_tweaks[tweak & 0x0F]); + gift64n_to_nibbles(output, state); +} + +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_decrypt_core(ks, state, GIFT64_tweaks[tweak & 0x0F]); + gift64n_to_nibbles(output, state); +} + +#elif !defined(__AVR__) /* GIFT64_LOW_MEMORY */ + +/* Round constants for GIFT-64 */ +static uint8_t const GIFT64_RC[28] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B +}; + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint16_t y = (_y); \ + uint16_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step_simple */ +#define bit_permute_step_simple(_y, mask, shift) \ + do { \ + (_y) = (((_y) & (mask)) << (shift)) | (((_y) >> (shift)) & (mask)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 4 bits with respect to the next: + * + * P0: 0 12 8 4 1 13 9 5 2 14 10 6 3 15 11 7 + * P1: 4 0 12 8 5 1 13 9 6 2 14 10 7 3 15 11 + * P2: 8 4 0 12 9 5 1 13 10 6 2 14 11 7 3 15 + * P3: 12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3 + * + * The most efficient permutation from the online generator was P1, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P1 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM1_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a, 3); \ + bit_permute_step(x, 0x00cc, 6); \ + bit_permute_step_simple(x, 0x0f0f, 4); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate12_16(_x); \ + } while (0) +#define PERM1(x) PERM1_INNER(x) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate4_16(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate8_16(_x); \ + } while (0) + +#define INV_PERM1_INNER(x) \ + do { \ + bit_permute_step(x, 0x0505, 5); \ + bit_permute_step(x, 0x00cc, 6); \ + bit_permute_step_simple(x, 0x0f0f, 4); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate12_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) INV_PERM1_INNER(x) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate4_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = rightRotate8_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with GIFT-64 (bit-sliced). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +static void gift64b_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word16(input); + s1 = be_load_word16(input + 2); + s2 = be_load_word16(input + 4); + s3 = be_load_word16(input + 6); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + + /* Perform all 28 rounds */ + for (round = 0; round < 28; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 64-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); +} + +/** + * \brief Decrypts a 64-bit block with GIFT-64 (bit-sliced). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +static void gift64b_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word16(input); + s1 = be_load_word16(input + 2); + s2 = be_load_word16(input + 4); + s3 = be_load_word16(input + 6); + + /* Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 28; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 7 times for the full 28 rounds. The overall + * effect is to apply a "14 right and 28 left" bit-rotation to every word + * in the key schedule. That is equivalent to "14 right and 12 left" + * on the 16-bit sub-words. + */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + w0 = ((w0 & 0xC0000000U) >> 14) | ((w0 & 0x3FFF0000U) << 2) | + ((w0 & 0x0000000FU) << 12) | ((w0 & 0x0000FFF0U) >> 4); + w1 = ((w1 & 0xC0000000U) >> 14) | ((w1 & 0x3FFF0000U) << 2) | + ((w1 & 0x0000000FU) << 12) | ((w1 & 0x0000FFF0U) >> 4); + w2 = ((w2 & 0xC0000000U) >> 14) | ((w2 & 0x3FFF0000U) << 2) | + ((w2 & 0x0000000FU) << 12) | ((w2 & 0x0000FFF0U) >> 4); + w3 = ((w3 & 0xC0000000U) >> 14) | ((w3 & 0x3FFF0000U) << 2) | + ((w3 & 0x0000000FU) << 12) | ((w3 & 0x0000FFF0U) >> 4); + + /* Perform all 28 rounds */ + for (round = 28; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); +} + +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian byte order from the LOTUS-AEAD submission */ + ks->k[0] = le_load_word32(key + 12); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key); +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step_32(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts the GIFT-64 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift64n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1; + + /* Load the input buffer into 32-bit words. We use the nibble order from + * the LOTUS-AEAD submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-64 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 4); + s1 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step_32(x, 0x0a0a0a0a, 3); \ + bit_permute_step_32(x, 0x00cc00cc, 6); \ + bit_permute_step_32(x, 0x0000f0f0, 12); \ + bit_permute_step_32(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)(s0 >> 8); + output[3] = (uint8_t)(s1 >> 8); + output[4] = (uint8_t)(s0 >> 16); + output[5] = (uint8_t)(s1 >> 16); + output[6] = (uint8_t)(s0 >> 24); + output[7] = (uint8_t)(s1 >> 24); +} + +/** + * \brief Converts the GIFT-64 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift64n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s1 contains the least significant */ + s0 = (((uint32_t)(input[6])) << 24) | + (((uint32_t)(input[4])) << 16) | + (((uint32_t)(input[2])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[7])) << 24) | + (((uint32_t)(input[5])) << 16) | + (((uint32_t)(input[3])) << 8) | + ((uint32_t)(input[1])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step_32(x, 0x00aa00aa, 7); \ + bit_permute_step_32(x, 0x0000cccc, 14); \ + bit_permute_step_32(x, 0x00f000f0, 4); \ + bit_permute_step_32(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 4, s0); + le_store_word32(output, s1); +} + +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift64n_to_words(output, input); + gift64b_encrypt(ks, output, output); + gift64n_to_nibbles(output, output); +} + +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift64n_to_words(output, input); + gift64b_decrypt(ks, output, output); + gift64n_to_nibbles(output, output); +} + +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift64n_to_words(output, input); + s0 = be_load_word16(output); + s1 = be_load_word16(output + 2); + s2 = be_load_word16(output + 4); + s3 = be_load_word16(output + 6); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + + /* Perform all 28 rounds */ + for (round = 0; round < 28; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 64-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round]; + + /* AddTweak - XOR in the tweak every 4 rounds except the last */ + if (((round + 1) % 4) == 0 && round < 27) + s2 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); + gift64n_to_nibbles(output, output); +} + +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift64n_to_words(output, input); + s0 = be_load_word16(output); + s1 = be_load_word16(output + 2); + s2 = be_load_word16(output + 4); + s3 = be_load_word16(output + 6); + + /* Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 28; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 7 times for the full 28 rounds. The overall + * effect is to apply a "14 right and 28 left" bit-rotation to every word + * in the key schedule. That is equivalent to "14 right and 12 left" + * on the 16-bit sub-words. + */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + w0 = ((w0 & 0xC0000000U) >> 14) | ((w0 & 0x3FFF0000U) << 2) | + ((w0 & 0x0000000FU) << 12) | ((w0 & 0x0000FFF0U) >> 4); + w1 = ((w1 & 0xC0000000U) >> 14) | ((w1 & 0x3FFF0000U) << 2) | + ((w1 & 0x0000000FU) << 12) | ((w1 & 0x0000FFF0U) >> 4); + w2 = ((w2 & 0xC0000000U) >> 14) | ((w2 & 0x3FFF0000U) << 2) | + ((w2 & 0x0000000FU) << 12) | ((w2 & 0x0000FFF0U) >> 4); + w3 = ((w3 & 0xC0000000U) >> 14) | ((w3 & 0x3FFF0000U) << 2) | + ((w3 & 0x0000000FU) << 12) | ((w3 & 0x0000FFF0U) >> 4); + + /* Perform all 28 rounds */ + for (round = 28; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 4 rounds except the last */ + if ((round % 4) == 0 && round != 28) + s2 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); + gift64n_to_nibbles(output, output); +} + +#endif /* GIFT64_LOW_MEMORY */ diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.h b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.h new file mode 100644 index 0000000..010359b --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-gift64.h @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT64_H +#define LW_INTERNAL_GIFT64_H + +/** + * \file internal-gift64.h + * \brief GIFT-64 block cipher. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \var GIFT64_LOW_MEMORY + * \brief Define this to 1 to use a low memory version of the key schedule. + * + * The default is to use the fix-sliced version of GIFT-64 which is very + * fast on 32-bit platforms but requires 48 bytes to store the key schedule. + * The large key schedule may be a problem on 8-bit and 16-bit platforms. + * The fix-sliced version also encrypts two blocks at a time in 32-bit + * words which is an unnecessary optimization for 8-bit platforms. + * + * GIFT64_LOW_MEMORY can be defined to 1 to select the original non + * fix-sliced version which only requires 16 bytes to store the key, + * with the rest of the key schedule expanded on the fly. + */ +#if !defined(GIFT64_LOW_MEMORY) +#if defined(__AVR__) +#define GIFT64_LOW_MEMORY 1 +#else +#define GIFT64_LOW_MEMORY 0 +#endif +#endif + +/** + * \brief Size of a GIFT-64 block in bytes. + */ +#define GIFT64_BLOCK_SIZE 8 + +/** + * \brief Structure of the key schedule for GIFT-64. + */ +typedef struct +{ + uint32_t k[4]; /**< Words of the key schedule */ +#if !GIFT64_LOW_MEMORY + uint32_t rk[8]; /**< Pre-computed round keys for fixsliced form */ +#endif + +} gift64n_key_schedule_t; + +/** + * \fn void gift64n_update_round_keys(gift64n_key_schedule_t *ks); + * \brief Updates the round keys after a change in the base key. + * + * \param ks Points to the key schedule to update. + */ +#if GIFT64_LOW_MEMORY +#define gift64n_update_round_keys(ks) do { ; } while (0) /* Not needed */ +#else +void gift64n_update_round_keys(gift64n_key_schedule_t *ks); +#endif + +/** + * \brief Initializes the key schedule for GIFT-64 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 64-bit block with GIFT-64 (nibble-based). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 64-bit block with GIFT-64 (nibble-based). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 16-bit for TweGIFT-64 */ +#define GIFT64T_TWEAK_0 0x0000 /**< TweGIFT-64 tweak value 0 */ +#define GIFT64T_TWEAK_1 0xe1e1 /**< TweGIFT-64 tweak value 1 */ +#define GIFT64T_TWEAK_2 0xd2d2 /**< TweGIFT-64 tweak value 2 */ +#define GIFT64T_TWEAK_3 0x3333 /**< TweGIFT-64 tweak value 3 */ +#define GIFT64T_TWEAK_4 0xb4b4 /**< TweGIFT-64 tweak value 4 */ +#define GIFT64T_TWEAK_5 0x5555 /**< TweGIFT-64 tweak value 5 */ +#define GIFT64T_TWEAK_6 0x6666 /**< TweGIFT-64 tweak value 6 */ +#define GIFT64T_TWEAK_7 0x8787 /**< TweGIFT-64 tweak value 7 */ +#define GIFT64T_TWEAK_8 0x7878 /**< TweGIFT-64 tweak value 8 */ +#define GIFT64T_TWEAK_9 0x9999 /**< TweGIFT-64 tweak value 9 */ +#define GIFT64T_TWEAK_10 0xaaaa /**< TweGIFT-64 tweak value 10 */ +#define GIFT64T_TWEAK_11 0x4b4b /**< TweGIFT-64 tweak value 11 */ +#define GIFT64T_TWEAK_12 0xcccc /**< TweGIFT-64 tweak value 12 */ +#define GIFT64T_TWEAK_13 0x2d2d /**< TweGIFT-64 tweak value 13 */ +#define GIFT64T_TWEAK_14 0x1e1e /**< TweGIFT-64 tweak value 14 */ +#define GIFT64T_TWEAK_15 0xffff /**< TweGIFT-64 tweak value 15 */ + +/** + * \brief Encrypts a 64-bit block with TweGIFT-64 (tweakable variant). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * \param tweak 4-bit tweak value expanded to 16-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift64n_encrypt(). + */ +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak); + +/** + * \brief Decrypts a 64-bit block with TweGIFT-64 (tweakable variant). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * \param tweak 4-bit tweak value expanded to 16-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift64n_decrypt(). + */ +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-util.h b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.c b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.c new file mode 100644 index 0000000..4a1efd0 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.c @@ -0,0 +1,436 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "lotus-locus.h" +#include "internal-gift64.h" +#include "internal-util.h" +#include + +aead_cipher_t const lotus_aead_cipher = { + "LOTUS-AEAD", + LOTUS_AEAD_KEY_SIZE, + LOTUS_AEAD_NONCE_SIZE, + LOTUS_AEAD_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + lotus_aead_encrypt, + lotus_aead_decrypt +}; + +aead_cipher_t const locus_aead_cipher = { + "LOCUS-AEAD", + LOCUS_AEAD_KEY_SIZE, + LOCUS_AEAD_NONCE_SIZE, + LOCUS_AEAD_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + locus_aead_encrypt, + locus_aead_decrypt +}; + +/** + * \brief Multiplies a key by 2 in the GF(128) field. + * + * \param ks The key schedule structure containing the key in host byte order. + */ +STATIC_INLINE void lotus_or_locus_mul_2(gift64n_key_schedule_t *ks) +{ + uint32_t mask = (uint32_t)(((int32_t)(ks->k[0])) >> 31); + ks->k[0] = (ks->k[0] << 1) | (ks->k[1] >> 31); + ks->k[1] = (ks->k[1] << 1) | (ks->k[2] >> 31); + ks->k[2] = (ks->k[2] << 1) | (ks->k[3] >> 31); + ks->k[3] = (ks->k[3] << 1) ^ (mask & 0x87); + gift64n_update_round_keys(ks); +} + +/** + * \brief Initializes a LOTUS-AEAD or LOCUS-AEAD cipher instance. + * + * \param ks Key schedule to initialize. + * \param deltaN Delta-N value for the cipher state. + * \param key Points to the 16-byte key for the cipher instance. + * \param nonce Points to the 16-byte key for the cipher instance. + * \param T Points to a temporary buffer of LOTUS_AEAD_KEY_SIZE bytes + * that will be destroyed during this function. + */ +static void lotus_or_locus_init + (gift64n_key_schedule_t *ks, + unsigned char deltaN[GIFT64_BLOCK_SIZE], + const unsigned char *key, + const unsigned char *nonce, + unsigned char *T) +{ + gift64n_init(ks, key); + memset(deltaN, 0, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, deltaN, deltaN, GIFT64T_TWEAK_0); + lw_xor_block_2_src(T, key, nonce, LOTUS_AEAD_KEY_SIZE); + gift64n_init(ks, T); + gift64t_encrypt(ks, deltaN, deltaN, GIFT64T_TWEAK_1); +} + +/** + * \brief Processes associated data for LOTUS-AEAD or LOCUS-AEAD. + * + * \param ks Points to the key schedule. + * \param deltaN Points to the Delta-N value from the state. + * \param V Points to the V value from the state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void lotus_or_locus_process_ad + (gift64n_key_schedule_t *ks, + const unsigned char deltaN[GIFT64_BLOCK_SIZE], + unsigned char V[GIFT64_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned char temp; + while (adlen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(ks); + lw_xor_block_2_src(X, ad, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_2); + lw_xor_block(V, X, GIFT64_BLOCK_SIZE); + ad += GIFT64_BLOCK_SIZE; + adlen -= GIFT64_BLOCK_SIZE; + } + lotus_or_locus_mul_2(ks); + temp = (unsigned)adlen; + if (temp < GIFT64_BLOCK_SIZE) { + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(X, ad, temp); + X[temp] ^= 0x01; + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_3); + } else { + lw_xor_block_2_src(X, ad, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_2); + } + lw_xor_block(V, X, GIFT64_BLOCK_SIZE); +} + +/** + * \brief Generates the authentication tag for LOTUS-AEAD or LOCUS-AEAD. + * + * \param ks Points to the key schedule. + * \param tag Points to the buffer to receive the authentication tag. + * \param deltaN Points to the Delta-N value from the state. + * \param W Points to the W value from the state. + * \param V Points to the V value from the state. + */ +static void lotus_or_locus_gen_tag + (gift64n_key_schedule_t *ks, unsigned char *tag, + unsigned char deltaN[GIFT64_BLOCK_SIZE], + unsigned char W[GIFT64_BLOCK_SIZE], + unsigned char V[GIFT64_BLOCK_SIZE]) +{ + lotus_or_locus_mul_2(ks); + lw_xor_block(W, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(W, V, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, W, W, GIFT64T_TWEAK_6); + lw_xor_block_2_src(tag, W, deltaN, GIFT64_BLOCK_SIZE); +} + +int lotus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X1[GIFT64_BLOCK_SIZE]; + unsigned char X2[GIFT64_BLOCK_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + LOTUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > (GIFT64_BLOCK_SIZE * 2)) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X1, m, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_4); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block_2_src + (X2, m + GIFT64_BLOCK_SIZE, X2, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(c, X2, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block_2_src + (c + GIFT64_BLOCK_SIZE, X1, X2, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE * 2; + m += GIFT64_BLOCK_SIZE * 2; + mlen -= GIFT64_BLOCK_SIZE * 2; + } + temp = (unsigned)mlen; + lotus_or_locus_mul_2(&ks); + memcpy(X1, deltaN, GIFT64_BLOCK_SIZE); + X1[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_12); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_12); + if (temp <= GIFT64_BLOCK_SIZE) { + lw_xor_block(WV, m, temp); + lw_xor_block(X2, m, temp); + lw_xor_block_2_src(c, X2, deltaN, temp); + } else { + lw_xor_block(X2, m, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(c, X2, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + temp -= GIFT64_BLOCK_SIZE; + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, m, temp); + lw_xor_block(X1, X2, temp); + lw_xor_block_2_src(c, X1, m, temp); + } + c += temp; + } + + /* Generate the authentication tag */ + lotus_or_locus_gen_tag(&ks, c, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return 0; +} + +int lotus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X1[GIFT64_BLOCK_SIZE]; + unsigned char X2[GIFT64_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < LOTUS_AEAD_TAG_SIZE) + return -1; + *mlen = clen - LOTUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= LOTUS_AEAD_TAG_SIZE; + if (clen > 0) { + while (clen > (GIFT64_BLOCK_SIZE * 2)) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X1, c, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_5); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block(X2, c + GIFT64_BLOCK_SIZE, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(m, X2, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block_2_src + (m + GIFT64_BLOCK_SIZE, X1, X2, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE * 2; + m += GIFT64_BLOCK_SIZE * 2; + clen -= GIFT64_BLOCK_SIZE * 2; + } + temp = (unsigned)clen; + lotus_or_locus_mul_2(&ks); + memcpy(X1, deltaN, GIFT64_BLOCK_SIZE); + X1[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_12); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_12); + if (temp <= GIFT64_BLOCK_SIZE) { + lw_xor_block_2_src(m, X2, c, temp); + lw_xor_block(m, deltaN, temp); + lw_xor_block(X2, m, temp); + lw_xor_block(WV, m, temp); + } else { + lw_xor_block_2_src(m, X2, c, GIFT64_BLOCK_SIZE); + lw_xor_block(m, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(X2, m, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + temp -= GIFT64_BLOCK_SIZE; + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(X1, X2, temp); + lw_xor_block_2_src(m, X1, c, temp); + lw_xor_block(WV, m, temp); + } + c += temp; + } + + /* Check the authentication tag */ + lotus_or_locus_gen_tag(&ks, WV, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return aead_check_tag(mtemp, *mlen, WV, c, LOTUS_AEAD_TAG_SIZE); +} + +int locus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + LOCUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X, m, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block_2_src(c, X, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + mlen -= GIFT64_BLOCK_SIZE; + } + temp = (unsigned)mlen; + lotus_or_locus_mul_2(&ks); + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + X[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + lw_xor_block(WV, m, temp); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(X, deltaN, temp); + lw_xor_block_2_src(c, m, X, temp); + c += temp; + } + + /* Generate the authentication tag */ + lotus_or_locus_gen_tag(&ks, c, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return 0; +} + +int locus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < LOCUS_AEAD_TAG_SIZE) + return -1; + *mlen = clen - LOCUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= LOCUS_AEAD_TAG_SIZE; + if (clen > 0) { + while (clen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X, c, deltaN, GIFT64_BLOCK_SIZE); + gift64t_decrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_decrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block_2_src(m, X, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + clen -= GIFT64_BLOCK_SIZE; + } + temp = (unsigned)clen; + lotus_or_locus_mul_2(&ks); + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + X[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(X, deltaN, temp); + lw_xor_block_2_src(m, c, X, temp); + lw_xor_block(WV, m, temp); + c += temp; + } + + /* Check the authentication tag */ + lotus_or_locus_gen_tag(&ks, WV, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return aead_check_tag(mtemp, *mlen, WV, c, LOCUS_AEAD_TAG_SIZE); +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.h b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.h new file mode 100644 index 0000000..85434a8 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64locusaeadv1/rhys-avr/lotus-locus.h @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_LOTUS_LOCUS_H +#define LWCRYPTO_LOTUS_LOCUS_H + +#include "aead-common.h" + +/** + * \file lotus-locus.h + * \brief LOTUS-AEAD and LOCUS-AEAD authenticated encryption algorithms. + * + * LOTUS-AEAD and LOCUS-AEAD are authenticated encryption algorithms + * that are based around a tweakable variant of the GIFT-64 block cipher + * called TweGIFT-64. Both AEAD algorithms have a 128-bit key, a 128-bit + * nonce, and a 64-bit tag. + * + * The two algorithms have the same key initialization, associated data + * processing, and tag generation mechanisms. They differ in how the + * input is encrypted with TweGIFT-64. + * + * LOTUS-AEAD uses a method similar to the block cipher mode OTR. + * TweGIFT-64 is essentially converted into a 128-bit block cipher + * using a Feistel construction and four TweGIFT-64 block operations + * every 16 bytes of input. + * + * LOCUS-AEAD uses a method similar to the block cipher mode OCB + * with two TweGIFT-64 block operations for every 8 bytes of input. + * LOCUS-AEAD requires both the block encrypt and block decrypt + * operations of TweGIFT-64, which increases the overall code size. + * LOTUS-AEAD only needs the block encrypt operation. + * + * LOTUS-AEAD is the primary member of the family. + * + * References: https://www.isical.ac.in/~lightweight/lotus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for LOTUS-AEAD. + */ +#define LOTUS_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for LOTUS-AEAD. + */ +#define LOTUS_AEAD_TAG_SIZE 8 + +/** + * \brief Size of the nonce for LOTUS-AEAD. + */ +#define LOTUS_AEAD_NONCE_SIZE 16 + +/** + * \brief Size of the key for LOCUS-AEAD. + */ +#define LOCUS_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for LOCUS-AEAD. + */ +#define LOCUS_AEAD_TAG_SIZE 8 + +/** + * \brief Size of the nonce for LOCUS-AEAD. + */ +#define LOCUS_AEAD_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the LOTUS-AEAD cipher. + */ +extern aead_cipher_t const lotus_aead_cipher; + +/** + * \brief Meta-information block for the LOCUS-AEAD cipher. + */ +extern aead_cipher_t const locus_aead_cipher; + +/** + * \brief Encrypts and authenticates a packet with LOTUS-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa lotus_aead_decrypt() + */ +int lotus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with LOTUS-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 9 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa lotus_aead_encrypt() + */ +int lotus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with LOCUS-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa locus_aead_decrypt() + */ +int locus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with LOCUS-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 9 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa locus_aead_encrypt() + */ +int locus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.c b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.h b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/api.h b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/api.h new file mode 100644 index 0000000..4bf8f5c --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/encrypt.c b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..e089543 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "lotus-locus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return lotus_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return lotus_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64-avr.S b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64-avr.S new file mode 100644 index 0000000..fdb668d --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64-avr.S @@ -0,0 +1,6047 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global gift64n_init + .type gift64n_init, @function +gift64n_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ret + .size gift64n_init, .-gift64n_init + + .text +.global gift64n_encrypt + .type gift64n_encrypt, @function +gift64n_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 28 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,0 + bst r18,1 + bld r22,0 + bst r18,2 + bld r2,0 + bst r18,3 + bld r4,0 + bst r18,4 + bld r20,1 + bst r18,5 + bld r22,1 + bst r18,6 + bld r2,1 + bst r18,7 + bld r4,1 + bst r19,0 + bld r20,2 + bst r19,1 + bld r22,2 + bst r19,2 + bld r2,2 + bst r19,3 + bld r4,2 + bst r19,4 + bld r20,3 + bst r19,5 + bld r22,3 + bst r19,6 + bld r2,3 + bst r19,7 + bld r4,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,4 + bst r18,1 + bld r22,4 + bst r18,2 + bld r2,4 + bst r18,3 + bld r4,4 + bst r18,4 + bld r20,5 + bst r18,5 + bld r22,5 + bst r18,6 + bld r2,5 + bst r18,7 + bld r4,5 + bst r19,0 + bld r20,6 + bst r19,1 + bld r22,6 + bst r19,2 + bld r2,6 + bst r19,3 + bld r4,6 + bst r19,4 + bld r20,7 + bst r19,5 + bld r22,7 + bst r19,6 + bld r2,7 + bst r19,7 + bld r4,7 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,0 + bst r18,1 + bld r23,0 + bst r18,2 + bld r3,0 + bst r18,3 + bld r5,0 + bst r18,4 + bld r21,1 + bst r18,5 + bld r23,1 + bst r18,6 + bld r3,1 + bst r18,7 + bld r5,1 + bst r19,0 + bld r21,2 + bst r19,1 + bld r23,2 + bst r19,2 + bld r3,2 + bst r19,3 + bld r5,2 + bst r19,4 + bld r21,3 + bst r19,5 + bld r23,3 + bst r19,6 + bld r3,3 + bst r19,7 + bld r5,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,4 + bst r18,1 + bld r23,4 + bst r18,2 + bld r3,4 + bst r18,3 + bld r5,4 + bst r18,4 + bld r21,5 + bst r18,5 + bld r23,5 + bst r18,6 + bld r3,5 + bst r18,7 + bld r5,5 + bst r19,0 + bld r21,6 + bst r19,1 + bld r23,6 + bst r19,2 + bld r3,6 + bst r19,3 + bld r5,6 + bst r19,4 + bld r21,7 + bst r19,5 + bld r23,7 + bst r19,6 + bld r3,7 + bst r19,7 + bld r5,7 + rcall 1061f + ldi r18,1 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,3 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,7 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,15 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,31 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,62 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,61 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,59 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,55 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,47 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,30 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,60 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,57 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,51 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,39 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,14 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,29 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,58 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,53 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,43 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,22 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,44 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,24 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,48 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + rcall 1061f + ldi r18,33 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + rcall 1061f + ldi r18,2 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + rcall 1061f + ldi r18,5 + ldi r19,128 + eor r4,r18 + eor r5,r19 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + rcall 1061f + ldi r18,11 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rjmp 1252f +1061: + mov r0,r20 + and r0,r2 + eor r22,r0 + mov r0,r21 + and r0,r3 + eor r23,r0 + mov r0,r22 + and r0,r4 + eor r20,r0 + mov r0,r23 + and r0,r5 + eor r21,r0 + mov r0,r20 + or r0,r22 + eor r2,r0 + mov r0,r21 + or r0,r23 + eor r3,r0 + eor r4,r2 + eor r5,r3 + eor r22,r4 + eor r23,r5 + com r4 + com r5 + movw r18,r20 + mov r0,r22 + and r0,r18 + eor r2,r0 + mov r0,r23 + and r0,r19 + eor r3,r0 + movw r20,r4 + movw r4,r18 + bst r20,1 + bld r0,0 + bst r20,4 + bld r20,1 + bst r20,3 + bld r20,4 + bst r21,4 + bld r20,3 + bst r0,0 + bld r21,4 + bst r20,2 + bld r0,0 + bst r21,0 + bld r20,2 + bst r0,0 + bld r21,0 + bst r20,5 + bld r0,0 + bst r20,7 + bld r20,5 + bst r21,7 + bld r20,7 + bst r21,5 + bld r21,7 + bst r0,0 + bld r21,5 + bst r20,6 + bld r0,0 + bst r21,3 + bld r20,6 + bst r21,6 + bld r21,3 + bst r21,1 + bld r21,6 + bst r0,0 + bld r21,1 + bst r22,0 + bld r0,0 + bst r22,1 + bld r22,0 + bst r22,5 + bld r22,1 + bst r22,4 + bld r22,5 + bst r0,0 + bld r22,4 + bst r22,2 + bld r0,0 + bst r23,1 + bld r22,2 + bst r22,7 + bld r23,1 + bst r23,4 + bld r22,7 + bst r0,0 + bld r23,4 + bst r22,3 + bld r0,0 + bst r23,5 + bld r22,3 + bst r22,6 + bld r23,5 + bst r23,0 + bld r22,6 + bst r0,0 + bld r23,0 + bst r23,2 + bld r0,0 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r23,6 + bld r23,7 + bst r0,0 + bld r23,6 + bst r2,0 + bld r0,0 + bst r2,2 + bld r2,0 + bst r3,2 + bld r2,2 + bst r3,0 + bld r3,2 + bst r0,0 + bld r3,0 + bst r2,1 + bld r0,0 + bst r2,6 + bld r2,1 + bst r3,1 + bld r2,6 + bst r2,4 + bld r3,1 + bst r0,0 + bld r2,4 + bst r2,3 + bld r0,0 + bst r3,6 + bld r2,3 + bst r3,3 + bld r3,6 + bst r3,4 + bld r3,3 + bst r0,0 + bld r3,4 + bst r2,7 + bld r0,0 + bst r3,5 + bld r2,7 + bst r0,0 + bld r3,5 + bst r4,0 + bld r0,0 + bst r4,3 + bld r4,0 + bst r5,7 + bld r4,3 + bst r5,4 + bld r5,7 + bst r0,0 + bld r5,4 + bst r4,1 + bld r0,0 + bst r4,7 + bld r4,1 + bst r5,6 + bld r4,7 + bst r5,0 + bld r5,6 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,3 + bld r4,2 + bst r5,5 + bld r5,3 + bst r4,4 + bld r5,5 + bst r0,0 + bld r4,4 + bst r4,5 + bld r0,0 + bst r4,6 + bld r4,5 + bst r5,2 + bld r4,6 + bst r5,1 + bld r5,2 + bst r0,0 + bld r5,1 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + ret +1252: + ldd r26,Y+17 + ldd r27,Y+18 + bst r20,0 + bld r18,0 + bst r22,0 + bld r18,1 + bst r2,0 + bld r18,2 + bst r4,0 + bld r18,3 + bst r20,1 + bld r18,4 + bst r22,1 + bld r18,5 + bst r2,1 + bld r18,6 + bst r4,1 + bld r18,7 + bst r20,2 + bld r19,0 + bst r22,2 + bld r19,1 + bst r2,2 + bld r19,2 + bst r4,2 + bld r19,3 + bst r20,3 + bld r19,4 + bst r22,3 + bld r19,5 + bst r2,3 + bld r19,6 + bst r4,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r20,4 + bld r18,0 + bst r22,4 + bld r18,1 + bst r2,4 + bld r18,2 + bst r4,4 + bld r18,3 + bst r20,5 + bld r18,4 + bst r22,5 + bld r18,5 + bst r2,5 + bld r18,6 + bst r4,5 + bld r18,7 + bst r20,6 + bld r19,0 + bst r22,6 + bld r19,1 + bst r2,6 + bld r19,2 + bst r4,6 + bld r19,3 + bst r20,7 + bld r19,4 + bst r22,7 + bld r19,5 + bst r2,7 + bld r19,6 + bst r4,7 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,0 + bld r18,0 + bst r23,0 + bld r18,1 + bst r3,0 + bld r18,2 + bst r5,0 + bld r18,3 + bst r21,1 + bld r18,4 + bst r23,1 + bld r18,5 + bst r3,1 + bld r18,6 + bst r5,1 + bld r18,7 + bst r21,2 + bld r19,0 + bst r23,2 + bld r19,1 + bst r3,2 + bld r19,2 + bst r5,2 + bld r19,3 + bst r21,3 + bld r19,4 + bst r23,3 + bld r19,5 + bst r3,3 + bld r19,6 + bst r5,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,4 + bld r18,0 + bst r23,4 + bld r18,1 + bst r3,4 + bld r18,2 + bst r5,4 + bld r18,3 + bst r21,5 + bld r18,4 + bst r23,5 + bld r18,5 + bst r3,5 + bld r18,6 + bst r5,5 + bld r18,7 + bst r21,6 + bld r19,0 + bst r23,6 + bld r19,1 + bst r3,6 + bld r19,2 + bst r5,6 + bld r19,3 + bst r21,7 + bld r19,4 + bst r23,7 + bld r19,5 + bst r3,7 + bld r19,6 + bst r5,7 + bld r19,7 + st X+,r18 + st X+,r19 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64n_encrypt, .-gift64n_encrypt + + .text +.global gift64n_decrypt + .type gift64n_decrypt, @function +gift64n_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 28 + ld r6,Z + ldd r7,Z+1 + ldd r8,Z+2 + ldd r9,Z+3 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Z+4 + ldd r7,Z+5 + ldd r8,Z+6 + ldd r9,Z+7 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Z+8 + ldd r7,Z+9 + ldd r8,Z+10 + ldd r9,Z+11 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,0 + bst r18,1 + bld r22,0 + bst r18,2 + bld r2,0 + bst r18,3 + bld r4,0 + bst r18,4 + bld r20,1 + bst r18,5 + bld r22,1 + bst r18,6 + bld r2,1 + bst r18,7 + bld r4,1 + bst r19,0 + bld r20,2 + bst r19,1 + bld r22,2 + bst r19,2 + bld r2,2 + bst r19,3 + bld r4,2 + bst r19,4 + bld r20,3 + bst r19,5 + bld r22,3 + bst r19,6 + bld r2,3 + bst r19,7 + bld r4,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r20,4 + bst r18,1 + bld r22,4 + bst r18,2 + bld r2,4 + bst r18,3 + bld r4,4 + bst r18,4 + bld r20,5 + bst r18,5 + bld r22,5 + bst r18,6 + bld r2,5 + bst r18,7 + bld r4,5 + bst r19,0 + bld r20,6 + bst r19,1 + bld r22,6 + bst r19,2 + bld r2,6 + bst r19,3 + bld r4,6 + bst r19,4 + bld r20,7 + bst r19,5 + bld r22,7 + bst r19,6 + bld r2,7 + bst r19,7 + bld r4,7 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,0 + bst r18,1 + bld r23,0 + bst r18,2 + bld r3,0 + bst r18,3 + bld r5,0 + bst r18,4 + bld r21,1 + bst r18,5 + bld r23,1 + bst r18,6 + bld r3,1 + bst r18,7 + bld r5,1 + bst r19,0 + bld r21,2 + bst r19,1 + bld r23,2 + bst r19,2 + bld r3,2 + bst r19,3 + bld r5,2 + bst r19,4 + bld r21,3 + bst r19,5 + bld r23,3 + bst r19,6 + bld r3,3 + bst r19,7 + bld r5,3 + ld r18,X+ + ld r19,X+ + bst r18,0 + bld r21,4 + bst r18,1 + bld r23,4 + bst r18,2 + bld r3,4 + bst r18,3 + bld r5,4 + bst r18,4 + bld r21,5 + bst r18,5 + bld r23,5 + bst r18,6 + bld r3,5 + bst r18,7 + bld r5,5 + bst r19,0 + bld r21,6 + bst r19,1 + bld r23,6 + bst r19,2 + bld r3,6 + bst r19,3 + bld r5,6 + bst r19,4 + bld r21,7 + bst r19,5 + bld r23,7 + bst r19,6 + bld r3,7 + bst r19,7 + bld r5,7 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,11 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,5 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,2 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,33 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,48 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,24 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,44 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,22 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,43 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,53 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,58 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,29 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,14 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,39 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,51 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,57 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,60 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,30 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,47 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,55 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,59 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,61 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,62 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,31 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r6,Y+1 + ldd r7,Y+2 + ldd r8,Y+3 + ldd r9,Y+4 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,15 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+1,r6 + std Y+2,r7 + std Y+3,r8 + std Y+4,r9 + ldd r6,Y+5 + ldd r7,Y+6 + ldd r8,Y+7 + ldd r9,Y+8 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,7 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+5,r6 + std Y+6,r7 + std Y+7,r8 + std Y+8,r9 + ldd r6,Y+9 + ldd r7,Y+10 + ldd r8,Y+11 + ldd r9,Y+12 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,3 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + std Y+9,r6 + std Y+10,r7 + std Y+11,r8 + std Y+12,r9 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + mov r0,r1 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + lsr r7 + ror r6 + ror r0 + or r7,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + ldi r18,1 + ldi r19,128 + eor r4,r18 + eor r5,r19 + rcall 1173f + rjmp 1362f +1173: + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + bst r20,1 + bld r0,0 + bst r21,4 + bld r20,1 + bst r20,3 + bld r21,4 + bst r20,4 + bld r20,3 + bst r0,0 + bld r20,4 + bst r20,2 + bld r0,0 + bst r21,0 + bld r20,2 + bst r0,0 + bld r21,0 + bst r20,5 + bld r0,0 + bst r21,5 + bld r20,5 + bst r21,7 + bld r21,5 + bst r20,7 + bld r21,7 + bst r0,0 + bld r20,7 + bst r20,6 + bld r0,0 + bst r21,1 + bld r20,6 + bst r21,6 + bld r21,1 + bst r21,3 + bld r21,6 + bst r0,0 + bld r21,3 + bst r22,0 + bld r0,0 + bst r22,4 + bld r22,0 + bst r22,5 + bld r22,4 + bst r22,1 + bld r22,5 + bst r0,0 + bld r22,1 + bst r22,2 + bld r0,0 + bst r23,4 + bld r22,2 + bst r22,7 + bld r23,4 + bst r23,1 + bld r22,7 + bst r0,0 + bld r23,1 + bst r22,3 + bld r0,0 + bst r23,0 + bld r22,3 + bst r22,6 + bld r23,0 + bst r23,5 + bld r22,6 + bst r0,0 + bld r23,5 + bst r23,2 + bld r0,0 + bst r23,6 + bld r23,2 + bst r23,7 + bld r23,6 + bst r23,3 + bld r23,7 + bst r0,0 + bld r23,3 + bst r2,0 + bld r0,0 + bst r3,0 + bld r2,0 + bst r3,2 + bld r3,0 + bst r2,2 + bld r3,2 + bst r0,0 + bld r2,2 + bst r2,1 + bld r0,0 + bst r2,4 + bld r2,1 + bst r3,1 + bld r2,4 + bst r2,6 + bld r3,1 + bst r0,0 + bld r2,6 + bst r2,3 + bld r0,0 + bst r3,4 + bld r2,3 + bst r3,3 + bld r3,4 + bst r3,6 + bld r3,3 + bst r0,0 + bld r3,6 + bst r2,7 + bld r0,0 + bst r3,5 + bld r2,7 + bst r0,0 + bld r3,5 + bst r4,0 + bld r0,0 + bst r5,4 + bld r4,0 + bst r5,7 + bld r5,4 + bst r4,3 + bld r5,7 + bst r0,0 + bld r4,3 + bst r4,1 + bld r0,0 + bst r5,0 + bld r4,1 + bst r5,6 + bld r5,0 + bst r4,7 + bld r5,6 + bst r0,0 + bld r4,7 + bst r4,2 + bld r0,0 + bst r4,4 + bld r4,2 + bst r5,5 + bld r4,4 + bst r5,3 + bld r5,5 + bst r0,0 + bld r5,3 + bst r4,5 + bld r0,0 + bst r5,1 + bld r4,5 + bst r5,2 + bld r5,1 + bst r4,6 + bld r5,2 + bst r0,0 + bld r4,6 + movw r18,r4 + movw r4,r20 + movw r20,r18 + and r18,r22 + and r19,r23 + eor r2,r18 + eor r3,r19 + com r4 + com r5 + eor r22,r4 + eor r23,r5 + eor r4,r2 + eor r5,r3 + mov r0,r20 + or r0,r22 + eor r2,r0 + mov r0,r21 + or r0,r23 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r20,r0 + mov r0,r23 + and r0,r5 + eor r21,r0 + mov r0,r20 + and r0,r2 + eor r22,r0 + mov r0,r21 + and r0,r3 + eor r23,r0 + ret +1362: + ldd r26,Y+17 + ldd r27,Y+18 + bst r20,0 + bld r18,0 + bst r22,0 + bld r18,1 + bst r2,0 + bld r18,2 + bst r4,0 + bld r18,3 + bst r20,1 + bld r18,4 + bst r22,1 + bld r18,5 + bst r2,1 + bld r18,6 + bst r4,1 + bld r18,7 + bst r20,2 + bld r19,0 + bst r22,2 + bld r19,1 + bst r2,2 + bld r19,2 + bst r4,2 + bld r19,3 + bst r20,3 + bld r19,4 + bst r22,3 + bld r19,5 + bst r2,3 + bld r19,6 + bst r4,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r20,4 + bld r18,0 + bst r22,4 + bld r18,1 + bst r2,4 + bld r18,2 + bst r4,4 + bld r18,3 + bst r20,5 + bld r18,4 + bst r22,5 + bld r18,5 + bst r2,5 + bld r18,6 + bst r4,5 + bld r18,7 + bst r20,6 + bld r19,0 + bst r22,6 + bld r19,1 + bst r2,6 + bld r19,2 + bst r4,6 + bld r19,3 + bst r20,7 + bld r19,4 + bst r22,7 + bld r19,5 + bst r2,7 + bld r19,6 + bst r4,7 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,0 + bld r18,0 + bst r23,0 + bld r18,1 + bst r3,0 + bld r18,2 + bst r5,0 + bld r18,3 + bst r21,1 + bld r18,4 + bst r23,1 + bld r18,5 + bst r3,1 + bld r18,6 + bst r5,1 + bld r18,7 + bst r21,2 + bld r19,0 + bst r23,2 + bld r19,1 + bst r3,2 + bld r19,2 + bst r5,2 + bld r19,3 + bst r21,3 + bld r19,4 + bst r23,3 + bld r19,5 + bst r3,3 + bld r19,6 + bst r5,3 + bld r19,7 + st X+,r18 + st X+,r19 + bst r21,4 + bld r18,0 + bst r23,4 + bld r18,1 + bst r3,4 + bld r18,2 + bst r5,4 + bld r18,3 + bst r21,5 + bld r18,4 + bst r23,5 + bld r18,5 + bst r3,5 + bld r18,6 + bst r5,5 + bld r18,7 + bst r21,6 + bld r19,0 + bst r23,6 + bld r19,1 + bst r3,6 + bld r19,2 + bst r5,6 + bld r19,3 + bst r21,7 + bld r19,4 + bst r23,7 + bld r19,5 + bst r3,7 + bld r19,6 + bst r5,7 + bld r19,7 + st X+,r18 + st X+,r19 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64n_decrypt, .-gift64n_decrypt + + .text +.global gift64t_encrypt + .type gift64t_encrypt, @function +gift64t_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 30 + ld r8,Z + ldd r9,Z+1 + ldd r10,Z+2 + ldd r11,Z+3 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,0 + bst r20,1 + bld r2,0 + bst r20,2 + bld r4,0 + bst r20,3 + bld r6,0 + bst r20,4 + bld r22,1 + bst r20,5 + bld r2,1 + bst r20,6 + bld r4,1 + bst r20,7 + bld r6,1 + bst r21,0 + bld r22,2 + bst r21,1 + bld r2,2 + bst r21,2 + bld r4,2 + bst r21,3 + bld r6,2 + bst r21,4 + bld r22,3 + bst r21,5 + bld r2,3 + bst r21,6 + bld r4,3 + bst r21,7 + bld r6,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,4 + bst r20,1 + bld r2,4 + bst r20,2 + bld r4,4 + bst r20,3 + bld r6,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r2,5 + bst r20,6 + bld r4,5 + bst r20,7 + bld r6,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r2,6 + bst r21,2 + bld r4,6 + bst r21,3 + bld r6,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r2,7 + bst r21,6 + bld r4,7 + bst r21,7 + bld r6,7 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,0 + bst r20,1 + bld r3,0 + bst r20,2 + bld r5,0 + bst r20,3 + bld r7,0 + bst r20,4 + bld r23,1 + bst r20,5 + bld r3,1 + bst r20,6 + bld r5,1 + bst r20,7 + bld r7,1 + bst r21,0 + bld r23,2 + bst r21,1 + bld r3,2 + bst r21,2 + bld r5,2 + bst r21,3 + bld r7,2 + bst r21,4 + bld r23,3 + bst r21,5 + bld r3,3 + bst r21,6 + bld r5,3 + bst r21,7 + bld r7,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,4 + bst r20,1 + bld r3,4 + bst r20,2 + bld r5,4 + bst r20,3 + bld r7,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r3,5 + bst r20,6 + bld r5,5 + bst r20,7 + bld r7,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r3,6 + bst r21,2 + bld r5,6 + bst r21,3 + bld r7,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r3,7 + bst r21,6 + bld r5,7 + bst r21,7 + bld r7,7 + rcall 1073f + ldi r20,1 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,3 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,7 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,15 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,31 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,62 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,61 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,59 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,55 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,47 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,30 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,60 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,57 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,51 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,39 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,14 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,29 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,58 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,53 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,43 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,22 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,44 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,24 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,48 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + rcall 1073f + ldi r20,33 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + rcall 1073f + ldi r20,2 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + rcall 1073f + ldi r20,5 + ldi r21,128 + eor r6,r20 + eor r7,r21 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + rcall 1073f + ldi r20,11 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rjmp 1264f +1073: + mov r0,r22 + and r0,r4 + eor r2,r0 + mov r0,r23 + and r0,r5 + eor r3,r0 + mov r0,r2 + and r0,r6 + eor r22,r0 + mov r0,r3 + and r0,r7 + eor r23,r0 + mov r0,r22 + or r0,r2 + eor r4,r0 + mov r0,r23 + or r0,r3 + eor r5,r0 + eor r6,r4 + eor r7,r5 + eor r2,r6 + eor r3,r7 + com r6 + com r7 + movw r20,r22 + mov r0,r2 + and r0,r20 + eor r4,r0 + mov r0,r3 + and r0,r21 + eor r5,r0 + movw r22,r6 + movw r6,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r22,3 + bld r22,4 + bst r23,4 + bld r22,3 + bst r0,0 + bld r23,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r0,0 + bld r23,0 + bst r22,5 + bld r0,0 + bst r22,7 + bld r22,5 + bst r23,7 + bld r22,7 + bst r23,5 + bld r23,7 + bst r0,0 + bld r23,5 + bst r22,6 + bld r0,0 + bst r23,3 + bld r22,6 + bst r23,6 + bld r23,3 + bst r23,1 + bld r23,6 + bst r0,0 + bld r23,1 + bst r2,0 + bld r0,0 + bst r2,1 + bld r2,0 + bst r2,5 + bld r2,1 + bst r2,4 + bld r2,5 + bst r0,0 + bld r2,4 + bst r2,2 + bld r0,0 + bst r3,1 + bld r2,2 + bst r2,7 + bld r3,1 + bst r3,4 + bld r2,7 + bst r0,0 + bld r3,4 + bst r2,3 + bld r0,0 + bst r3,5 + bld r2,3 + bst r2,6 + bld r3,5 + bst r3,0 + bld r2,6 + bst r0,0 + bld r3,0 + bst r3,2 + bld r0,0 + bst r3,3 + bld r3,2 + bst r3,7 + bld r3,3 + bst r3,6 + bld r3,7 + bst r0,0 + bld r3,6 + bst r4,0 + bld r0,0 + bst r4,2 + bld r4,0 + bst r5,2 + bld r4,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,1 + bld r0,0 + bst r4,6 + bld r4,1 + bst r5,1 + bld r4,6 + bst r4,4 + bld r5,1 + bst r0,0 + bld r4,4 + bst r4,3 + bld r0,0 + bst r5,6 + bld r4,3 + bst r5,3 + bld r5,6 + bst r5,4 + bld r5,3 + bst r0,0 + bld r5,4 + bst r4,7 + bld r0,0 + bst r5,5 + bld r4,7 + bst r0,0 + bld r5,5 + bst r6,0 + bld r0,0 + bst r6,3 + bld r6,0 + bst r7,7 + bld r6,3 + bst r7,4 + bld r7,7 + bst r0,0 + bld r7,4 + bst r6,1 + bld r0,0 + bst r6,7 + bld r6,1 + bst r7,6 + bld r6,7 + bst r7,0 + bld r7,6 + bst r0,0 + bld r7,0 + bst r6,2 + bld r0,0 + bst r7,3 + bld r6,2 + bst r7,5 + bld r7,3 + bst r6,4 + bld r7,5 + bst r0,0 + bld r6,4 + bst r6,5 + bld r0,0 + bst r6,6 + bld r6,5 + bst r7,2 + bld r6,6 + bst r7,1 + bld r7,2 + bst r0,0 + bld r7,1 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ret +1264: + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r20,0 + bst r2,0 + bld r20,1 + bst r4,0 + bld r20,2 + bst r6,0 + bld r20,3 + bst r22,1 + bld r20,4 + bst r2,1 + bld r20,5 + bst r4,1 + bld r20,6 + bst r6,1 + bld r20,7 + bst r22,2 + bld r21,0 + bst r2,2 + bld r21,1 + bst r4,2 + bld r21,2 + bst r6,2 + bld r21,3 + bst r22,3 + bld r21,4 + bst r2,3 + bld r21,5 + bst r4,3 + bld r21,6 + bst r6,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r22,4 + bld r20,0 + bst r2,4 + bld r20,1 + bst r4,4 + bld r20,2 + bst r6,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r2,5 + bld r20,5 + bst r4,5 + bld r20,6 + bst r6,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r2,6 + bld r21,1 + bst r4,6 + bld r21,2 + bst r6,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r2,7 + bld r21,5 + bst r4,7 + bld r21,6 + bst r6,7 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,0 + bld r20,0 + bst r3,0 + bld r20,1 + bst r5,0 + bld r20,2 + bst r7,0 + bld r20,3 + bst r23,1 + bld r20,4 + bst r3,1 + bld r20,5 + bst r5,1 + bld r20,6 + bst r7,1 + bld r20,7 + bst r23,2 + bld r21,0 + bst r3,2 + bld r21,1 + bst r5,2 + bld r21,2 + bst r7,2 + bld r21,3 + bst r23,3 + bld r21,4 + bst r3,3 + bld r21,5 + bst r5,3 + bld r21,6 + bst r7,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,4 + bld r20,0 + bst r3,4 + bld r20,1 + bst r5,4 + bld r20,2 + bst r7,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r3,5 + bld r20,5 + bst r5,5 + bld r20,6 + bst r7,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r3,6 + bld r21,1 + bst r5,6 + bld r21,2 + bst r7,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r3,7 + bld r21,5 + bst r5,7 + bld r21,6 + bst r7,7 + bld r21,7 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64t_encrypt, .-gift64t_encrypt + + .text +.global gift64t_decrypt + .type gift64t_decrypt, @function +gift64t_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 30 + ld r8,Z + ldd r9,Z+1 + ldd r10,Z+2 + ldd r11,Z+3 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + mov r0,r9 + mov r9,r8 + mov r8,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,0 + bst r20,1 + bld r2,0 + bst r20,2 + bld r4,0 + bst r20,3 + bld r6,0 + bst r20,4 + bld r22,1 + bst r20,5 + bld r2,1 + bst r20,6 + bld r4,1 + bst r20,7 + bld r6,1 + bst r21,0 + bld r22,2 + bst r21,1 + bld r2,2 + bst r21,2 + bld r4,2 + bst r21,3 + bld r6,2 + bst r21,4 + bld r22,3 + bst r21,5 + bld r2,3 + bst r21,6 + bld r4,3 + bst r21,7 + bld r6,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r22,4 + bst r20,1 + bld r2,4 + bst r20,2 + bld r4,4 + bst r20,3 + bld r6,4 + bst r20,4 + bld r22,5 + bst r20,5 + bld r2,5 + bst r20,6 + bld r4,5 + bst r20,7 + bld r6,5 + bst r21,0 + bld r22,6 + bst r21,1 + bld r2,6 + bst r21,2 + bld r4,6 + bst r21,3 + bld r6,6 + bst r21,4 + bld r22,7 + bst r21,5 + bld r2,7 + bst r21,6 + bld r4,7 + bst r21,7 + bld r6,7 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,0 + bst r20,1 + bld r3,0 + bst r20,2 + bld r5,0 + bst r20,3 + bld r7,0 + bst r20,4 + bld r23,1 + bst r20,5 + bld r3,1 + bst r20,6 + bld r5,1 + bst r20,7 + bld r7,1 + bst r21,0 + bld r23,2 + bst r21,1 + bld r3,2 + bst r21,2 + bld r5,2 + bst r21,3 + bld r7,2 + bst r21,4 + bld r23,3 + bst r21,5 + bld r3,3 + bst r21,6 + bld r5,3 + bst r21,7 + bld r7,3 + ld r20,X+ + ld r21,X+ + bst r20,0 + bld r23,4 + bst r20,1 + bld r3,4 + bst r20,2 + bld r5,4 + bst r20,3 + bld r7,4 + bst r20,4 + bld r23,5 + bst r20,5 + bld r3,5 + bst r20,6 + bld r5,5 + bst r20,7 + bld r7,5 + bst r21,0 + bld r23,6 + bst r21,1 + bld r3,6 + bst r21,2 + bld r5,6 + bst r21,3 + bld r7,6 + bst r21,4 + bld r23,7 + bst r21,5 + bld r3,7 + bst r21,6 + bld r5,7 + bst r21,7 + bld r7,7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,11 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,5 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,2 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,33 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,48 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,24 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,44 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,22 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,43 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,53 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,58 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,29 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,14 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,39 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,51 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,57 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,60 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,30 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,47 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,55 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,59 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,61 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,62 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,31 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r8,Y+1 + ldd r9,Y+2 + ldd r10,Y+3 + ldd r11,Y+4 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,15 + ldi r21,128 + eor r6,r20 + eor r7,r21 + eor r4,r18 + eor r5,r18 + rcall 1185f + std Y+1,r8 + std Y+2,r9 + std Y+3,r10 + std Y+4,r11 + ldd r8,Y+5 + ldd r9,Y+6 + ldd r10,Y+7 + ldd r11,Y+8 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,7 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+5,r8 + std Y+6,r9 + std Y+7,r10 + std Y+8,r11 + ldd r8,Y+9 + ldd r9,Y+10 + ldd r10,Y+11 + ldd r11,Y+12 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,3 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + std Y+9,r8 + std Y+10,r9 + std Y+11,r10 + std Y+12,r11 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ldi r20,1 + ldi r21,128 + eor r6,r20 + eor r7,r21 + rcall 1185f + rjmp 1374f +1185: + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + bst r22,1 + bld r0,0 + bst r23,4 + bld r22,1 + bst r22,3 + bld r23,4 + bst r22,4 + bld r22,3 + bst r0,0 + bld r22,4 + bst r22,2 + bld r0,0 + bst r23,0 + bld r22,2 + bst r0,0 + bld r23,0 + bst r22,5 + bld r0,0 + bst r23,5 + bld r22,5 + bst r23,7 + bld r23,5 + bst r22,7 + bld r23,7 + bst r0,0 + bld r22,7 + bst r22,6 + bld r0,0 + bst r23,1 + bld r22,6 + bst r23,6 + bld r23,1 + bst r23,3 + bld r23,6 + bst r0,0 + bld r23,3 + bst r2,0 + bld r0,0 + bst r2,4 + bld r2,0 + bst r2,5 + bld r2,4 + bst r2,1 + bld r2,5 + bst r0,0 + bld r2,1 + bst r2,2 + bld r0,0 + bst r3,4 + bld r2,2 + bst r2,7 + bld r3,4 + bst r3,1 + bld r2,7 + bst r0,0 + bld r3,1 + bst r2,3 + bld r0,0 + bst r3,0 + bld r2,3 + bst r2,6 + bld r3,0 + bst r3,5 + bld r2,6 + bst r0,0 + bld r3,5 + bst r3,2 + bld r0,0 + bst r3,6 + bld r3,2 + bst r3,7 + bld r3,6 + bst r3,3 + bld r3,7 + bst r0,0 + bld r3,3 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r4,2 + bld r5,2 + bst r0,0 + bld r4,2 + bst r4,1 + bld r0,0 + bst r4,4 + bld r4,1 + bst r5,1 + bld r4,4 + bst r4,6 + bld r5,1 + bst r0,0 + bld r4,6 + bst r4,3 + bld r0,0 + bst r5,4 + bld r4,3 + bst r5,3 + bld r5,4 + bst r5,6 + bld r5,3 + bst r0,0 + bld r5,6 + bst r4,7 + bld r0,0 + bst r5,5 + bld r4,7 + bst r0,0 + bld r5,5 + bst r6,0 + bld r0,0 + bst r7,4 + bld r6,0 + bst r7,7 + bld r7,4 + bst r6,3 + bld r7,7 + bst r0,0 + bld r6,3 + bst r6,1 + bld r0,0 + bst r7,0 + bld r6,1 + bst r7,6 + bld r7,0 + bst r6,7 + bld r7,6 + bst r0,0 + bld r6,7 + bst r6,2 + bld r0,0 + bst r6,4 + bld r6,2 + bst r7,5 + bld r6,4 + bst r7,3 + bld r7,5 + bst r0,0 + bld r7,3 + bst r6,5 + bld r0,0 + bst r7,1 + bld r6,5 + bst r7,2 + bld r7,1 + bst r6,6 + bld r7,2 + bst r0,0 + bld r6,6 + movw r20,r6 + movw r6,r22 + movw r22,r20 + and r20,r2 + and r21,r3 + eor r4,r20 + eor r5,r21 + com r6 + com r7 + eor r2,r6 + eor r3,r7 + eor r6,r4 + eor r7,r5 + mov r0,r22 + or r0,r2 + eor r4,r0 + mov r0,r23 + or r0,r3 + eor r5,r0 + mov r0,r2 + and r0,r6 + eor r22,r0 + mov r0,r3 + and r0,r7 + eor r23,r0 + mov r0,r22 + and r0,r4 + eor r2,r0 + mov r0,r23 + and r0,r5 + eor r3,r0 + ret +1374: + ldd r26,Y+17 + ldd r27,Y+18 + bst r22,0 + bld r20,0 + bst r2,0 + bld r20,1 + bst r4,0 + bld r20,2 + bst r6,0 + bld r20,3 + bst r22,1 + bld r20,4 + bst r2,1 + bld r20,5 + bst r4,1 + bld r20,6 + bst r6,1 + bld r20,7 + bst r22,2 + bld r21,0 + bst r2,2 + bld r21,1 + bst r4,2 + bld r21,2 + bst r6,2 + bld r21,3 + bst r22,3 + bld r21,4 + bst r2,3 + bld r21,5 + bst r4,3 + bld r21,6 + bst r6,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r22,4 + bld r20,0 + bst r2,4 + bld r20,1 + bst r4,4 + bld r20,2 + bst r6,4 + bld r20,3 + bst r22,5 + bld r20,4 + bst r2,5 + bld r20,5 + bst r4,5 + bld r20,6 + bst r6,5 + bld r20,7 + bst r22,6 + bld r21,0 + bst r2,6 + bld r21,1 + bst r4,6 + bld r21,2 + bst r6,6 + bld r21,3 + bst r22,7 + bld r21,4 + bst r2,7 + bld r21,5 + bst r4,7 + bld r21,6 + bst r6,7 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,0 + bld r20,0 + bst r3,0 + bld r20,1 + bst r5,0 + bld r20,2 + bst r7,0 + bld r20,3 + bst r23,1 + bld r20,4 + bst r3,1 + bld r20,5 + bst r5,1 + bld r20,6 + bst r7,1 + bld r20,7 + bst r23,2 + bld r21,0 + bst r3,2 + bld r21,1 + bst r5,2 + bld r21,2 + bst r7,2 + bld r21,3 + bst r23,3 + bld r21,4 + bst r3,3 + bld r21,5 + bst r5,3 + bld r21,6 + bst r7,3 + bld r21,7 + st X+,r20 + st X+,r21 + bst r23,4 + bld r20,0 + bst r3,4 + bld r20,1 + bst r5,4 + bld r20,2 + bst r7,4 + bld r20,3 + bst r23,5 + bld r20,4 + bst r3,5 + bld r20,5 + bst r5,5 + bld r20,6 + bst r7,5 + bld r20,7 + bst r23,6 + bld r21,0 + bst r3,6 + bld r21,1 + bst r5,6 + bld r21,2 + bst r7,6 + bld r21,3 + bst r23,7 + bld r21,4 + bst r3,7 + bld r21,5 + bst r5,7 + bld r21,6 + bst r7,7 + bld r21,7 + st X+,r20 + st X+,r21 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift64t_decrypt, .-gift64t_decrypt + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.c b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.c new file mode 100644 index 0000000..81bc8a3 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.c @@ -0,0 +1,1205 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift64.h" +#include "internal-util.h" +#include + +#if !GIFT64_LOW_MEMORY + +/* Round constants for GIFT-64 in the fixsliced representation */ +static uint32_t const GIFT64_RC[28] = { + 0x22000011, 0x00002299, 0x11118811, 0x880000ff, 0x33111199, 0x990022ee, + 0x22119933, 0x880033bb, 0x22119999, 0x880022ff, 0x11119922, 0x880033cc, + 0x33008899, 0x99002299, 0x33118811, 0x880000ee, 0x33110099, 0x990022aa, + 0x22118833, 0x880022bb, 0x22111188, 0x88002266, 0x00009922, 0x88003300, + 0x22008811, 0x00002288, 0x00118811, 0x880000bb +}; + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift64b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t t = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= t; \ + (a) ^= t << (shift); \ + } while (0) + +/** + * \brief Performs the GIFT-64 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift64b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-64 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift64b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/* Rotates a state word left by 1 position in the fixsliced representation: + * + * 0 1 2 3 1 2 3 0 + * 4 5 6 7 ==> 5 6 7 4 + * 8 9 10 11 9 10 11 8 + * 12 13 14 15 13 14 14 12 + */ +#define gift64b_rotate_left_1(x) \ + ((((x) >> 1) & 0x77777777U) | (((x) & 0x11111111U) << 3)) + +/* Rotates a state word left by 2 positions in the fixsliced representation: + * + * 0 1 2 3 2 3 0 1 + * 4 5 6 7 ==> 6 7 4 5 + * 8 9 10 11 10 11 8 9 + * 12 13 14 15 14 15 12 13 + */ +#define gift64b_rotate_left_2(x) \ + ((((x) >> 2) & 0x33333333U) | (((x) & 0x33333333U) << 2)) + +/* Rotates a state word left by 3 positions in the fixsliced representation: + * + * 0 1 2 3 3 0 1 2 + * 4 5 6 7 ==> 7 4 5 6 + * 8 9 10 11 11 8 9 10 + * 12 13 14 15 15 12 13 14 + */ +#define gift64b_rotate_left_3(x) \ + ((((x) >> 3) & 0x11111111U) | (((x) & 0x77777777U) << 1)) + +/* Rotates a state word right by 1 position in the fixsliced representation */ +#define gift64b_rotate_right_1(x) gift64b_rotate_left_3(x) + +/* Rotates a state word right by 2 positions in the fixsliced representation */ +#define gift64b_rotate_right_2(x) gift64b_rotate_left_2(x) + +/* Rotates a state word right by 3 positions in the fixsliced representation */ +#define gift64b_rotate_right_3(x) gift64b_rotate_left_1(x) + +/* Rotates a state word up by 1 position in the fixsliced representation: + * + * 0 1 2 3 4 5 6 7 + * 4 5 6 7 ==> 8 9 10 11 + * 8 9 10 11 12 13 14 15 + * 12 13 14 15 0 1 2 3 + */ +#define gift64b_rotate_up_1(x) (rightRotate8((x))) + +/* Rotates a state word up by 2 positions in the fixsliced representation: + * + * 0 1 2 3 8 9 10 11 + * 4 5 6 7 ==> 12 13 14 15 + * 8 9 10 11 0 1 2 3 + * 12 13 14 15 4 5 6 7 + */ +#define gift64b_rotate_up_2(x) (rightRotate16((x))) + +/* Rotates a state word up by 3 positions in the fixsliced representation: + * + * 0 1 2 3 12 13 14 15 + * 4 5 6 7 ==> 0 1 2 3 + * 8 9 10 11 4 5 6 7 + * 12 13 14 15 8 9 10 11 + */ +#define gift64b_rotate_up_3(x) (rightRotate24((x))) + +/* Rotates a state word down by 1 position in the fixsliced representation */ +#define gift64b_rotate_down_1(x) gift64b_rotate_up_3(x) + +/* Rotates a state word down by 2 positions in the fixsliced representation */ +#define gift64b_rotate_down_2(x) gift64b_rotate_up_2(x) + +/* Rotates a state word down by 3 positions in the fixsliced representation */ +#define gift64b_rotate_down_3(x) gift64b_rotate_up_1(x) + +/* Permutation code to rearrange key bits into fixsliced form. Permutations + * generated wth "http://programming.sirrida.de/calcperm.php" */ +#define gift64b_rearrange1_transpose_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 8 16 24 3 11 19 27 2 10 18 26 1 9 17 25 * */ \ + bit_permute_step(out, 0x0000CCCCU, 16); \ + bit_permute_step(out, 0x30030330U, 2); \ + bit_permute_step(out, 0x00960096U, 8); \ + bit_permute_step(out, 0x05500550U, 1); \ + bit_permute_step(out, 0x0A0A0A0AU, 4); \ + } while (0) +#define gift64b_rearrange1_transpose_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 8 16 24 3 11 19 27 2 10 18 26 1 9 17 25 * */ \ + bit_permute_step(out, 0x0000CCCCU, 16); \ + bit_permute_step(out, 0x30030330U, 2); \ + bit_permute_step(out, 0x00960096U, 8); \ + bit_permute_step(out, 0x05500550U, 1); \ + bit_permute_step(out, 0x0A0A0A0AU, 4); \ + } while (0) +#define gift64b_rearrange1_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 1 2 3 24 25 26 27 16 17 18 19 8 9 10 11 * */ \ + out = (out & 0x0000000FU) | ((out & 0x00000F00U) << 8) | \ + ((out & 0x000000F0U) << 20) | ((out & 0x0000F000U) >> 4); \ + } while (0) +#define gift64b_rearrange1_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 1 2 3 24 25 26 27 16 17 18 19 8 9 10 11 * */ \ + out = (out & 0x0000000FU) | ((out & 0x00000F00U) << 8) | \ + ((out & 0x000000F0U) << 20) | ((out & 0x0000F000U) >> 4); \ + } while (0) +#define gift64b_rearrange2_transpose_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 * */ \ + bit_permute_step(out, 0x0A0A0A0AU, 3); \ + bit_permute_step(out, 0x00CC00CCU, 6); \ + bit_permute_step(out, 0x0000F0F0U, 12); \ + bit_permute_step(out, 0x0000FF00U, 8); \ + } while (0) +#define gift64b_rearrange2_transpose_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 * */ \ + bit_permute_step(out, 0x0A0A0A0AU, 3); \ + bit_permute_step(out, 0x00CC00CCU, 6); \ + bit_permute_step(out, 0x0000F0F0U, 12); \ + bit_permute_step(out, 0x0000FF00U, 8); \ + } while (0) +#define gift64b_rearrange2_low(out, in) \ + do { \ + out = (in) & 0x0000FFFFU; \ + /* 0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27 * */ \ + out = (out & 0x0000000FU) | ((out & 0x000000F0U) << 4) | \ + ((out & 0x00000F00U) << 8) | ((out & 0x0000F000U) << 12); \ + } while (0) +#define gift64b_rearrange2_high(out, in) \ + do { \ + out = (in) >> 16; \ + /* 0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27 * */ \ + out = (out & 0x0000000FU) | ((out & 0x000000F0U) << 4) | \ + ((out & 0x00000F00U) << 8) | ((out & 0x0000F000U) << 12); \ + } while (0) + +void gift64n_update_round_keys(gift64n_key_schedule_t *ks) +{ + uint32_t x; + + /* First round */ + gift64b_rearrange1_transpose_low(x, ks->k[3]); + ks->rk[0] = ~(x | (x << 4)); + gift64b_rearrange1_transpose_high(x, ks->k[3]); + ks->rk[1] = x | (x << 4); + + /* Second round */ + gift64b_rearrange1_low(x, ks->k[2]); + x = x | (x << 4); + gift64b_swap_move(x, x, 0x22222222U, 2); + ks->rk[2] = ~x; + gift64b_rearrange1_high(x, ks->k[2]); + x = x | (x << 4); + gift64b_swap_move(x, x, 0x22222222U, 2); + ks->rk[3] = x; + + /* Third round */ + gift64b_rearrange2_transpose_low(x, ks->k[1]); + gift64b_swap_move(x, x, 0x00000F00U, 16); + ks->rk[4] = ~(x | (x << 4)); + gift64b_rearrange2_transpose_high(x, ks->k[1]); + gift64b_swap_move(x, x, 0x00000F00U, 16); + ks->rk[5] = x | (x << 4); + + /* Fourth round */ + gift64b_rearrange2_low(x, ks->k[0]); + ks->rk[6] = ~(x | (x << 4)); + gift64b_rearrange2_high(x, ks->k[0]); + ks->rk[7] = x | (x << 4); +} + +/** + * \brief Perform the core of GIFT-64 encryption on two blocks in parallel. + * + * \param ks Points to the key schedule to use to encrypt the blocks. + * \param state Buffer containing the two blocks in bit-sliced form, + * on input and output. + * \param Tweak value or zero if there is no tweak. + */ +static void gift64b_encrypt_core + (const gift64n_key_schedule_t *ks, uint32_t state[4], uint32_t tweak) +{ + const uint32_t *rc = GIFT64_RC; + uint32_t s0, s1, s2, s3, temp; + uint32_t rk[8]; + uint8_t round; + + /* Start with the pre-computed round keys for the first four rounds */ + memcpy(rk, ks->rk, sizeof(ks->rk)); + + /* Load the state into local variables */ + s0 = state[0]; + s1 = state[1]; + s2 = state[2]; + s3 = state[3]; + + /* Perform all 28 rounds four at a time. We use the "fixslicing" method. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of four rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 4 rounds. + */ + for (round = 0; round < 28; round += 4, rc += 4) { + /* 1st round - S-box, rotate left, add round key */ + gift64b_sbox(s0, s1, s2, s3); + s1 = gift64b_rotate_left_1(s1); + s2 = gift64b_rotate_left_2(s2); + s0 = gift64b_rotate_left_3(s0); + s3 ^= rk[0]; + s1 ^= rk[1]; + s0 ^= rc[0]; + + /* 2nd round - S-box, rotate up, add round key (s0 and s3 swapped) */ + gift64b_sbox(s3, s1, s2, s0); + s1 = gift64b_rotate_up_1(s1); + s2 = gift64b_rotate_up_2(s2); + s3 = gift64b_rotate_up_3(s3); + s0 ^= rk[2]; + s1 ^= rk[3]; + s3 ^= rc[1]; + + /* 3rd round - S-box, rotate right, add round key */ + gift64b_sbox(s0, s1, s2, s3); + s1 = gift64b_rotate_right_1(s1); + s2 = gift64b_rotate_right_2(s2); + s0 = gift64b_rotate_right_3(s0); + s3 ^= rk[4]; + s1 ^= rk[5]; + s0 ^= rc[2]; + + /* 4th round - S-box, rotate down, add round key (s0 and s3 swapped) */ + gift64b_sbox(s3, s1, s2, s0); + s1 = gift64b_rotate_down_1(s1); + s2 = gift64b_rotate_down_2(s2); + s3 = gift64b_rotate_down_3(s3); + s0 ^= rk[6]; + s1 ^= rk[7]; + s3 ^= rc[3]; + + /* Add the tweak every four encryption rounds except the last */ + if (round < 24) + s2 ^= tweak; + + /* Derive the round keys for the next 4 rounds */ + rk[0] = gift64b_rotate_left_1(rk[0]); + rk[1] = (gift64b_rotate_left_3(rk[1]) << 16) | (rk[1] >> 16); + rk[2] = rightRotate8(rk[2]); + temp = gift64b_rotate_left_2(rk[3]); + rk[3] = (temp & 0x99999999U) | leftRotate8(temp & 0x66666666U); + rk[4] = gift64b_rotate_left_3(rk[4]); + temp = rightRotate16(rk[5]); + rk[5] = (gift64b_rotate_left_1(temp) & 0x00FFFF00U) | + (temp & 0xFF0000FFU); + rk[6] = leftRotate8(rk[6]); + temp = gift64b_rotate_left_2(rk[7]); + rk[7] = (temp & 0x33333333U) | rightRotate8(temp & 0xCCCCCCCCU); + } + + /* Copy the local variables to the output state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +/** + * \brief Perform the core of GIFT-64 decryption on two blocks in parallel. + * + * \param ks Points to the key schedule to use to encrypt the blocks. + * \param state Buffer containing the two blocks in bit-sliced form, + * on input and output. + * \param Tweak value or zero if there is no tweak. + */ +static void gift64b_decrypt_core + (const gift64n_key_schedule_t *ks, uint32_t state[4], uint32_t tweak) +{ + const uint32_t *rc = GIFT64_RC + 28 - 4; + uint32_t s0, s1, s2, s3, temp; + uint32_t rk[8]; + uint8_t round; + + /* Start with the pre-computed round keys for the first four rounds */ + memcpy(rk, ks->rk, sizeof(ks->rk)); + + /* Fast forward the key schedule to the end by permuting each round + * key by the amount it would see under the full set of rounds. + * Generated with "http://programming.sirrida.de/calcperm.php" */ + /* P0: 1 2 3 0 5 6 7 4 9 10 11 8 13 14 15 12 17 18 + * 19 16 21 22 23 20 25 26 27 24 29 30 31 28 */ + rk[0] = ((rk[0] & 0x77777777U) << 1) | ((rk[0] & 0x88888888U) >> 3); + /* P1: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 + * 31 3 0 1 2 7 4 5 6 11 8 9 10 15 12 13 14 */ + rk[1] = ((rk[1] & 0xEEEE0000U) >> 17) | ((rk[1] & 0x0000FFFFU) << 16) | + ((rk[1] & 0x11110000U) >> 13); + /* P2: 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + * 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 */ + rk[2] = leftRotate8(rk[2]); + /* P3: 2 27 24 1 6 31 28 5 10 3 0 9 14 7 4 13 18 11 + * 8 17 22 15 12 21 26 19 16 25 30 23 20 29 */ + rk[3] = ((rk[3] & 0x11111111U) << 2) | leftRotate22(rk[3] & 0x44444444U) | + leftRotate26(rk[3] & 0x22222222U) | ((rk[3] & 0x88888888U) >> 2); + /* P4: 3 0 1 2 7 4 5 6 11 8 9 10 15 12 13 14 19 16 + * 17 18 23 20 21 22 27 24 25 26 31 28 29 30 */ + rk[4] = ((rk[4] & 0x11111111U) << 3) | ((rk[4] & 0xEEEEEEEEU) >> 1); + /* P5: 16 17 18 19 20 21 22 23 25 26 27 24 29 30 31 + * 28 1 2 3 0 5 6 7 4 8 9 10 11 12 13 14 15 */ + rk[5] = leftRotate13(rk[5] & 0x00888800U) | + leftRotate16(rk[5] & 0xFF0000FFU) | + leftRotate17(rk[5] & 0x00777700U); + /* P6: 24 25 26 27 28 29 30 31 0 1 2 3 4 5 6 7 8 9 10 + * 11 12 13 14 15 16 17 18 19 20 21 22 23 */ + rk[6] = leftRotate24(rk[6]); + /* P7: 2 3 8 9 6 7 12 13 10 11 16 17 14 15 20 21 18 19 + * 24 25 22 23 28 29 26 27 0 1 30 31 4 5 */ + rk[7] = ((rk[7] & 0x33333333U) << 2) | leftRotate6(rk[7] & 0xCCCCCCCCU); + + /* Load the state into local variables */ + s0 = state[0]; + s1 = state[1]; + s2 = state[2]; + s3 = state[3]; + + /* Perform all 28 rounds four at a time. We use the "fixslicing" method. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of four rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 4 rounds. + */ + for (round = 0; round < 28; round += 4, rc -= 4) { + /* Derive the round keys for the previous 4 rounds */ + rk[0] = gift64b_rotate_right_1(rk[0]); + temp = rk[1] >> 16; + rk[1] = gift64b_rotate_right_3(temp) | (rk[1] << 16); + rk[2] = leftRotate8(rk[2]); + temp = (rk[3] & 0x99999999U) | rightRotate8(rk[3] & 0x66666666U); + rk[3] = gift64b_rotate_right_2(temp); + rk[4] = gift64b_rotate_right_3(rk[4]); + temp = (gift64b_rotate_right_1(rk[5]) & 0x00FFFF00U) | + (rk[5] & 0xFF0000FFU); + rk[5] = leftRotate16(temp); + rk[6] = rightRotate8(rk[6]); + temp = (rk[7] & 0x33333333U) | leftRotate8(rk[7] & 0xCCCCCCCCU); + rk[7] = gift64b_rotate_right_2(temp); + + /* Add the tweak every four decryption rounds except the first */ + if (round != 0) + s2 ^= tweak; + + /* 4th round - S-box, rotate down, add round key (s0 and s3 swapped) */ + s0 ^= rk[6]; + s1 ^= rk[7]; + s3 ^= rc[3]; + s1 = gift64b_rotate_up_1(s1); + s2 = gift64b_rotate_up_2(s2); + s3 = gift64b_rotate_up_3(s3); + gift64b_inv_sbox(s0, s1, s2, s3); + + /* 3rd round - S-box, rotate right, add round key */ + s3 ^= rk[4]; + s1 ^= rk[5]; + s0 ^= rc[2]; + s1 = gift64b_rotate_left_1(s1); + s2 = gift64b_rotate_left_2(s2); + s0 = gift64b_rotate_left_3(s0); + gift64b_inv_sbox(s3, s1, s2, s0); + + /* 2nd round - S-box, rotate up, add round key (s0 and s3 swapped) */ + s0 ^= rk[2]; + s1 ^= rk[3]; + s3 ^= rc[1]; + s1 = gift64b_rotate_down_1(s1); + s2 = gift64b_rotate_down_2(s2); + s3 = gift64b_rotate_down_3(s3); + gift64b_inv_sbox(s0, s1, s2, s3); + + /* 1st round - S-box, rotate left, add round key */ + s3 ^= rk[0]; + s1 ^= rk[1]; + s0 ^= rc[0]; + s1 = gift64b_rotate_right_1(s1); + s2 = gift64b_rotate_right_2(s2); + s0 = gift64b_rotate_right_3(s0); + gift64b_inv_sbox(s3, s1, s2, s0); + } + + /* Copy the local variables to the output state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian byte order from the LOTUS-AEAD submission */ + ks->k[0] = le_load_word32(key + 12); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key); + gift64n_update_round_keys(ks); +} + +/** + * \brief Converts the GIFT-64 nibble-based representation into word-based + * (littlen-endian version). + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The output words will be in fixsliced form. Technically the output will + * contain two blocks for gift64b_encrypt_core() to process in parallel but + * both blocks will have the same value. + */ +static void gift64n_to_words(uint32_t output[4], const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input block into 32-bit words */ + s0 = le_load_word32(input); + s2 = le_load_word32(input + 4); + + /* Rearrange the bits in the block */ + gift64b_swap_move(s0, s0, 0x0A0A0A0AU, 3); + gift64b_swap_move(s0, s0, 0x00CC00CCU, 6); + gift64b_swap_move(s0, s0, 0x0000FF00U, 8); + gift64b_swap_move(s2, s2, 0x0A0A0A0AU, 3); + gift64b_swap_move(s2, s2, 0x00CC00CCU, 6); + gift64b_swap_move(s2, s2, 0x0000FF00U, 8); + + /* Split into two identical blocks in fixsliced form */ + s1 = s0; + s3 = s2; + gift64b_swap_move(s0, s1, 0x0F0F0F0FU, 4); + gift64b_swap_move(s2, s3, 0x0F0F0F0FU, 4); + gift64b_swap_move(s0, s2, 0x0000FFFFU, 16); + gift64b_swap_move(s1, s3, 0x0000FFFFU, 16); + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +/** + * \brief Converts the GIFT-64 word-based representation into nibble-based + * (little-endian version). + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + * + * The input words are in fixsliced form. Technically there are two + * identical blocks in the input. We drop one when we write to the output. + */ +static void gift64n_to_nibbles(unsigned char *output, const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Load the state and split the two blocks into separate words */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + gift64b_swap_move(s0, s2, 0x0000FFFFU, 16); + gift64b_swap_move(s1, s3, 0x0000FFFFU, 16); + gift64b_swap_move(s0, s1, 0x0F0F0F0FU, 4); + gift64b_swap_move(s2, s3, 0x0F0F0F0FU, 4); + + /* Rearrange the bits in the first block back into nibble form */ + gift64b_swap_move(s0, s0, 0x0000FF00U, 8); + gift64b_swap_move(s0, s0, 0x00CC00CCU, 6); + gift64b_swap_move(s0, s0, 0x0A0A0A0AU, 3); + gift64b_swap_move(s2, s2, 0x0000FF00U, 8); + gift64b_swap_move(s2, s2, 0x00CC00CCU, 6); + gift64b_swap_move(s2, s2, 0x0A0A0A0AU, 3); + le_store_word32(output, s0); + le_store_word32(output + 4, s2); +} + +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_encrypt_core(ks, state, 0); + gift64n_to_nibbles(output, state); +} + +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_decrypt_core(ks, state, 0); + gift64n_to_nibbles(output, state); +} + +/* 4-bit tweak values expanded to 32-bit in fixsliced form */ +static uint32_t const GIFT64_tweaks[16] = { + 0x00000000, 0xee11ee11, 0xdd22dd22, 0x33333333, 0xbb44bb44, 0x55555555, + 0x66666666, 0x88778877, 0x77887788, 0x99999999, 0xaaaaaaaa, 0x44bb44bb, + 0xcccccccc, 0x22dd22dd, 0x11ee11ee, 0xffffffff +}; + +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_encrypt_core(ks, state, GIFT64_tweaks[tweak & 0x0F]); + gift64n_to_nibbles(output, state); +} + +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint32_t state[4]; + gift64n_to_words(state, input); + gift64b_decrypt_core(ks, state, GIFT64_tweaks[tweak & 0x0F]); + gift64n_to_nibbles(output, state); +} + +#elif !defined(__AVR__) /* GIFT64_LOW_MEMORY */ + +/* Round constants for GIFT-64 */ +static uint8_t const GIFT64_RC[28] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B +}; + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint16_t y = (_y); \ + uint16_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step_simple */ +#define bit_permute_step_simple(_y, mask, shift) \ + do { \ + (_y) = (((_y) & (mask)) << (shift)) | (((_y) >> (shift)) & (mask)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 4 bits with respect to the next: + * + * P0: 0 12 8 4 1 13 9 5 2 14 10 6 3 15 11 7 + * P1: 4 0 12 8 5 1 13 9 6 2 14 10 7 3 15 11 + * P2: 8 4 0 12 9 5 1 13 10 6 2 14 11 7 3 15 + * P3: 12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3 + * + * The most efficient permutation from the online generator was P1, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P1 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM1_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a, 3); \ + bit_permute_step(x, 0x00cc, 6); \ + bit_permute_step_simple(x, 0x0f0f, 4); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate12_16(_x); \ + } while (0) +#define PERM1(x) PERM1_INNER(x) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate4_16(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM1_INNER(_x); \ + (x) = leftRotate8_16(_x); \ + } while (0) + +#define INV_PERM1_INNER(x) \ + do { \ + bit_permute_step(x, 0x0505, 5); \ + bit_permute_step(x, 0x00cc, 6); \ + bit_permute_step_simple(x, 0x0f0f, 4); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate12_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) INV_PERM1_INNER(x) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate4_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = rightRotate8_16(x); \ + INV_PERM1_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with GIFT-64 (bit-sliced). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +static void gift64b_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word16(input); + s1 = be_load_word16(input + 2); + s2 = be_load_word16(input + 4); + s3 = be_load_word16(input + 6); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + + /* Perform all 28 rounds */ + for (round = 0; round < 28; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 64-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); +} + +/** + * \brief Decrypts a 64-bit block with GIFT-64 (bit-sliced). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +static void gift64b_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word16(input); + s1 = be_load_word16(input + 2); + s2 = be_load_word16(input + 4); + s3 = be_load_word16(input + 6); + + /* Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 28; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 7 times for the full 28 rounds. The overall + * effect is to apply a "14 right and 28 left" bit-rotation to every word + * in the key schedule. That is equivalent to "14 right and 12 left" + * on the 16-bit sub-words. + */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + w0 = ((w0 & 0xC0000000U) >> 14) | ((w0 & 0x3FFF0000U) << 2) | + ((w0 & 0x0000000FU) << 12) | ((w0 & 0x0000FFF0U) >> 4); + w1 = ((w1 & 0xC0000000U) >> 14) | ((w1 & 0x3FFF0000U) << 2) | + ((w1 & 0x0000000FU) << 12) | ((w1 & 0x0000FFF0U) >> 4); + w2 = ((w2 & 0xC0000000U) >> 14) | ((w2 & 0x3FFF0000U) << 2) | + ((w2 & 0x0000000FU) << 12) | ((w2 & 0x0000FFF0U) >> 4); + w3 = ((w3 & 0xC0000000U) >> 14) | ((w3 & 0x3FFF0000U) << 2) | + ((w3 & 0x0000000FU) << 12) | ((w3 & 0x0000FFF0U) >> 4); + + /* Perform all 28 rounds */ + for (round = 28; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); +} + +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian byte order from the LOTUS-AEAD submission */ + ks->k[0] = le_load_word32(key + 12); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key); +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step_32(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts the GIFT-64 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift64n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1; + + /* Load the input buffer into 32-bit words. We use the nibble order from + * the LOTUS-AEAD submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-64 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 4); + s1 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step_32(x, 0x0a0a0a0a, 3); \ + bit_permute_step_32(x, 0x00cc00cc, 6); \ + bit_permute_step_32(x, 0x0000f0f0, 12); \ + bit_permute_step_32(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)(s0 >> 8); + output[3] = (uint8_t)(s1 >> 8); + output[4] = (uint8_t)(s0 >> 16); + output[5] = (uint8_t)(s1 >> 16); + output[6] = (uint8_t)(s0 >> 24); + output[7] = (uint8_t)(s1 >> 24); +} + +/** + * \brief Converts the GIFT-64 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift64n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s1 contains the least significant */ + s0 = (((uint32_t)(input[6])) << 24) | + (((uint32_t)(input[4])) << 16) | + (((uint32_t)(input[2])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[7])) << 24) | + (((uint32_t)(input[5])) << 16) | + (((uint32_t)(input[3])) << 8) | + ((uint32_t)(input[1])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step_32(x, 0x00aa00aa, 7); \ + bit_permute_step_32(x, 0x0000cccc, 14); \ + bit_permute_step_32(x, 0x00f000f0, 4); \ + bit_permute_step_32(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 4, s0); + le_store_word32(output, s1); +} + +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift64n_to_words(output, input); + gift64b_encrypt(ks, output, output); + gift64n_to_nibbles(output, output); +} + +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift64n_to_words(output, input); + gift64b_decrypt(ks, output, output); + gift64n_to_nibbles(output, output); +} + +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift64n_to_words(output, input); + s0 = be_load_word16(output); + s1 = be_load_word16(output + 2); + s2 = be_load_word16(output + 4); + s3 = be_load_word16(output + 6); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + + /* Perform all 28 rounds */ + for (round = 0; round < 28; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 64-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round]; + + /* AddTweak - XOR in the tweak every 4 rounds except the last */ + if (((round + 1) % 4) == 0 && round < 27) + s2 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); + gift64n_to_nibbles(output, output); +} + +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak) +{ + uint16_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift64n_to_words(output, input); + s0 = be_load_word16(output); + s1 = be_load_word16(output + 2); + s2 = be_load_word16(output + 4); + s3 = be_load_word16(output + 6); + + /* Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 28; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 7 times for the full 28 rounds. The overall + * effect is to apply a "14 right and 28 left" bit-rotation to every word + * in the key schedule. That is equivalent to "14 right and 12 left" + * on the 16-bit sub-words. + */ + w0 = ks->k[0]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[3]; + w0 = ((w0 & 0xC0000000U) >> 14) | ((w0 & 0x3FFF0000U) << 2) | + ((w0 & 0x0000000FU) << 12) | ((w0 & 0x0000FFF0U) >> 4); + w1 = ((w1 & 0xC0000000U) >> 14) | ((w1 & 0x3FFF0000U) << 2) | + ((w1 & 0x0000000FU) << 12) | ((w1 & 0x0000FFF0U) >> 4); + w2 = ((w2 & 0xC0000000U) >> 14) | ((w2 & 0x3FFF0000U) << 2) | + ((w2 & 0x0000000FU) << 12) | ((w2 & 0x0000FFF0U) >> 4); + w3 = ((w3 & 0xC0000000U) >> 14) | ((w3 & 0x3FFF0000U) << 2) | + ((w3 & 0x0000000FU) << 12) | ((w3 & 0x0000FFF0U) >> 4); + + /* Perform all 28 rounds */ + for (round = 28; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 4 rounds except the last */ + if ((round % 4) == 0 && round != 28) + s2 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s0 ^= (uint16_t)w3; + s1 ^= (uint16_t)(w3 >> 16); + s3 ^= 0x8000U ^ GIFT64_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word16(output, s0); + be_store_word16(output + 2, s1); + be_store_word16(output + 4, s2); + be_store_word16(output + 6, s3); + gift64n_to_nibbles(output, output); +} + +#endif /* GIFT64_LOW_MEMORY */ diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.h b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.h new file mode 100644 index 0000000..010359b --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-gift64.h @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT64_H +#define LW_INTERNAL_GIFT64_H + +/** + * \file internal-gift64.h + * \brief GIFT-64 block cipher. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \var GIFT64_LOW_MEMORY + * \brief Define this to 1 to use a low memory version of the key schedule. + * + * The default is to use the fix-sliced version of GIFT-64 which is very + * fast on 32-bit platforms but requires 48 bytes to store the key schedule. + * The large key schedule may be a problem on 8-bit and 16-bit platforms. + * The fix-sliced version also encrypts two blocks at a time in 32-bit + * words which is an unnecessary optimization for 8-bit platforms. + * + * GIFT64_LOW_MEMORY can be defined to 1 to select the original non + * fix-sliced version which only requires 16 bytes to store the key, + * with the rest of the key schedule expanded on the fly. + */ +#if !defined(GIFT64_LOW_MEMORY) +#if defined(__AVR__) +#define GIFT64_LOW_MEMORY 1 +#else +#define GIFT64_LOW_MEMORY 0 +#endif +#endif + +/** + * \brief Size of a GIFT-64 block in bytes. + */ +#define GIFT64_BLOCK_SIZE 8 + +/** + * \brief Structure of the key schedule for GIFT-64. + */ +typedef struct +{ + uint32_t k[4]; /**< Words of the key schedule */ +#if !GIFT64_LOW_MEMORY + uint32_t rk[8]; /**< Pre-computed round keys for fixsliced form */ +#endif + +} gift64n_key_schedule_t; + +/** + * \fn void gift64n_update_round_keys(gift64n_key_schedule_t *ks); + * \brief Updates the round keys after a change in the base key. + * + * \param ks Points to the key schedule to update. + */ +#if GIFT64_LOW_MEMORY +#define gift64n_update_round_keys(ks) do { ; } while (0) /* Not needed */ +#else +void gift64n_update_round_keys(gift64n_key_schedule_t *ks); +#endif + +/** + * \brief Initializes the key schedule for GIFT-64 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift64n_init(gift64n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 64-bit block with GIFT-64 (nibble-based). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift64n_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 64-bit block with GIFT-64 (nibble-based). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift64n_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 16-bit for TweGIFT-64 */ +#define GIFT64T_TWEAK_0 0x0000 /**< TweGIFT-64 tweak value 0 */ +#define GIFT64T_TWEAK_1 0xe1e1 /**< TweGIFT-64 tweak value 1 */ +#define GIFT64T_TWEAK_2 0xd2d2 /**< TweGIFT-64 tweak value 2 */ +#define GIFT64T_TWEAK_3 0x3333 /**< TweGIFT-64 tweak value 3 */ +#define GIFT64T_TWEAK_4 0xb4b4 /**< TweGIFT-64 tweak value 4 */ +#define GIFT64T_TWEAK_5 0x5555 /**< TweGIFT-64 tweak value 5 */ +#define GIFT64T_TWEAK_6 0x6666 /**< TweGIFT-64 tweak value 6 */ +#define GIFT64T_TWEAK_7 0x8787 /**< TweGIFT-64 tweak value 7 */ +#define GIFT64T_TWEAK_8 0x7878 /**< TweGIFT-64 tweak value 8 */ +#define GIFT64T_TWEAK_9 0x9999 /**< TweGIFT-64 tweak value 9 */ +#define GIFT64T_TWEAK_10 0xaaaa /**< TweGIFT-64 tweak value 10 */ +#define GIFT64T_TWEAK_11 0x4b4b /**< TweGIFT-64 tweak value 11 */ +#define GIFT64T_TWEAK_12 0xcccc /**< TweGIFT-64 tweak value 12 */ +#define GIFT64T_TWEAK_13 0x2d2d /**< TweGIFT-64 tweak value 13 */ +#define GIFT64T_TWEAK_14 0x1e1e /**< TweGIFT-64 tweak value 14 */ +#define GIFT64T_TWEAK_15 0xffff /**< TweGIFT-64 tweak value 15 */ + +/** + * \brief Encrypts a 64-bit block with TweGIFT-64 (tweakable variant). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * \param tweak 4-bit tweak value expanded to 16-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift64n_encrypt(). + */ +void gift64t_encrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak); + +/** + * \brief Decrypts a 64-bit block with TweGIFT-64 (tweakable variant). + * + * \param ks Points to the GIFT-64 key schedule. + * \param output Output buffer which must be at least 8 bytes in length. + * \param input Input buffer which must be at least 8 bytes in length. + * \param tweak 4-bit tweak value expanded to 16-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-64 is used by the LOTUS/LOCUS submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift64n_decrypt(). + */ +void gift64t_decrypt + (const gift64n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint16_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-util.h b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.c b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.c new file mode 100644 index 0000000..4a1efd0 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.c @@ -0,0 +1,436 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "lotus-locus.h" +#include "internal-gift64.h" +#include "internal-util.h" +#include + +aead_cipher_t const lotus_aead_cipher = { + "LOTUS-AEAD", + LOTUS_AEAD_KEY_SIZE, + LOTUS_AEAD_NONCE_SIZE, + LOTUS_AEAD_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + lotus_aead_encrypt, + lotus_aead_decrypt +}; + +aead_cipher_t const locus_aead_cipher = { + "LOCUS-AEAD", + LOCUS_AEAD_KEY_SIZE, + LOCUS_AEAD_NONCE_SIZE, + LOCUS_AEAD_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + locus_aead_encrypt, + locus_aead_decrypt +}; + +/** + * \brief Multiplies a key by 2 in the GF(128) field. + * + * \param ks The key schedule structure containing the key in host byte order. + */ +STATIC_INLINE void lotus_or_locus_mul_2(gift64n_key_schedule_t *ks) +{ + uint32_t mask = (uint32_t)(((int32_t)(ks->k[0])) >> 31); + ks->k[0] = (ks->k[0] << 1) | (ks->k[1] >> 31); + ks->k[1] = (ks->k[1] << 1) | (ks->k[2] >> 31); + ks->k[2] = (ks->k[2] << 1) | (ks->k[3] >> 31); + ks->k[3] = (ks->k[3] << 1) ^ (mask & 0x87); + gift64n_update_round_keys(ks); +} + +/** + * \brief Initializes a LOTUS-AEAD or LOCUS-AEAD cipher instance. + * + * \param ks Key schedule to initialize. + * \param deltaN Delta-N value for the cipher state. + * \param key Points to the 16-byte key for the cipher instance. + * \param nonce Points to the 16-byte key for the cipher instance. + * \param T Points to a temporary buffer of LOTUS_AEAD_KEY_SIZE bytes + * that will be destroyed during this function. + */ +static void lotus_or_locus_init + (gift64n_key_schedule_t *ks, + unsigned char deltaN[GIFT64_BLOCK_SIZE], + const unsigned char *key, + const unsigned char *nonce, + unsigned char *T) +{ + gift64n_init(ks, key); + memset(deltaN, 0, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, deltaN, deltaN, GIFT64T_TWEAK_0); + lw_xor_block_2_src(T, key, nonce, LOTUS_AEAD_KEY_SIZE); + gift64n_init(ks, T); + gift64t_encrypt(ks, deltaN, deltaN, GIFT64T_TWEAK_1); +} + +/** + * \brief Processes associated data for LOTUS-AEAD or LOCUS-AEAD. + * + * \param ks Points to the key schedule. + * \param deltaN Points to the Delta-N value from the state. + * \param V Points to the V value from the state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void lotus_or_locus_process_ad + (gift64n_key_schedule_t *ks, + const unsigned char deltaN[GIFT64_BLOCK_SIZE], + unsigned char V[GIFT64_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned char temp; + while (adlen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(ks); + lw_xor_block_2_src(X, ad, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_2); + lw_xor_block(V, X, GIFT64_BLOCK_SIZE); + ad += GIFT64_BLOCK_SIZE; + adlen -= GIFT64_BLOCK_SIZE; + } + lotus_or_locus_mul_2(ks); + temp = (unsigned)adlen; + if (temp < GIFT64_BLOCK_SIZE) { + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(X, ad, temp); + X[temp] ^= 0x01; + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_3); + } else { + lw_xor_block_2_src(X, ad, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, X, X, GIFT64T_TWEAK_2); + } + lw_xor_block(V, X, GIFT64_BLOCK_SIZE); +} + +/** + * \brief Generates the authentication tag for LOTUS-AEAD or LOCUS-AEAD. + * + * \param ks Points to the key schedule. + * \param tag Points to the buffer to receive the authentication tag. + * \param deltaN Points to the Delta-N value from the state. + * \param W Points to the W value from the state. + * \param V Points to the V value from the state. + */ +static void lotus_or_locus_gen_tag + (gift64n_key_schedule_t *ks, unsigned char *tag, + unsigned char deltaN[GIFT64_BLOCK_SIZE], + unsigned char W[GIFT64_BLOCK_SIZE], + unsigned char V[GIFT64_BLOCK_SIZE]) +{ + lotus_or_locus_mul_2(ks); + lw_xor_block(W, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(W, V, GIFT64_BLOCK_SIZE); + gift64t_encrypt(ks, W, W, GIFT64T_TWEAK_6); + lw_xor_block_2_src(tag, W, deltaN, GIFT64_BLOCK_SIZE); +} + +int lotus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X1[GIFT64_BLOCK_SIZE]; + unsigned char X2[GIFT64_BLOCK_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + LOTUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > (GIFT64_BLOCK_SIZE * 2)) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X1, m, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_4); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block_2_src + (X2, m + GIFT64_BLOCK_SIZE, X2, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(c, X2, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block_2_src + (c + GIFT64_BLOCK_SIZE, X1, X2, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE * 2; + m += GIFT64_BLOCK_SIZE * 2; + mlen -= GIFT64_BLOCK_SIZE * 2; + } + temp = (unsigned)mlen; + lotus_or_locus_mul_2(&ks); + memcpy(X1, deltaN, GIFT64_BLOCK_SIZE); + X1[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_12); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_12); + if (temp <= GIFT64_BLOCK_SIZE) { + lw_xor_block(WV, m, temp); + lw_xor_block(X2, m, temp); + lw_xor_block_2_src(c, X2, deltaN, temp); + } else { + lw_xor_block(X2, m, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(c, X2, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + temp -= GIFT64_BLOCK_SIZE; + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, m, temp); + lw_xor_block(X1, X2, temp); + lw_xor_block_2_src(c, X1, m, temp); + } + c += temp; + } + + /* Generate the authentication tag */ + lotus_or_locus_gen_tag(&ks, c, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return 0; +} + +int lotus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X1[GIFT64_BLOCK_SIZE]; + unsigned char X2[GIFT64_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < LOTUS_AEAD_TAG_SIZE) + return -1; + *mlen = clen - LOTUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= LOTUS_AEAD_TAG_SIZE; + if (clen > 0) { + while (clen > (GIFT64_BLOCK_SIZE * 2)) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X1, c, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_5); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_5); + lw_xor_block(X2, c + GIFT64_BLOCK_SIZE, GIFT64_BLOCK_SIZE); + lw_xor_block_2_src(m, X2, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_4); + lw_xor_block_2_src + (m + GIFT64_BLOCK_SIZE, X1, X2, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE * 2; + m += GIFT64_BLOCK_SIZE * 2; + clen -= GIFT64_BLOCK_SIZE * 2; + } + temp = (unsigned)clen; + lotus_or_locus_mul_2(&ks); + memcpy(X1, deltaN, GIFT64_BLOCK_SIZE); + X1[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X2, X1, GIFT64T_TWEAK_12); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_12); + if (temp <= GIFT64_BLOCK_SIZE) { + lw_xor_block_2_src(m, X2, c, temp); + lw_xor_block(m, deltaN, temp); + lw_xor_block(X2, m, temp); + lw_xor_block(WV, m, temp); + } else { + lw_xor_block_2_src(m, X2, c, GIFT64_BLOCK_SIZE); + lw_xor_block(m, deltaN, GIFT64_BLOCK_SIZE); + lw_xor_block(X2, m, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + temp -= GIFT64_BLOCK_SIZE; + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(WV, X2, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X2, X2, GIFT64T_TWEAK_13); + lw_xor_block(X1, X2, temp); + lw_xor_block_2_src(m, X1, c, temp); + lw_xor_block(WV, m, temp); + } + c += temp; + } + + /* Check the authentication tag */ + lotus_or_locus_gen_tag(&ks, WV, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return aead_check_tag(mtemp, *mlen, WV, c, LOTUS_AEAD_TAG_SIZE); +} + +int locus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + LOCUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X, m, deltaN, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block_2_src(c, X, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + mlen -= GIFT64_BLOCK_SIZE; + } + temp = (unsigned)mlen; + lotus_or_locus_mul_2(&ks); + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + X[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + lw_xor_block(WV, m, temp); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(X, deltaN, temp); + lw_xor_block_2_src(c, m, X, temp); + c += temp; + } + + /* Generate the authentication tag */ + lotus_or_locus_gen_tag(&ks, c, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return 0; +} + +int locus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + gift64n_key_schedule_t ks; + unsigned char WV[GIFT64_BLOCK_SIZE * 2]; + unsigned char deltaN[GIFT64_BLOCK_SIZE]; + unsigned char X[GIFT64_BLOCK_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < LOCUS_AEAD_TAG_SIZE) + return -1; + *mlen = clen - LOCUS_AEAD_TAG_SIZE; + + /* Initialize the state with the key and the nonce */ + lotus_or_locus_init(&ks, deltaN, k, npub, WV); + memset(WV, 0, sizeof(WV)); + + /* Process the associated data */ + if (adlen > 0) { + lotus_or_locus_process_ad + (&ks, deltaN, WV + GIFT64_BLOCK_SIZE, ad, adlen); + } + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= LOCUS_AEAD_TAG_SIZE; + if (clen > 0) { + while (clen > GIFT64_BLOCK_SIZE) { + lotus_or_locus_mul_2(&ks); + lw_xor_block_2_src(X, c, deltaN, GIFT64_BLOCK_SIZE); + gift64t_decrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_decrypt(&ks, X, X, GIFT64T_TWEAK_4); + lw_xor_block_2_src(m, X, deltaN, GIFT64_BLOCK_SIZE); + c += GIFT64_BLOCK_SIZE; + m += GIFT64_BLOCK_SIZE; + clen -= GIFT64_BLOCK_SIZE; + } + temp = (unsigned)clen; + lotus_or_locus_mul_2(&ks); + memcpy(X, deltaN, GIFT64_BLOCK_SIZE); + X[0] ^= (unsigned char)temp; + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(WV, X, GIFT64_BLOCK_SIZE); + gift64t_encrypt(&ks, X, X, GIFT64T_TWEAK_5); + lw_xor_block(X, deltaN, temp); + lw_xor_block_2_src(m, c, X, temp); + lw_xor_block(WV, m, temp); + c += temp; + } + + /* Check the authentication tag */ + lotus_or_locus_gen_tag(&ks, WV, deltaN, WV, WV + GIFT64_BLOCK_SIZE); + return aead_check_tag(mtemp, *mlen, WV, c, LOCUS_AEAD_TAG_SIZE); +} diff --git a/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.h b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.h new file mode 100644 index 0000000..85434a8 --- /dev/null +++ b/lotus-locus/Implementations/crypto_aead/twegift64lotusaeadv1/rhys-avr/lotus-locus.h @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_LOTUS_LOCUS_H +#define LWCRYPTO_LOTUS_LOCUS_H + +#include "aead-common.h" + +/** + * \file lotus-locus.h + * \brief LOTUS-AEAD and LOCUS-AEAD authenticated encryption algorithms. + * + * LOTUS-AEAD and LOCUS-AEAD are authenticated encryption algorithms + * that are based around a tweakable variant of the GIFT-64 block cipher + * called TweGIFT-64. Both AEAD algorithms have a 128-bit key, a 128-bit + * nonce, and a 64-bit tag. + * + * The two algorithms have the same key initialization, associated data + * processing, and tag generation mechanisms. They differ in how the + * input is encrypted with TweGIFT-64. + * + * LOTUS-AEAD uses a method similar to the block cipher mode OTR. + * TweGIFT-64 is essentially converted into a 128-bit block cipher + * using a Feistel construction and four TweGIFT-64 block operations + * every 16 bytes of input. + * + * LOCUS-AEAD uses a method similar to the block cipher mode OCB + * with two TweGIFT-64 block operations for every 8 bytes of input. + * LOCUS-AEAD requires both the block encrypt and block decrypt + * operations of TweGIFT-64, which increases the overall code size. + * LOTUS-AEAD only needs the block encrypt operation. + * + * LOTUS-AEAD is the primary member of the family. + * + * References: https://www.isical.ac.in/~lightweight/lotus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for LOTUS-AEAD. + */ +#define LOTUS_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for LOTUS-AEAD. + */ +#define LOTUS_AEAD_TAG_SIZE 8 + +/** + * \brief Size of the nonce for LOTUS-AEAD. + */ +#define LOTUS_AEAD_NONCE_SIZE 16 + +/** + * \brief Size of the key for LOCUS-AEAD. + */ +#define LOCUS_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for LOCUS-AEAD. + */ +#define LOCUS_AEAD_TAG_SIZE 8 + +/** + * \brief Size of the nonce for LOCUS-AEAD. + */ +#define LOCUS_AEAD_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the LOTUS-AEAD cipher. + */ +extern aead_cipher_t const lotus_aead_cipher; + +/** + * \brief Meta-information block for the LOCUS-AEAD cipher. + */ +extern aead_cipher_t const locus_aead_cipher; + +/** + * \brief Encrypts and authenticates a packet with LOTUS-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa lotus_aead_decrypt() + */ +int lotus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with LOTUS-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 9 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa lotus_aead_encrypt() + */ +int lotus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with LOCUS-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa locus_aead_decrypt() + */ +int locus_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with LOCUS-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 9 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa locus_aead_encrypt() + */ +int locus_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.c b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.h b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/api.h b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/encrypt.c b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..e1ea967 --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "orange.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return orange_zest_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return orange_zest_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.c b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.c new file mode 100644 index 0000000..b8743fe --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.c @@ -0,0 +1,479 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-photon256.h" +#include "internal-util.h" + +/** + * \brief Number of rounds in the PHOTON-256 permutation in bit-sliced form. + */ +#define PHOTON256_ROUNDS 12 + +/* Round constants for PHOTON-256 */ +static uint32_t const photon256_rc[PHOTON256_ROUNDS] = { + 0x96d2f0e1, 0xb4f0d2c3, 0xf0b49687, 0x692d0f1e, + 0x5a1e3c2d, 0x3c785a4b, 0xe1a58796, 0x4b0f2d3c, + 0x1e5a7869, 0xa5e1c3d2, 0xd296b4a5, 0x2d694b5a +}; + +/** + * \brief Evaluates the PHOTON-256 S-box in bit-sliced form. + * + * \param x0 Slice with bit 0 of all nibbles. + * \param x1 Slice with bit 1 of all nibbles. + * \param x2 Slice with bit 2 of all nibbles. + * \param x3 Slice with bit 3 of all nibbles. + * + * This bit-sliced S-box implementation is based on the AVR version + * "add_avr8_bitslice_asm" from the PHOTON-Beetle reference code. + */ +#define photon256_sbox(x0, x1, x2, x3) \ + do { \ + x1 ^= x2; \ + x3 ^= (x2 & x1); \ + t1 = x3; \ + x3 = (x3 & x1) ^ x2; \ + t2 = x3; \ + x3 ^= x0; \ + x3 = ~(x3); \ + x2 = x3; \ + t2 |= x0; \ + x0 ^= t1; \ + x1 ^= x0; \ + x2 |= x1; \ + x2 ^= t1; \ + x1 ^= t2; \ + x3 ^= x1; \ + } while (0) + +/** + * \brief Performs a field multiplication on the 8 nibbles in a row. + * + * \param a Field constant to multiply by. + * \param x Bit-sliced form of the row, with bits 0..3 of each nibble + * in bytes 0..3 of the word. + * + * \return a * x packed into the bytes of a word. + */ +static uint32_t photon256_field_multiply(uint8_t a, uint32_t x) +{ + /* For each 4-bit nibble we need to do this: + * + * result = 0; + * for (bit = 0; bit < 4; ++ bit) { + * if ((a & (1 << bit)) != 0) + * result ^= x; + * if ((x & 0x08) != 0) { + * x = (x << 1) ^ 3; + * } else { + * x = (x << 1); + * } + * } + * + * We don't need to worry about constant time for "a" because it is a + * known constant that isn't data-dependent. But we do need to worry + * about constant time for "x" as it is data. + */ + uint32_t result = 0; + uint32_t t; + #define PARALLEL_CONDITIONAL_ADD(bit) \ + do { \ + if ((a) & (1 << (bit))) \ + result ^= x; \ + } while (0) + #define PARALELL_ROTATE() \ + do { \ + t = x >> 24; \ + x = (x << 8) ^ t ^ (t << 8); \ + } while (0) + PARALLEL_CONDITIONAL_ADD(0); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(1); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(2); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(3); + return result; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts a PHOTON-256 state into bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_to_sliced + (uint32_t out[PHOTON256_STATE_SIZE / 4], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* We first scatter bits 0..3 of the nibbles to bytes 0..3 of the words. + * Then we rearrange the bytes to group all bits N into word N. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 + * 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31] + */ + uint32_t t0, t1, t2, t3; + #define TO_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + #define FROM_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + t0 = le_load_word32(in); + t1 = le_load_word32(in + 4); + t2 = le_load_word32(in + 8); + t3 = le_load_word32(in + 12); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[0] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[1] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[2] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[3] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); + t0 = le_load_word32(in + 16); + t1 = le_load_word32(in + 20); + t2 = le_load_word32(in + 24); + t3 = le_load_word32(in + 28); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[4] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[5] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[6] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[7] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); +} + +/** + * \brief Converts a PHOTON-256 state from bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_from_sliced + (unsigned char out[PHOTON256_STATE_SIZE], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* Do the reverse of photon256_to_sliced() */ + uint32_t x0, x1, x2, x3; + x0 = ((uint32_t)(in[0])) | + (((uint32_t)(in[4])) << 8) | + (((uint32_t)(in[8])) << 16) | + (((uint32_t)(in[12])) << 24); + x1 = ((uint32_t)(in[1])) | + (((uint32_t)(in[5])) << 8) | + (((uint32_t)(in[9])) << 16) | + (((uint32_t)(in[13])) << 24); + x2 = ((uint32_t)(in[2])) | + (((uint32_t)(in[6])) << 8) | + (((uint32_t)(in[10])) << 16) | + (((uint32_t)(in[14])) << 24); + x3 = ((uint32_t)(in[3])) | + (((uint32_t)(in[7])) << 8) | + (((uint32_t)(in[11])) << 16) | + (((uint32_t)(in[15])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out, x0); + le_store_word32(out + 4, x1); + le_store_word32(out + 8, x2); + le_store_word32(out + 12, x3); + x0 = ((uint32_t)(in[16])) | + (((uint32_t)(in[20])) << 8) | + (((uint32_t)(in[24])) << 16) | + (((uint32_t)(in[28])) << 24); + x1 = ((uint32_t)(in[17])) | + (((uint32_t)(in[21])) << 8) | + (((uint32_t)(in[25])) << 16) | + (((uint32_t)(in[29])) << 24); + x2 = ((uint32_t)(in[18])) | + (((uint32_t)(in[22])) << 8) | + (((uint32_t)(in[26])) << 16) | + (((uint32_t)(in[30])) << 24); + x3 = ((uint32_t)(in[19])) | + (((uint32_t)(in[23])) << 8) | + (((uint32_t)(in[27])) << 16) | + (((uint32_t)(in[31])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out + 16, x0); + le_store_word32(out + 20, x1); + le_store_word32(out + 24, x2); + le_store_word32(out + 28, x3); +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +/* Index the bit-sliced state bytes in little-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[(row)] = (uint8_t)(value); \ + S.bytes[(row) + 4] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 8] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 12] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[(row) + 12] = (uint8_t)(value); \ + S.bytes[(row) + 16] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 20] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 24] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#else +/* Index the bit-sliced state bytes in big-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[3 - (row)] = (uint8_t)(value); \ + S.bytes[7 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[11 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[15 - (row)] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[20 - (row)] = (uint8_t)(value); \ + S.bytes[24 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[28 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[32 - (row)] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#endif + +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]) +{ + union { + uint32_t words[PHOTON256_STATE_SIZE / 4]; + uint8_t bytes[PHOTON256_STATE_SIZE]; + } S; + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + uint8_t round; + + /* Convert the state into bit-sliced form */ + photon256_to_sliced(S.words, state); + + /* Perform all 12 permutation rounds */ + for (round = 0; round < PHOTON256_ROUNDS; ++round) { + /* Add the constants for this round */ + t0 = photon256_rc[round]; + S.words[0] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[1] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[2] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[3] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[4] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[5] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[6] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[7] ^= t0 & 0x01010101U; + + /* Apply the sbox to all nibbles in the state */ + photon256_sbox(S.words[0], S.words[1], S.words[2], S.words[3]); + photon256_sbox(S.words[4], S.words[5], S.words[6], S.words[7]); + + /* Rotate all rows left by the row number. + * + * We do this by applying permutations to the top and bottom words + * to rearrange the bits into the rotated form. Permutations + * generated with "http://programming.sirrida.de/calcperm.php". + * + * P_top = [0 1 2 3 4 5 6 7 15 8 9 10 11 12 13 14 22 23 + * 16 17 18 19 20 21 29 30 31 24 25 26 27 28] + * P_bot = [4 5 6 7 0 1 2 3 11 12 13 14 15 8 9 10 18 19 + * 20 21 22 23 16 17 25 26 27 28 29 30 31 24 + */ + #define TOP_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x07030100, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + #define BOTTOM_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x080c0e0f, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + TOP_ROTATE_PERM(S.words[0]); + TOP_ROTATE_PERM(S.words[1]); + TOP_ROTATE_PERM(S.words[2]); + TOP_ROTATE_PERM(S.words[3]); + BOTTOM_ROTATE_PERM(S.words[4]); + BOTTOM_ROTATE_PERM(S.words[5]); + BOTTOM_ROTATE_PERM(S.words[6]); + BOTTOM_ROTATE_PERM(S.words[7]); + + /* Mix the columns */ + #define MUL(a, x) (photon256_field_multiply((a), (x))) + t0 = READ_ROW0(); + t1 = READ_ROW1(); + t2 = READ_ROW2(); + t3 = READ_ROW3(); + t4 = READ_ROW4(); + t5 = READ_ROW5(); + t6 = READ_ROW6(); + t7 = READ_ROW7(); + t8 = MUL(0x02, t0) ^ MUL(0x04, t1) ^ MUL(0x02, t2) ^ MUL(0x0b, t3) ^ + MUL(0x02, t4) ^ MUL(0x08, t5) ^ MUL(0x05, t6) ^ MUL(0x06, t7); + WRITE_ROW(0, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x09, t1) ^ MUL(0x08, t2) ^ MUL(0x0d, t3) ^ + MUL(0x07, t4) ^ MUL(0x07, t5) ^ MUL(0x05, t6) ^ MUL(0x02, t7); + WRITE_ROW(1, t8); + t8 = MUL(0x04, t0) ^ MUL(0x04, t1) ^ MUL(0x0d, t2) ^ MUL(0x0d, t3) ^ + MUL(0x09, t4) ^ MUL(0x04, t5) ^ MUL(0x0d, t6) ^ MUL(0x09, t7); + WRITE_ROW(2, t8); + t8 = MUL(0x01, t0) ^ MUL(0x06, t1) ^ MUL(0x05, t2) ^ MUL(0x01, t3) ^ + MUL(0x0c, t4) ^ MUL(0x0d, t5) ^ MUL(0x0f, t6) ^ MUL(0x0e, t7); + WRITE_ROW(3, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x0c, t1) ^ MUL(0x09, t2) ^ MUL(0x0d, t3) ^ + MUL(0x0e, t4) ^ MUL(0x05, t5) ^ MUL(0x0e, t6) ^ MUL(0x0d, t7); + WRITE_ROW(4, t8); + t8 = MUL(0x09, t0) ^ MUL(0x0e, t1) ^ MUL(0x05, t2) ^ MUL(0x0f, t3) ^ + MUL(0x04, t4) ^ MUL(0x0c, t5) ^ MUL(0x09, t6) ^ MUL(0x06, t7); + WRITE_ROW(5, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x02, t1) ^ MUL(0x02, t2) ^ MUL(0x0a, t3) ^ + MUL(0x03, t4) ^ MUL(0x01, t5) ^ MUL(0x01, t6) ^ MUL(0x0e, t7); + WRITE_ROW(6, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x01, t1) ^ MUL(0x0d, t2) ^ MUL(0x0a, t3) ^ + MUL(0x05, t4) ^ MUL(0x0a, t5) ^ MUL(0x02, t6) ^ MUL(0x03, t7); + WRITE_ROW(7, t8); + } + + /* Convert back from bit-sliced form to regular form */ + photon256_from_sliced(state, S.bytes); +} diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.h b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.h new file mode 100644 index 0000000..ce8729a --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-photon256.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PHOTON256_H +#define LW_INTERNAL_PHOTON256_H + +/** + * \file internal-photon256.h + * \brief Internal implementation of the PHOTON-256 permutation. + * + * Warning: The current implementation of PHOTON-256 is constant-time + * but not constant-cache. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the PHOTON-256 permutation state in bytes. + */ +#define PHOTON256_STATE_SIZE 32 + +/** + * \brief Permutes the PHOTON-256 state. + * + * \param state The state to be permuted. + */ +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-util.h b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.c b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.c new file mode 100644 index 0000000..641e117 --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.c @@ -0,0 +1,384 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "orange.h" +#include "internal-photon256.h" +#include "internal-util.h" +#include + +aead_cipher_t const orange_zest_cipher = { + "ORANGE-Zest", + ORANGE_ZEST_KEY_SIZE, + ORANGE_ZEST_NONCE_SIZE, + ORANGE_ZEST_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + orange_zest_aead_encrypt, + orange_zest_aead_decrypt +}; + +aead_hash_algorithm_t const orangish_hash_algorithm = { + "ORANGISH", + sizeof(int), + ORANGISH_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + orangish_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Doubles a block in the GF(128) field a number of times. + * + * \param block The block to be doubled. + * \param value The number of times to double the block. + */ +static void orange_block_double(unsigned char block[16], unsigned char value) +{ + unsigned index; + unsigned char mask; + while (value > 0) { + mask = (unsigned char)(((signed char)(block[15])) >> 7); + for (index = 15; index > 0; --index) + block[index] = (block[index] << 1) | (block[index - 1] >> 7); + block[0] = (block[0] << 1) ^ (mask & 0x87); + --value; + } +} + +/** + * \brief Rotates a block left by 1 bit. + * + * \param out The output block to be set to the rotated version. + * \param in The input block to be rotated, must not overlap with \a out. + */ +static void orange_block_rotate + (unsigned char out[16], const unsigned char in[16]) +{ + unsigned index; + for (index = 15; index > 0; --index) + out[index] = (in[index] << 1) | (in[index - 1] >> 7); + out[0] = (in[0] << 1) | (in[15] >> 7); +} + +/** + * \brief Hash input data with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param data Points to the data to be hashed. + * \param len Length of the data to be hashed, must not be zero. + * \param domain0 Domain separation value for full last block. + * \param domain1 Domain separation value for partial last block. + */ +static void orange_process_hash + (unsigned char state[PHOTON256_STATE_SIZE], + const unsigned char *data, unsigned long long len, + unsigned char domain0, unsigned char domain1) +{ + unsigned temp; + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + lw_xor_block(state, data, PHOTON256_STATE_SIZE); + data += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, domain1); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, domain0); + } + lw_xor_block(state, data, temp); +} + +/** + * \brief Applies the rho function to the ORANGE state. + * + * \param KS Output keystream to use to encrypt the plaintext or to + * decrypt the ciphertext. + * \param S Rolling key state. + * \param state Rolling PHOTON-256 permutation state. + */ +static void orange_rho + (unsigned char KS[32], unsigned char S[16], const unsigned char state[32]) +{ + orange_block_double(S, 1); + orange_block_rotate(KS, state); + lw_xor_block_2_src(KS + 16, state + 16, S, 16); + memcpy(S, state + 16, 16); +} + +/** + * \brief Encrypts plaintext with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param k Points to the key for the cipher. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param len Length of the plaintext in bytes, must not be zero. + */ +static void orange_encrypt + (unsigned char state[PHOTON256_STATE_SIZE], const unsigned char *k, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + unsigned char S[ORANGE_ZEST_KEY_SIZE]; + unsigned char KS[PHOTON256_STATE_SIZE]; + unsigned temp; + memcpy(S, k, ORANGE_ZEST_KEY_SIZE); + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, PHOTON256_STATE_SIZE); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + c += PHOTON256_STATE_SIZE; + m += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, 2); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, temp); + lw_xor_block(state, c, temp); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, 1); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, PHOTON256_STATE_SIZE); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + } +} + +/** + * \brief Decrypts ciphertext with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param k Points to the key for the cipher. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param len Length of the plaintext in bytes, must not be zero. + */ +static void orange_decrypt + (unsigned char state[PHOTON256_STATE_SIZE], const unsigned char *k, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + unsigned char S[ORANGE_ZEST_KEY_SIZE]; + unsigned char KS[PHOTON256_STATE_SIZE]; + unsigned temp; + memcpy(S, k, ORANGE_ZEST_KEY_SIZE); + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + orange_rho(KS, S, state); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + lw_xor_block_2_src(m, c, KS, PHOTON256_STATE_SIZE); + c += PHOTON256_STATE_SIZE; + m += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, 2); + orange_rho(KS, S, state); + lw_xor_block(state, c, temp); + lw_xor_block_2_src(m, c, KS, temp); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, 1); + orange_rho(KS, S, state); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + lw_xor_block_2_src(m, c, KS, PHOTON256_STATE_SIZE); + } +} + +/** + * \brief Generates the authentication tag for ORANGE-Zest. + * + * \param state PHOTON-256 permutation state. + * + * The tag will be left in the leading bytes of the state on exit. + */ +static void orange_generate_tag(unsigned char state[PHOTON256_STATE_SIZE]) +{ + /* Swap the two halves of the state and run the permutation again */ + unsigned posn; + for (posn = 0; posn < (PHOTON256_STATE_SIZE / 2); ++posn) { + unsigned char temp = state[posn]; + state[posn] = state[posn + (PHOTON256_STATE_SIZE / 2)]; + state[posn + (PHOTON256_STATE_SIZE / 2)] = temp; + } + photon256_permute(state); +} + +int orange_zest_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORANGE_ZEST_TAG_SIZE; + + /* Initialize the PHOTON-256 state with the nonce and key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Handle the associated data and message payload */ + if (adlen == 0) { + if (mlen == 0) { + state[16] ^= 2; /* domain separation */ + photon256_permute(state); + memcpy(c + mlen, state, ORANGE_ZEST_TAG_SIZE); + return 0; + } else { + state[16] ^= 1; /* domain separation */ + orange_encrypt(state, k, c, m, mlen); + } + } else { + orange_process_hash(state, ad, adlen, 1, 2); + if (mlen != 0) + orange_encrypt(state, k, c, m, mlen); + } + + /* Generate the authentication tag */ + orange_generate_tag(state); + memcpy(c + mlen, state, ORANGE_ZEST_TAG_SIZE); + return 0; +} + +int orange_zest_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORANGE_ZEST_TAG_SIZE) + return -1; + *mlen = clen - ORANGE_ZEST_TAG_SIZE; + + /* Initialize the PHOTON-256 state with the nonce and key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Handle the associated data and message payload */ + clen -= ORANGE_ZEST_TAG_SIZE; + if (adlen == 0) { + if (clen == 0) { + state[16] ^= 2; /* domain separation */ + photon256_permute(state); + return aead_check_tag(m, 0, state, c, ORANGE_ZEST_TAG_SIZE); + } else { + state[16] ^= 1; /* domain separation */ + orange_decrypt(state, k, m, c, clen); + } + } else { + orange_process_hash(state, ad, adlen, 1, 2); + if (clen != 0) + orange_decrypt(state, k, m, c, clen); + } + + /* Check the authentication tag */ + orange_generate_tag(state); + return aead_check_tag(m, clen, state, c + clen, ORANGE_ZEST_TAG_SIZE); +} + +/** + * \brief Rate of absorbing data into the ORANGISH hash state. + */ +#define ORANGISH_RATE 16 + +int orangish_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + unsigned temp; + memset(state, 0, sizeof(state)); + if (inlen == 0) { + /* No absorption necessary for a zero-length input */ + } else if (inlen < ORANGISH_RATE) { + /* Single partial block */ + temp = (unsigned)inlen; + memcpy(state, in, temp); + state[temp] ^= 0x01; /* padding */ + photon256_permute(state); + lw_xor_block(state + 16, in, temp); + state[16 + temp] ^= 0x01; /* padding */ + state[0] ^= 0x02; /* domain separation */ + } else if (inlen == ORANGISH_RATE) { + /* Single full block */ + memcpy(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + state[0] ^= 0x01; /* domain separation */ + } else { + /* Process double blocks until we run out */ + memcpy(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + in += ORANGISH_RATE; + inlen -= ORANGISH_RATE; + while (inlen > ORANGISH_RATE) { + lw_xor_block(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + in += ORANGISH_RATE; + inlen -= ORANGISH_RATE; + } + temp = (unsigned)inlen; + if (temp < ORANGISH_RATE) { + /* Last double block is partial */ + lw_xor_block(state, in, temp); + state[temp] ^= 0x01; /* padding */ + photon256_permute(state); + lw_xor_block(state + 16, in, temp); + state[16 + temp] ^= 0x01; /* padding */ + state[0] ^= 0x02; /* domain separation */ + } else { + /* Last double block is full */ + lw_xor_block(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + state[0] ^= 0x01; /* domain separation */ + } + } + photon256_permute(state); + memcpy(out, state, 16); + photon256_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.h b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.h new file mode 100644 index 0000000..de5b00c --- /dev/null +++ b/orange/Implementations/crypto_aead/orangezestv1/rhys-avr/orange.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ORANGE_H +#define LWCRYPTO_ORANGE_H + +#include "aead-common.h" + +/** + * \file orange.h + * \brief ORANGE authenticated encryption algorithm. + * + * ORANGE is a family of algorithms built around the PHOTON-256 permutation. + * There are two members of the family at present: + * + * \li ORANGE-Zest is an authenticated encryption algorithm with a 128-bit + * key, a 128-bit nonce, and a 128-bit tag. + * \li ORANGISH is a hash algorithm with a 256-bit output. + * + * References: https://www.isical.ac.in/~lightweight/Orange/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ORANGE-Zest. + */ +#define ORANGE_ZEST_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for ORANGE-Zest. + */ +#define ORANGE_ZEST_TAG_SIZE 16 + +/** + * \brief Size of the nonce for ORANGE-Zest. + */ +#define ORANGE_ZEST_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for the ORANGISH hash algorithm. + */ +#define ORANGISH_HASH_SIZE 32 + +/** + * \brief Meta-information block for the ORANGE-Zest cipher. + */ +extern aead_cipher_t const orange_zest_cipher; + +/** + * \brief Meta-information block for the ORANGISH hash algorithm. + */ +extern aead_hash_algorithm_t const orangish_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ORANGE-Zest. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa orange_zest_aead_decrypt() + */ +int orange_zest_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ORANGE-Zest. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa orange_zest_aead_encrypt() + */ +int orange_zest_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ORANGISH to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ORANGISH_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int orangish_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_hash/orangishv1/LWC_HASH_KAT_256.txt b/orange/Implementations/crypto_hash/orangishv1/LWC_HASH_KAT_256.txt index 8925898..978b5da 100644 --- a/orange/Implementations/crypto_hash/orangishv1/LWC_HASH_KAT_256.txt +++ b/orange/Implementations/crypto_hash/orangishv1/LWC_HASH_KAT_256.txt @@ -1,4100 +1,4100 @@ Count = 1 Msg = -MD = A435FBFCA1C99E834A8178AA3010EEF1DA625CDE18359B827B7C1D9BCF685F9F +MD = 10619570BDAD56C9A21F07B4AB397EB4FBC160862192B9F6936FCFA87AF2F71C Count = 2 Msg = 00 -MD = 8C162FB122DE04AB55873B3067AEC2B0E08F7A426762F92A6E6E83318F989F3A +MD = BAE3A78C77365700CADDBC45BBD09261EBC7F48AC224F9569C8C493496E380AA Count = 3 Msg = 0001 -MD = 5EE9800EE033D53FD48C1124A61A34D2B29FC7028270D1B765C901E60F2839C2 +MD = 368BAC1FD3EF196DD39DC34C1FE18DD58F348126C8AFA67112BC4FCB748061EF Count = 4 Msg = 000102 -MD = 918B0842E8821F674D6E576BA5AE19612157BAF9D82A89A777352F9F1C34A057 +MD = 7C7CF9CF0DD2AFE9EEED733BB52C78F21687E7BB06B36E8C94261147C6EC6199 Count = 5 Msg = 00010203 -MD = 51390073EFBB1DEF2CEAD9688CC2C9D907F2EF6AC8C8D7E73317EB2C28155226 +MD = 74059FF6EFBB5CA396967B57984F5B6DAA0DCDE2F7223EF0C5DCFC92269E6DD2 Count = 6 Msg = 0001020304 -MD = BC5EEB9BDD4A986A9B0DC0D26D5DD30E33ADBCED66E9A42EE9275A2CA3201C23 +MD = B2A267DD17BA5F1381117439A471FE540146BAB8A15664B31F8D4691977A41C5 Count = 7 Msg = 000102030405 -MD = 164B7CE1367ABAF914750186B7A6A554D1FBF03CEB995AE4CA21A4B66FA14413 +MD = BEFD1551C37976C94859DB7BD459BB857E06B0E20EA6D0156D138A93D45968BD Count = 8 Msg = 00010203040506 -MD = C94D65FADF6A5C1BEA25C2F1E3AB21A1D12CC61555B3AADE655EEA41325858EB +MD = 0B1EC4505E26A7FA70A2CBF40B312EE66A30201F9473E89ED2ECA4C7A15C2CCF Count = 9 Msg = 0001020304050607 -MD = 7317D3467EF948F01384959CE8EDDAD9110C78B0F624B0FAA3CEB175CEF57F06 +MD = 9E71B9A26E718584EEDD1D2B724318568153F2AB1A0E72CDC25B1ED597987A3A Count = 10 Msg = 000102030405060708 -MD = F8E8133569A4EEBA457F3F3CD9507E9867C756BF68631F29D699C0D3C28CF275 +MD = 0239668B7FB50F12EB8CDF3FF383B88511B0A0CBF2D1039D0816BDDE3D6399AA Count = 11 Msg = 00010203040506070809 -MD = A076B04BFAB394F623B804829AF6CE78AC780608CA58B77287D8CFD74A3736E7 +MD = 66CB0B8F2C4AB3718E53DD79025F9620D89953BCEE22E4803B96227F6D9F31E2 Count = 12 Msg = 000102030405060708090A -MD = 7E9FB41D92ACBCBC571E067F9E59D74B156AEB9F97EB6667E24DA8F30337DD8A +MD = 91FB9C7650360D897B781EF03BF23D21CE79177481D76890FFD5F145298406DD Count = 13 Msg = 000102030405060708090A0B -MD = CA98E5D3FEC715B20A8DD1A9AA9D82F8BD8F47BB5E499E939F72D28B36312D9D +MD = 466CB901DD632F7E60B64C293C767E3E59F91DBAF34127F76873519B17D47FE2 Count = 14 Msg = 000102030405060708090A0B0C -MD = 7EA4155ED8D306AD6A15F8FBE5BB2039920505701E0343598DAAC397F37FCBE1 +MD = 193350A48F247C1688C81A2DB213ADCD58175844D6CE922DBDF2C3F55E55B2C1 Count = 15 Msg = 000102030405060708090A0B0C0D -MD = FBF3A09078B59264013F021B07B40EF0F709D37A53187E637244FBBB053D48A2 +MD = AEF0A062A71B4080684F01EDAFF449B80436AAE5AF6D536409B37A0977106F79 Count = 16 Msg = 000102030405060708090A0B0C0D0E -MD = 2FF5C67C5FBB6ED926F7902EC37E955070E78C3716A01D52FCA77D80D2A142E1 +MD = 30F13E8779319DEBC789F8180235FAF301B521584E0F6029D75BDA4B510BA237 Count = 17 Msg = 000102030405060708090A0B0C0D0E0F -MD = 7F7674D2DCD6AC84939E7534623976DD4A08B0098C69D31F7CF3B9921761662E +MD = 28A5ED12FFAF3E928D98E6F491E4B0613D44F46EA460281F68A2CD49408EF0C8 Count = 18 Msg = 000102030405060708090A0B0C0D0E0F10 -MD = 0141393FADB3DAD79C197287BACC34E86090B8BA744C1B061AEC4BC56C41DBE9 +MD = D23C74169DA468AF3BE9AA0AF5560E823F695CA2212999AD2347ABADEFA73A6C Count = 19 Msg = 000102030405060708090A0B0C0D0E0F1011 -MD = 6FFE2632540B6F2F2116E4D6322663D9A3426D93D4E39D6135EC7061CDA3FC71 +MD = AAE8AC6017FB1E24DC8172EE53BC35EED66073F4DF0968CC549196EDCFA848E9 Count = 20 Msg = 000102030405060708090A0B0C0D0E0F101112 -MD = 718AFE73A962B9B6B2FB2614BBF5FADCCB6CF6B8D1C401B06D4FF292AED905A9 +MD = 24485854969AF1D2BF5F48A59015AC9F1FA687850467B0905E1B89717DCB786D Count = 21 Msg = 000102030405060708090A0B0C0D0E0F10111213 -MD = F63DAF47833B4CE52EF80308CD22F740307EFED333866D850AD0BD067D68848B +MD = 4B60E84F54711A0A2428BE67EDC287BEFC2DB65E23FC925D7D3B3334C516CBEA Count = 22 Msg = 000102030405060708090A0B0C0D0E0F1011121314 -MD = FC1915F576A74A0BB6BF21B92514A47236C7D2A0D02E4D13E87B1C4A5D6D844F +MD = 370711293E9035BBDA302A5A8E8D82094A9C3B0A56F16C9F8BF901CCC4544574 Count = 23 Msg = 000102030405060708090A0B0C0D0E0F101112131415 -MD = 127913CA7E2980C2CB1C684FB906D8B865CB3BF4674582C39EF4A2B84CE0C67A +MD = D10A659D02118B445A62D8E1B9F3B746D5484017DAAF95C97FE456202ACF3921 Count = 24 Msg = 000102030405060708090A0B0C0D0E0F10111213141516 -MD = B608B3F8D4FB6CFFDDA4D9093104EE7B832EC60A548171530D50CD3AE0DF522E +MD = 0BDB6772E71DE4D0772DC89093EB4F6028AF0DE354BF09271056D842861B3A81 Count = 25 Msg = 000102030405060708090A0B0C0D0E0F1011121314151617 -MD = 5263AE3D0B583AD686499897A86AB462E40063042396B21ACAB95E049DF3E16D +MD = C7E88A1F3D7E71F361DD71F83570C10B205A495D6F3A70F83568DA5EA26E0200 Count = 26 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718 -MD = 86E0C6B938BBD6E483572F0FA82020DD034A0AE1D824D8BC21FA6FD1645AF87A +MD = 4A0FE9AC375D9362DEB3FF8831590A7B187A18AFEFFABAFB2ACED890751DBF75 Count = 27 Msg = 000102030405060708090A0B0C0D0E0F10111213141516171819 -MD = B80D1A853B7E82901835C69CD8701E66015BAB53D4146E76EE6BCE3C4529D018 +MD = 3CC25A41B477074F237001FC549F737AF21592748E3429B0CF24E76D307E8C4B Count = 28 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A -MD = 09B86E4B1C7C22156EE15DD3ABB3E205C771829E8D0FC18530203DBBE3525B5D +MD = 3FA4510A5E0742BF2C7005242E9C59478EBD64FB21B6991A16EEF52C58416150 Count = 29 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -MD = F9E2387AB618DB265F8E8ECBB759ED1CE2CDEF6A924A0807B595096E878CD3DA +MD = C6F16AC116A07E5AFF6F674D55940BF4F499F456DFC1F4AF21138AC798254768 Count = 30 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -MD = 61715C6BF95AFDB30AF30895995DCE58793C80AF5FAFE70F2999BE788A45FCE5 +MD = 9C4FA71FF22892057F2C6B5D2F45045AE495E612C50B2C37C768479435D86077 Count = 31 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -MD = 88F5F8900A3FE65E1FB3A0721E5659D6EA43B696B782C20E902E4D9828AAAF44 +MD = B95F50363F38E604B03310038DE9985963F4AD61F0A025218C534D4CE79C7BB5 Count = 32 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -MD = 5E612154F9AF64A316B967369136359C6AD37E430FF3FA1769DEE5B4AEC40004 +MD = D68CC2BC21428F21449FFACDE3437DF0B646E73C49F6E71B3E1744277BB51D1E Count = 33 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -MD = D65C93ABF4876B23C855A5359C72B99593E2E7C0D3526B9EC14C4A3454E6A5C5 +MD = 6F485B953329236D64B3A74B59DBB135E240F2D6074481304B607432356D9683 Count = 34 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 -MD = E9351BB6E838E862CD6709D45EC25BD12C6582E3CBC72B77B34BCF2A0F81EA43 +MD = DD7E8118363DF20E1099700B031EB2780123CF130256DCA79261FE480E4A94EC Count = 35 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 -MD = FEAC8C2979ACA677F6F2D2217B40EDB775C4261728604D4C36E79313CF146F42 +MD = F706916C2CD18D2FE78BCD72523DA615979F47CB4E9A8EB1B1E610AA1223B803 Count = 36 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 -MD = 9574B21DADBEC4B3C65DADE3972F1711A864EAA934564762D65860EFDBE5F835 +MD = 957F8D69D57ACABAAD282844F2FDC82E0807CD9B320FC35CD19125C6388A6E28 Count = 37 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 -MD = 8D8D851FCB180F93A18AAA8758D1518F508F68B290873B68224A0808A11D654B +MD = 2CE579106507539873F32D2C3F04768024B5C3D4848A6E9A13E57F934FDFA7A8 Count = 38 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 -MD = 6C546F2300ADDB0582ED619001B6CA2DE3C885D91DC4822966846C30B53A6371 +MD = 2F3DCEEE3C4F743585A4A08ED752E25DAF3AFB07CA87AB9A54DF2A95196EE3E5 Count = 39 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 -MD = 13BF755E91560B40883A30A9FCB544983E24F591BBA4B598C0FBDE5667D9E23A +MD = E7A092DDC17E5EB88E3020AD6D846DE17DB6925D7F314161AF0FF7151956C74B Count = 40 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 -MD = 3FD392ABEE574FB4E7BF72E033C3BCAC9CDB36FAFE70E6548CBD5DA4334F69CA +MD = 310D52E2BE380E0BA206F0DA66DAD30FBD295B7EE459D267964BC81CB57B0967 Count = 41 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -MD = 1419284CFDD110F48C079132EBB4C953708D28C6A1466829550C4DFC6ED1402E +MD = 168A9C8F9320B4C15F0CCFCC7F6508CB3B3289C53A9DD42D8086AECBB787B892 Count = 42 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 -MD = AD4A52AB877B0F286641CFB2C711285D7EC17DF30DBC5D26D671EC7F3E96BB08 +MD = 1939B38B425F30E0246DD77447E61F3B52403577233E4EDB41DE0BE93BCFAF65 Count = 43 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 -MD = A7B2936B88FF309F373F099341048D582E2FC875DCE9E674A8190408805FE3E6 +MD = DF2A9A99364AFDF3ED98D403A0EDD55BC210B5FE8E21BA06816DC527E93E2B23 Count = 44 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A -MD = 3410A1F5A7E2E6E8B4E6A1F6DCB371A65DAFDCEEE7782BB034A30B290738F6CD +MD = CE0EA89B348140AF49C322FC7C86F83A1C173502053D19B2863802AEDF86B5EF Count = 45 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B -MD = EA2C66C38DD6F3446F0A923EEF9538C23DD5C574B99BD4148D2369933C07BA1A +MD = B3A9B5C4CD1498AD1734A4C4A16F7658AAB97E8C4F412D4A3F23C9AB1143222A Count = 46 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C -MD = 5511DB47D944DF3905717734264017AF975FD3FAF7EE871E1F9E2D2E84FB7069 +MD = 28EA4F3C9040E127A58831689798ED33DC440A85B45C8F6C5899922B6CA3601C Count = 47 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D -MD = 4129170E68C7A5F23A0D5E20D15FE6ED787B92BD70081D0E8D555E851C83E8CB +MD = 7CEE9D43141ADBF76BF969324E7A81B3AA233465C04D961C4364ACC6CF5D4B39 Count = 48 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -MD = 77B7E931AB960341005C22E8A59E7456C13DE9E2E570BEED553A8BD01A4844CF +MD = A428D2471E5CEF63F9383385404BCE2611711E8CF851AB4A1E5A0BDA773E8957 Count = 49 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F -MD = FB86F0E0FBE8B3A68E998793BDC04390335207BD85A3CF8C3E8F0EBBB4A13CD4 +MD = A6D72E2695E5EDF1F873185C861B87848D9DCC50C2FFF8F1D25C158ADB4B5226 Count = 50 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 -MD = AFB4ACFE0FF4247E0C4AB2C85BC8852979FA8C325E52385E5EFFD56E0D841291 +MD = BD351FF4D8062A7BF314DE8EBA0E324A5E80C497BB5353C7E7FDF0CB5175F21E Count = 51 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 -MD = E191FD7982F4880E452AC0ADF95B58600606664A7B1D560579A29E9C3AB86E1A +MD = C50953C33B1F7488942EFDC95A869B9F970B035D5A577A5021C033A476DD2EF6 Count = 52 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 -MD = 86CDAC4EB79BCEEB8BBC3C533F1E5BCCF516D053F2D5B4568A3D4344CCD6B3B9 +MD = 48E1B8BE5177370D862AB3DA1788E05DAFD8AB43C95C92BB6BF16DC869C1B1C8 Count = 53 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -MD = EDC4E8342D0BA16F289E10CF748EF159C2B1B284D49688A22DE4E69616D15D8B +MD = FB19605C2458DF57F713F5B6933A3112FC192D57BDC1A73DB46EBE59CB51D978 Count = 54 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 -MD = F3295B829B072660572CF939D8F61178504231FE909F05346AACB596FF124141 +MD = D221EE857A547E146F55095DDF3476BBE2E96A1990DC3EB83ABD3EF2563CD2AF Count = 55 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 -MD = D4271AEDF7D6CE81F1F91C271ABEF636A0FC07BE29C22C1729ADE97C3D4AB3AF +MD = 52C691E3531D77E91907D09E727A5B02E43F3D034FF9906F4D9408C560F64B94 Count = 56 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 -MD = E7D07CBCEE75BF105554463D74E6DB542588F10572E6425033EB6BBA753D4E51 +MD = 5E90C7E414E839FE99D3072D2D003B1EAED24E3DD1A876BE7997A4A63BAA533A Count = 57 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 -MD = 44535936DD81FB1AFE025E0F912EDED847A9B3B97A44F41B24EB8121B264B9ED +MD = B9E52DF1D2AF85F4215D11A51BF8F662001AD510ACE4DA21F5A4319600D84B48 Count = 58 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 -MD = 4DE41E3059A45FDD963D28C31C3C937ED01D4BCD764F7B986EA31145F11DF496 +MD = CFBDDBB5214DD1A6F03EFC20BDEA402702B0D2681E48F32E10703DE1E7470BBC Count = 59 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 -MD = 4DAB40CB068EF12189BAC027313CE1B4314527797B42598B5EE23E1E08E11C26 +MD = 0417742B4E64FD2F9082B35AF27BEBF8DE952CA9C5EEA8F9B0A7D6EAAE442769 Count = 60 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A -MD = 4C6B9EC337C2A0A177BB856DC633836945AE32942952C67ED5CB1CF108F8E472 +MD = 3C6E337A6B9BC69858F238D522B28095AEADCE6C0C13DFCC51E2577386C3BDCD Count = 61 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B -MD = 35C84460291336BD7E9FDF6B55B1BC6D169EA7AB0B9207AB59A4B1A44A1939B7 +MD = 41BA7AE8456F8FCD005E360A566F30D6C841E9525844FE06FDCAC72FB5A1AA48 Count = 62 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C -MD = 06387D0C6F8C8D482DA69DA663278AC29DCC838EE6A1276AC49EE7995CA7BD60 +MD = 9BB6353F6587B7A1B39180123B48D620D08E06D47426CF5E7F8C3C1EDF40B95B Count = 63 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D -MD = A63BA036A06C91E835D97C909CD7FCA0FAD35A06CAB5AFB1E0587973E9EF6172 +MD = D7DAFB69798AA10B7A3CC45F1CF5D58065083BF33287BB69A9EA8AD67F164A01 Count = 64 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E -MD = EF2E0775F7E027F13FC78CC098EB6FE1D56E3A8908B3DA9237FEB5D083648579 +MD = BED76DB6C70AE6A65C9A75A5E82DC70BF30A75991FEA7698E7B59437420DE94E Count = 65 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F -MD = 85739793F2A59EC254488C3931447E86E0F3C0C919899DDA1BF34B1639DFDCD8 +MD = 5502F1B3EF7B4ECBB62F07CEB0710C7B69E0500991D858759A13A377D951C739 Count = 66 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 -MD = 8044B9CF1314A75664BC4A2E28589547C50996BFDE3EC1E13104B2369DD7947F +MD = 87CB37450BBBC34EF7106DBDB698A21F0F62454957828AA8652F253EF630F90D Count = 67 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 -MD = 3633026190EA9AAB9CE19E6B21A1F9E2C06EB7AD3F64C9B152301CE91085BC27 +MD = ADC6208AA98C07552E13856B1833DAF508D4A5E0E3D4D74BC627C54287B6F7D8 Count = 68 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 -MD = 41EC4269ED8A830BEA6F8F12C65BB79A74E4887662CCEC1D9F47603BAE8B8892 +MD = 15D8A8394E2DB9FD912CD5AB825F1B4512BFEBF970EF354CAB707B72415A1FB9 Count = 69 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 -MD = 4178AD1A7F9F491EB9869CDD80F1568B6F3E67B9E0BEDEF2FA0910DEDF6A9527 +MD = 145E5BE48FE30157D79DC48041B0A55950C5A623DE2A3BD3287C2CF9A57343CD Count = 70 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 -MD = A318C5C36C5EFA9FA366D967E866BBA5ACA168F71E952475754D8732C3437B91 +MD = 53682D2E18142FA0A59A45DDEEC37C01BA5301FBD365F7E8821C483C547C95A3 Count = 71 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 -MD = A63379B683A681E0644EE96BA9794BA4EE2C313FF5C5B6A918BB55865AC41996 +MD = 788CB1A31E9B232937E286E3ACADFF3459D1294B2130EC30FFF142BA6BF78417 Count = 72 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 -MD = A9132463C3BDE36E19D6BB78FE6E0245D848481A228CCE4681374E0B5B856309 +MD = B28CB8EF4DE16679E2B8D9CE44DBA9B6291FFCC02F44CD4DE9EB9D8CE85FBB2D Count = 73 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 -MD = 3C7ABA475FFECE52991A3779E168B345207492FABA3D2517C666398A38E94B86 +MD = DF53E4A4549B96C9A62E324E1890CFC0440FBC485B9E02DF69E18DCB23C74B2E Count = 74 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 -MD = 386DA051FF7617F197E421B43ECD374BB8B373B2F4C3ACBDC4A02E18FC48E5EE +MD = 7A94EC304AF6E2D992CCDE7AB086E90F3624615086819F99F9F99658999317CF Count = 75 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 -MD = F228034B9607BB88C67F2489F9D1130EC5EE3944B34063F07A7053A5D926A0CD +MD = 4D9CA42F8B833A9C701EB4941F698E73F86FD2050941C99F37C5E8B5643CB5DE Count = 76 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A -MD = 11D5C1FB21D0FCC3B1A77A160E90AF9F6BE7E759B53C860DF19FD6A5196F879C +MD = B85727E3632F20B48427730262E4C26906D03948E85D5A3E35A82E404D93C8D4 Count = 77 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B -MD = 91E2250E632EAB6E0B763F6DC6608D53BCF22265240EBBB1B98EA89D69C6F5C7 +MD = 581C4B9014DCB0A5BE5B6F6C62F907A2E6FE19119071841224160B094C6B1AD2 Count = 78 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C -MD = 141B469073135A5E23AE26139FA2AA4EED6E6A501513B3D9A635084A3FF62714 +MD = 94CF34EF7DC5785ECCCF71A64FF8F21E0830C8C8B606229AD4F0E15937E50A5A Count = 79 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D -MD = 2FA840EF992BD22906A997FA0A98D4E8279586C947C9D679C23A6E5512E51D1E +MD = 561D41A75CB3E931B0DB686BC511F61E2E57CBE50A14719BBF3FC7FEC3BCC93E Count = 80 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E -MD = 23B66FA2EF74873D59ACAA0B1D57C90E5B4D18778CE13458D7C448DEC1E2AAFF +MD = E7AF6FE348A235BCAD016D5CA9EC52689157E538A37115A6AFD92307EB9B62D3 Count = 81 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -MD = ED255034FD75CD81F6FB7924C105F79C15B3C7813004D719369E2A80BD67CE59 +MD = 5F92284DDEC4B5926808250085FB4A21C9C16D8B9891A6A8E8FD407759096484 Count = 82 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 -MD = 4A82B15C36C75A7A46EC4870620AB59D11BAAFC53BF4FC85102F57F103E02311 +MD = EE375C59133500F78CB4EA269357797B66CE0DDA9C068B20AED85D866F31A55D Count = 83 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 -MD = 1303FA0CBF6172AC8FECD63050FDA4AC21A191853019ABE28AE272DB81DF33B3 +MD = 0E1300574082B84163EC78730AF7A51E1F19D84C28D2C9F07F2F9562D7C33A19 Count = 84 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 -MD = 3AFF4F418A1BBFD5D5F6CE3C6A63F93256131280F6708763F478B453D9FD4F5B +MD = 8DFC384C87A937887D19CE0A6E7B24B07E90831DE0C446A616941CDCE6119BEF Count = 85 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 -MD = 5F90D3C0707EFE2EB09107F36C63A44CBEBB31E7F0FB54A1E5F9D6136577DF27 +MD = 383EA542B0F80060F660570A855BFC1E9B93DFFB04E4F521EB29000B446E3A03 Count = 86 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 -MD = F588B3844BDAD7D08F258E776BD51AFB77CFB71109BBDCD1710F42E64CF91211 +MD = E00042F9CFB375BD334F4E59EF57384C6039121FDDA5120A71F4015D3B308FE3 Count = 87 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 -MD = 813AC1B8E7C520514AD6506B800FBC06EA1A6DDE2A70BF11B63AFAE4DFEC1855 +MD = 09696032E92DD9BE1AAC557E18714B5FB6A61F86FD330E9319526C3F4DFE01EE Count = 88 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -MD = 0E5A086792148C98ADFA35AA14EFF97E74A5E481429467D1FFA5ABDD303C4803 +MD = 5EEF3157467A6DE9489E6009D3879CA9744EAC956AB63281CD3DFB05F643517B Count = 89 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 -MD = DAB04BF3D2E9BB214AC627FB25210D436B9C4E3B3678A247AE35429E0ED0C6D6 +MD = AD8A3E17C56DEF39CD580768517E21F825C410245A4B5923BB1DF26EF6334588 Count = 90 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 -MD = 22DC98B55F658B43F8143A84E65AB86CB0E9EBB2E2AE31DDBD77EC21A213B6D9 +MD = 8CE574C3D3B8424C411CE21A88AD942E306B6FC15F2EBC78B71737838B93B399 Count = 91 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 -MD = E6DCFE5775709729835C48A2D56B99B2E35FDD38538F8892D6934AD7BA6FB9A0 +MD = CAD3312BA506918D9058CB0F04A9D41758043CE06246957AB6C917BA6F25C513 Count = 92 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A -MD = 0B97F7CC7733626B7062A6F4355E7680128C2EF83EC0F760CEC140E0EA8E5586 +MD = 09CB339DCEC9D00B4E15EF2D006C8E47425AAC4FBCFBD5F044B4BA918C4FD5AA Count = 93 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B -MD = 2A61EA90979AF25A7D04DAC85D34C822B277E49F8B58ED8B97E2286B3983AE37 +MD = A7E5504E2554BA6B3E403FD6FED6A0560A4418E61F1DBE8ADE2CE81139495F14 Count = 94 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C -MD = 33722E1B05B3BD7DB616B0C5190720211F55491694EF1DA7D2774BA995F7A007 +MD = 08F1ECBD7E4F75B8489705CEAC1F6582BFC199F06CFCEF423F2574D53C3B2183 Count = 95 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D -MD = 3769667136B09E5EBB45D5458E92BACEC071E4282B16B0DC1E950D5345C38754 +MD = 81B57C0FBD1F46DF5A5016DE241DC449765D1414634A2365803C3175C78A5736 Count = 96 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E -MD = C955C9CE93A0D85F5E9E3940F0AEFDEF1C523A8FFFAE1B7CA8AF5E12F3996F16 +MD = 16CAEA4ADFB80B761B6B3A9CA9863226AF41AA3A638DAF6A5F1157A987BF9BE8 Count = 97 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F -MD = 48436B0F3A56730F00923AA1C8483A28D2D8BD786539ED24CB2B870DFD2C31E6 +MD = C56423A53D62FC4C630F348120F2D1B2998BE4841365A94DC03033B7076695AD Count = 98 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 -MD = 973FF1860E8C02C210064EC7AD6063078FF0026360DD56D139C642A9F3A195B7 +MD = DA8C9E369302BD5F4F2A8462DA29722013523A3B70B80EEE540C04B1FA247A69 Count = 99 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 -MD = C35B65260E18CC496B84CB8CA05EE88A36A1EB80833042CABC1351B77706BD95 +MD = 597CBFE25AD40B5B3705A551F8FB2046CA9F62C1A2ECCDC0111C7F0CC65E7AE3 Count = 100 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 -MD = 7B1A8606FF708377BB612E0712C7E824921A8D78B9AD3258A7B400E96AA349C3 +MD = 14875799FCC882C3A8CF51C960B9E763B40ED87376C1E306C0E33D2FED7CF661 Count = 101 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 -MD = 822788B3E398340CD993A4F768D3658208E562CBFC162B7349BB8FABD4845D91 +MD = DC09D000B61ADD8E41F6BDCC7C6E5DB6C3BBBC2B9A125C239C57111FAE62537F Count = 102 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 -MD = EBC3FBE96054D2050636D0C5280246F26A8537584B0F549BCF69F723EC3898C4 +MD = FC1F1395CDF922F247E53EEC42547741CB93E2EEDAB1438C0D7B317D5746F91D Count = 103 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 -MD = CC9276CF96F12D735D2AA0F0C160F248F92517031E6DF760F54423CF34D51B34 +MD = 5C1B6AA3AB572C22303526C2C2B63E5E681A3A6125424A39ED7276AC1C17B559 Count = 104 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 -MD = D9CAE0E73EEFD04744E8AEE1601A43062452DB1DD96D6343F6A868225E8641A9 +MD = 301E43F29F494BA0DF0A961D0DC7C66005840CF40184A5E1AED74163DA83D520 Count = 105 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 -MD = FD019C8B4BFC5443C95ADB05399917329819F004106E31554C1F4C40B334EEBD +MD = EBCBCCDCEC6D8B4154EB824112455DDAE1C7EF96D001E4D2DE1970CC55A81730 Count = 106 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 -MD = 1ECA016DD9631198A57ADA5F0DA00282898469BA639C8E042A338AA7D253BEE6 +MD = C82879D54ED1C84E128756A59AAF4848B6D8B9B04BB887AB1788A918AF662B7C Count = 107 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 -MD = 2E3C1D79F4B9ECD6B89CB77F3D0C55FFD7D4D9B4CC5712497D1ABB86918C8599 +MD = 035B45CA5FF2B4A58F0685F0C67CDE2CE0ED489B8BFADD55A81B0EA85451107F Count = 108 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A -MD = 166DBD2CF7205789CCE7026811272DA6DD064ABA814AE31AFCBA6FAD20AD74B6 +MD = 84FD6F4BE9D12FA2E1E46B5F908716294B07533879C2D3BB3BC34CCF8BD7B7D4 Count = 109 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B -MD = E6C642A9E0C3AC348CC92A5C439EA84F9909294921BEC718BDFAA5CCE8122CBC +MD = 042B8AC84BF9839414394B7A1EF043BFFD80C6227DCCE21A67F8B61BCB930D96 Count = 110 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C -MD = BC25BAE924E0678958E9D96082290672B05A0888090ADB13903B25E8C3B1A717 +MD = A865EF1CC78615B81E97E3A53544C7FC50CA70B8896F40C364D1ECDBEEC778F4 Count = 111 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D -MD = 17C628D757FD991B582F9010824FD77181494CADC8AF599B09B3F858CDD20E24 +MD = 0755219421F9CFA5F66DDD76385B5505500A0B9D13372DF9B2959507C43112BC Count = 112 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E -MD = 21EE8D0790B5DEF40C310A3DE0539F8A3A54D4E659E38DE646562FB889D92985 +MD = 2E367774579A600EFB2BBE04F796F004D27D37D99C1CC814656A334CC881DE57 Count = 113 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F -MD = DD65CF70D7AE163B54444532B1B397707967528305BD3252CBA387BA564A10F3 +MD = 2D3AFCD1F7BAA07517E7C75B78EA3FC44871B4803B0E29A1C9AF1524E16DAA7A Count = 114 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 -MD = 5776F4CFBFF120960A671B74EAC3C941427C70C5F8276EAD125590BDE6114F43 +MD = 885E8FABDA8CBFB8A7F5C0EFA5CE1DC5A178638CB9FBFF400F825C60823CA3DB Count = 115 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 -MD = B77E4C7C2084CF5BDEF618A3C4710294E83551AF9202291F1FAE1C3C4740F23E +MD = 9932C14A6B1D6FB275A14959DE4B45D79744E0A9F8D645D97542BB5C45C95692 Count = 116 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 -MD = F02F9AC8A91A37B91F69700550EF09CFE41D960C2C452A6C48DC915B739EB1D8 +MD = AC8D1732A73CC2C8439AB32BE67A414983E973C7F1E4BE9DB0D20B512FBEC8C5 Count = 117 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 -MD = DFBDD86266B8E820D528476D1427EC1296E5083AA37B2AE4F47B5B73F0B08E67 +MD = 97F9EFCF520BEE3870F911BF8D3D4BDFB37F82A41402F8851C8C60AEAAB23197 Count = 118 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 -MD = E3BAD618C6E6BAE4DBB69654AA95D72944749C2F8449C73A0F7B95E7028EFA34 +MD = 6FA3F82C0BBE9750F57EDD26C4BB6CFA2A4E8DE2A87EA4B3103804DC65A1F943 Count = 119 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 -MD = 3A749C9759B3CBE01C1632D0409BC47B5BF7B01004B50CC351C04BE16F055510 +MD = 429760D1BDD4358A35DE98EF40E16BA731860B2FB0B41D73CC5C1C4B584277E4 Count = 120 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 -MD = 452224E9C9DF234E0CC9EEC3D02043276F9AC2D73C8C4E25D449355748F0D3EF +MD = 904256CCAF001E84F485969A4B0CEECD0BDBE5E8928D4C7369C2329B727949B7 Count = 121 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -MD = D86886C8D1C70F4964FE95199AFE3DB8C26EE3CD1A5914DB8D4B5AA4A42E0265 +MD = 6568B8D92AAEE2E574B0521CF4A909AD25A5B5D383652CE8701D60058FD0F1D3 Count = 122 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 -MD = 1BEC143424949A88EDD927F7787FFA7EA9473345AD8214DA0B64584A963A57E6 +MD = EE3B4C974C19998C2ABD469DCD296F23991CDCECECACEE17B5F21C35AB5FAFEC Count = 123 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 -MD = 42A0300CFACB41222AC82DEC4B5AFCEC22DA5331DA5260CD9DEB435C4466A573 +MD = 7245DC1348351A39A6F632D886823488548763A11C6CE97CF777F77666814894 Count = 124 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A -MD = D1C1E943B720EE32C8A60E381D5D41F8E641C73AAE60DA7A383CC6B6C48355C5 +MD = F27399BB7E43D2AE29962CA5BCAB507A91E9C723A271B46EFB40DBE82D61AE2A Count = 125 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B -MD = 2B026936C75662E42927E4C051D3462835BB261815DCD2017FB54953ABCBA6A5 +MD = C34E5CC3259AFBA285B0D58FBC1E8965D140B4B49C129A5D6F3D3D4CD7A80BF5 Count = 126 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C -MD = 367AFAA68F10C92A1AB2B5D802B67DBD6177404FAFE3352D9C5F24478FCC7C33 +MD = D3EA0FCCDACD5BE91CCE0143B61FAC2CD0252BB219843083B9AE121AD02638CA Count = 127 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D -MD = 028B5BE3DE8F1581FE8C2BC22180E5AD0BE132FED305DBD9928FD45F5F9B08CF +MD = E659839E442D7AAC4CCAD913D858D6F2E55C0082949703D22D25C0D8D50D37DB Count = 128 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -MD = C04113D2B31C8D53375736E0675445D891787121227C9DBD5A12DFCEF3F9DCED +MD = F06F68849223D1C653274BC9D16D074E3196F8FEAA7EE861B7CD3B6C04921918 Count = 129 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F -MD = 2E9C4316588FFF0B0DB73F33DAD88B1D401E64465E1AF747E5E94E267E7AC8A5 +MD = B982FBAEE0917952C1F070C15406BA278055AE441D3E410613C97AEB31CD8634 Count = 130 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80 -MD = AE0DB3E36A9D22CB0ABF4E6AA833999ED7EF61DDE03702B73290CADAA7CEFFF2 +MD = A9B2EA07035735A5D983E4D1AD4C3A1BAF943D051ED4B07CF0E9042A803023A1 Count = 131 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081 -MD = 99CB8AC13ED3F3899C58BE937F0868F88FB8FEE49465229B081A71CD47B1F6BF +MD = 55F13FB95B16F98073E275061FF3EE7A4B20AE9D9235EE32BC55E61133788992 Count = 132 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182 -MD = 60F20D7615D2A6E39AE187B57832D028FA4F0A19AC8913F5434AC8524A245666 +MD = 7DF9D5BCF0B310E572A109514095C0C069386A760A24F5948CEDF7C7F8AEDA4C Count = 133 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283 -MD = A6B043849F21745FC34AB193FEFE5FDE232D7FFD2944A363AA15FBE675404DD7 +MD = E937F70BF0816C13AC72FBE985B72E73F25989992B7B2956AC6887561177030A Count = 134 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384 -MD = 3FFA836D20102679AE5F5CBD33F1BD326839FF4BAD79837C2BD1101B02349EFC +MD = 1DEC433DD8D849F2ACB43D79A922D2C60D237B9BB679CE9FA263B343CA0C6604 Count = 135 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485 -MD = 3EE7583DB6BEF9A212C0FA7635012A88B62F160A5C0E6B807379E14A22354038 +MD = 8B1AEF9560B53A5D28F91CA3E50F25DA65C1CA06D652B6B2FF122FEEC3D54145 Count = 136 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586 -MD = 1DA4E7669BDC550A132950630E7DC7BD70DC601882555AD9E1B3AC4EA7497655 +MD = A627AA40B0F16EE640551B401253FB09DCE381D1CA192F77BB9BBB5EAE8DF1CE Count = 137 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 -MD = 279FB2EBCCEAA82E9D7B0B08E0AD245F564735D6FC3D4DA72B9FDB15C07A50E3 +MD = E07B5F5D89DDDFC79FA6EF1CD5B9860624A2F8AB31494B180A56EA87730555D4 Count = 138 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788 -MD = 110981CCD0ED3F39C204B3F594612B2D1B0052986D7CBF2A6384C3270B01798D +MD = 7E008F00728E94F9067805910D83741BADD4C18C11D9B2EC6F09D7D9FDAAAF9B Count = 139 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586878889 -MD = 79FF9E4047002A381F4B9070210D6BA395917E89B6B75BFD4D2017D91AD6A601 +MD = E58BB477EC530160E21FD5861C38E0B854DE5F6B8F5552FCB054D17104F5122A Count = 140 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A -MD = C146BE7A06BE818D1B9FA9B13B64B8376BC47613418D120BC22C78CE69962E3D +MD = 1C1CA6E4A873CDAA13DB8E0090D9355B1026C34311793DAC3D9D014D55606B6D Count = 141 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B -MD = 17E14BF2088C7EA7570C092CF92BF60007302126C9627C0FA0E30FC8C391D385 +MD = 767453E7FD1107E5C4E90DDD5C32BFFA387D6AEC621C75A8BE4CC7792A48EFEB Count = 142 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -MD = D7BB81522E7D6353ADC9BE99B3C0BE69BF3BC35A1D6B9CCFD596C7848A8099A6 +MD = B06492F885BF1F32FBF5D43E036233F685BCD5AB149241F1D0A64EABCDEA7E9B Count = 143 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D -MD = BCC10F4BCA89A22853A6F36F998386E8EB34E6DB4428EAA9364BC7CD9E3791D9 +MD = 611538741BE4065EEEC9FBBE8B9401C14586842A751295F6B0CEFF65A7F28A3F Count = 144 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E -MD = 76E718D29AED11C94ECFFB0EA147EF05A7DBF8D53C36156D0BC136A5432A6DAD +MD = 203F56588D14CA677A523AA1FF4D1EFAACF1435AB5DB3A3F7390659D2915AB46 Count = 145 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F -MD = C5C3C882233D091145E4512DDE75F15BFA33536A8D10C7CA7782F5530C8ACC9A +MD = 8350AD1AC96D10FCF9550497313AD6FB28D239DD95962A1CBEDEED964CA2CD88 Count = 146 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90 -MD = D05043943426A05EC881788DFA17CD3F49A563F2B77F301423AE1D88DCA3A82B +MD = FDDD2913B6A3308141F0A06B85B60C1FF128B215B70C2FB3E09EEE4C22A269A5 Count = 147 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091 -MD = B1E779D18F8B2FC88762E9EA88C2E8DD83F28A3B0A066DF75655294AADEF348F +MD = 797738BD9A62B899F382A7138269651DAA2CB4528BDA162EE7295B106870ADB0 Count = 148 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192 -MD = 25C6A61CC160893DF82516BD65C6C85B67A60AD52CE0B7F318F0CB0B5CBC50FF +MD = 92E0997A59303699425B815C4668181850CDE64B05B0C53BA062E249ABD0E0D8 Count = 149 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293 -MD = 8F486D716AE42234A29B15205D8AF53CD4773FCCE9C967837897B58B68B9592B +MD = C0EE28DDAAF402932A87D8D7788ACDB82E543947D280D31830C44224E179D5DD Count = 150 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394 -MD = DC4643AB6512E4B75CC6B60F6F7BFAD060C3FAC0C507F80A908677F6201E86D4 +MD = C5854B35A94C2FDFDC1BDDA01AB5D16AF259F9FECDE7BE81E3DDB661A2E03D98 Count = 151 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495 -MD = 1B6C50580D3BF11B1D720145BA55E523F1A4BD2FE06CB121B5F0D4C4A965722F +MD = 659450D8896A1AB1AEEFB4DCA795435528AE911E9B5A880344A176C20829B994 Count = 152 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596 -MD = 150B16F1068D4AC5FE3A5D75710618C7CB9A03FF40B6D69C09C749F276BC9582 +MD = EF8EA73BA3EBAF288BBAA44FED2B0CBCA04E47A6DA4C62F8CC8F29BE2ED23662 Count = 153 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959697 -MD = C54BD3AD7C49405E48EF715711A04E272664D0140AB6A8D65DB3B5C48581754A +MD = 33C3F0701DC7EE8EFF2E262984B641DC20AA6CCE533FC2A76F5AC3AF5112FA1B Count = 154 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798 -MD = 67B6462C4251D553A0F38C74F56401CD5E856AA838A045C29784413D030FFB12 +MD = DA378B3AB5963A82D7AAB3EFDAB6EAEB2D00794D7AB677126F9058521C4F9D7D Count = 155 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596979899 -MD = 39692DA0635C31BC97C71661E6C2731A3DC461EC14AC16CEBF0623D14A8232B9 +MD = 511FD578B4A3F076D0901342EE1E8E4E50E0AFC22F8F7204F0880CA8AF2C20C4 Count = 156 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A -MD = 21E098EE94D14E20889CA3DB6C5A1DC48C85205D226F68B3E81381EFFE269410 +MD = C7852733DC82F47D153A275F4CDEC3075363528FC45ACF53C4E655A80A49370A Count = 157 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B -MD = CABDB768D5C838E63B30C1EE5D1F04590072B30F54D4EEB116E23BB656FFFF8D +MD = BD0A391CB662D581A739923242A838A8C1DDEDDFFF179A78DDED37C42A317042 Count = 158 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C -MD = DF84EDCE7F635BF6ADF38B39EF3EE788402D75AE50A4D9A14E3920C6AEDCFB1C +MD = 112FA32A394D9E4EE01F49D144BAB0816E4277BA5B12084A67CBE2724E007F35 Count = 159 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D -MD = CEFCEFBDA15501E410992C371B46A6196687A41F78E791C38CCA459AB0F2AC96 +MD = 63E3B3CC902F3116DC48DA120D5421616BFD551D1E04F588D2E80629FA372AE2 Count = 160 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E -MD = 8881E2EDAC3C4DDD9CE198CD81E3E90FEE04FAEA32F42840BF161AED8703B13A +MD = 044926D2D03852269C0FB83FAAA021201F2EE3B9BA3FB1195B81943D9C00B5A0 Count = 161 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -MD = 5FF850A446CBA8E66FEE2B74CEA2359D68DA64B9C067FD383D145E61901DBD8B +MD = C7E53B15080C48FF744113FF434C545E828AAD7E9C6CD74DDF84657FBC2E0C44 Count = 162 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0 -MD = 12C01C2C5F7F3A40416B7C286AB875F255B6012E85A9BDD416DE084B3CF6F44C +MD = FE934364FC58EC0713FAEDE378A41125B4D6F1A4443C83B1D2B2E3C027888851 Count = 163 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1 -MD = E30EA090C6E5944FF047BAF2E3B5934A3807CBF8011F42813E244D044352E480 +MD = 1DBF40EA70DFCD66E0079C89A5803810A7D6121566B311F614D6EDF4D95ECE0C Count = 164 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2 -MD = E8C2D6A75F15D16DE6EB5D2057AF7E8DDC5A347BC090D94F176CBE4B6B25A67F +MD = D9831DBA4C4A1925A573ECD3CB24C05C1B9322C1D6341E2A9910BDCDF0A4997B Count = 165 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3 -MD = E24CEC174A75445CDADD9848BB651C11F7F836E23592A77823C58EA7F64EC900 +MD = AE47A4F70A1F717A9F8478A08019BB0F41223447B4D579C0B3EB858B319AD181 Count = 166 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4 -MD = 3AA417CEB3C7EDE71EE59DFDED2B13B419D42200E2E9F2D96762D1D50E177B86 +MD = 81021CFA3B79073496126C3B1156ECE6115419FC772A145A7AC97026D5AF2BA1 Count = 167 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5 -MD = 526A1F63013E96430B911C40A74545AED9AD63DD39EF089EE4D4105762CDB1DF +MD = BDC8DB16A02FBF28EACDD1BF1432D57B474BB99A594FC5526C2C258FA3E08F56 Count = 168 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -MD = 4F1EDB37C474BA8379F528DF8E1F6349A26F1C76FDBC6E91F00B9994923060B3 +MD = C8E8EF2B3DD513A654291A790A5AA74770F927038080980614F4278B17E31F53 Count = 169 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7 -MD = 8364C43C3ED176E2D9D006DF28C2CBF2D0A4A7B346BF2B15D33A7DB4D4D1BFC7 +MD = 122E2F05A896527E63E6A7DB2CBB366E8A819072217E86544F123DB77760C7B1 Count = 170 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 -MD = 46087FE3E03776001895E68EF2FA625AC056D5BD88FA0BC59C1782D22CED31BA +MD = A4868D9F7AC9A299E8221EEF5CE75B4DF80ED7474ED6F8B4457A18623D9C71EE Count = 171 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9 -MD = 5DEB61B2BF6C95B64A55AA804EB1D7AC8BF1F8997A20959E79235748242DE411 +MD = 1DBA9B4595A41871D7C021960DD7F80B5EDF4C4482A93ED272685AB54C37C4CB Count = 172 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA -MD = C233005AFBF8D716C9A701DC02F69C68FFF98BCA843DB27D3964664AA696E99B +MD = EBD065A7DAB3588DE2B8E4085BB77DACDB2F9090191B033CF48089E8F22820C8 Count = 173 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB -MD = D26CC6FFD893843CDAAF7A5DA82E8E5D078F9B11351E45C23613EE2082E01C6E +MD = 1ED02C4D3B304BC001CDFCCC49D2B9559690DA2FB35AB93020C8D1F8E21BED72 Count = 174 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABAC -MD = E306AE292FE02A4495E706D152A5F3C48677F61B363F4BA1715A855D9EAE9D38 +MD = C8AEE21BEDA1ED1CF2AB8213EEBAF8CE04F68CBB0E1B19924D262941A08401D9 Count = 175 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACAD -MD = A5D3E1886DBB0C6D6C77E2E4B7BDBA4DAF1EE74DD2B60E142A900EF5831E23AC +MD = 9F60B3710D8F50B5EE3E9C530A8BF95FCB19FCDC79E4AF483E3A0B0F8294F585 Count = 176 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE -MD = 125FDE456C0D546907A4A39B6D7D40A3DDB244DFEACC696D6F9920BDFEDDD940 +MD = 8E1FC12747B8EA8CB4EF9F82FDB8340C1B980A38E664E940C4B44679E458A60C Count = 177 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF -MD = DD29FDFB2D52A26FA4E5DF0BD8B35CA10E4460005CD158F59C84C86F034FEF0E +MD = D6E5898D65A0027D77C16909038C1FD787F934596CDF2A4DD5AFCED9E04B9CF6 Count = 178 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0 -MD = 3EAF4CBF9CE05168798FE195FD96AAB1582FB260648A1079A06D16591D280B3E +MD = 3F8F4E8B6EA28A9152CBB34107BE43F8D95A783855142FB6BFA207C43E032D9D Count = 179 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1 -MD = B995379A813DF622290F76573A3388F1010E41A859E7E1F6A94D6607C220DBFA +MD = 07862E9314F02DE0BB35E5D3239B547056DB156DA0A3B28BA3BC69C1ECC2B276 Count = 180 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2 -MD = 3CB77491BC6AB5BBBD0836398B23C9B48E2739C92C8535A37863B73DCC80B48E +MD = 0276F4BE07A8CE2A3AA1409C664605161AA5D840480C9AB99B2FC56502259C41 Count = 181 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 -MD = 4F8867C6DFCB04587F7AA4A4883FD65B96B321F0AD8805EE2C6DB9CBB5D9E3B1 +MD = 5C0D9BF6BB3006D14307ECC102778429110F18C4FBDE25FB18AE128A6A038C99 Count = 182 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4 -MD = 578E56A8A55EC055CC6DE83295B484D38AECED9113BAC5470BE047B070F1A490 +MD = F439E1F09AB4B6552E6B57354FB5967284C9B8922637615F3A722359B1B03B59 Count = 183 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5 -MD = 3D934401EB15AFEDB6E20902283F94689E4B5CB96E59F5974EACDDEEBD98F484 +MD = EF799CB45D7194AFA400937B06749E932DF0C5215F4D49303682988F789D3427 Count = 184 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6 -MD = 460CAF9600BFD0CA7B1B3A979904F684DC35307848769DBA67DB6A67BBD4A520 +MD = A09451EA884E07AF83469DE82E5ACE90DABB78898E18705FDA4D0FC13DF27A1F Count = 185 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7 -MD = AD17E4E658F0DDC81EDE355602469D0560716CB949626D71BE121CD82DF4EAC6 +MD = B9EB288132792CE8D54664E1D65DDFC6223AA1D75C0C6F07216676828EEDA99F Count = 186 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 -MD = BBD2BA1CB7E6522E933B9EC2F7B33856EF2B6FE25A5B75C901A415D3982CB5E0 +MD = 49D20D62DB8FECB5DC7834F85381F392C90B75BC71A85BE12563B254A9616DAD Count = 187 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9 -MD = 948BD6619F41DCB7C16C348A93CFB22E5E84A7ABCB223FD543EAEDBC60797FF0 +MD = F6D40457D82325F10C3EAA67F0FB82B30B28B43ED59A2F85F90BA127480D56A8 Count = 188 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BA -MD = DAA84BB9CE710E3513FF66EE66867C78060B52EC7EF65AE403BB4CC22DC18718 +MD = C0BE66D3F89AA20F44E2929CBDAFEFC37BBB2C9C45669E7B435677AB351B6197 Count = 189 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABB -MD = 8DE3F6A71E7CAE7837A0BEBC8337E761FF597E658F377C6625303720C6D47E66 +MD = C369B982E07527B7438467C661D0837EC00BC341893522763849606A2FA523C6 Count = 190 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC -MD = CCB7475CF64816F31B1A55C48D43DA7ADBF4BBDF5D218CB13B4F3DDDB6E624DC +MD = 6702EF732FFDE912A276B2047024D666E88CAB9C27811ABBF1A88813B19D603F Count = 191 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBD -MD = E9AAF7F4C5B3AA6C0EE0E83A7C1B1A38E6E08027C393142159622363219996E5 +MD = 16FB10AA07F459459F56CE4B315D14CFD187A9A0BD2F2D6F52C848F7A6ED88AD Count = 192 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE -MD = B64C761A32A645BFB5B7A1CA368C9BCA97049290405EED1202C1A761ADA07AE1 +MD = 5BDD413E50404EDB751A0C200128F105BEC8FEF7184A742B7C5A1C93740AD76A Count = 193 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF -MD = 0D99EA8321DD62D66EC147D74A7A0E96A9F3B1664CBC90F8E5479443C7EBF432 +MD = BB8350304685AC9A98EF2D1176E57341C0FAACD872EB6654D8805DC9A21C7B6A Count = 194 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0 -MD = 22055F52AF73F9F982E287625788769ECBD454464EBD99EB21801A4B49F20914 +MD = D550AA68CBAAE23978FE2A49B0EF974852F76C60E751A7B07882667C2FED11E2 Count = 195 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1 -MD = E3C9542B41BA6DD83FAB27035454E91D658F8FC34FCFA84A1B8AE86121D47050 +MD = C50141893A6ED7D605A7CAD4DEA4FD9845D28F1CD6B5E063F7038C2455CA5522 Count = 196 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2 -MD = 724DF20758609FADC213930C221B02307B6BF6A36B87986F6DB52DAB53DF7FF9 +MD = 0E436B20DE7248E974AE1B289FEC2BCFB564C687E2778BFA8C6EC520D810B8DC Count = 197 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3 -MD = 67AC4CE4570DDCAE56BC3349FBEC325901BD388E7218CDD0EEE089875E873558 +MD = BFFFB70A51C67AC0103955AECFB48654D078D26C9613F84A2BF618C25117D15A Count = 198 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4 -MD = F80380A0DAEE085B0CFD7E3001E25B2DBA10162E413E18AC4BDD0CE0D111E59E +MD = F473C703286F70FF299BCB571D9864D45B7B912DA52671B8890724409AC1D01C Count = 199 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5 -MD = BF8BF082F2B857AB44056B22BBA626FD3C4C67612FDD60F4C46F3881C9B1546B +MD = 50694A22E5CE22613AD27C2A06547D8D88E224AD430CCA1F418AEC14234D62F1 Count = 200 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6 -MD = 86E7AB7262EB43280FB7395B7CC87D3F865EA5649EF5722BCCBE9AC63230B64A +MD = 205DCC258164A50D3FBB6631ABC00CC4875714F348D60C4C15493F4490A13DC5 Count = 201 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -MD = 5E4A5D56987C3D33939D47CB0A514E517676C5964787B44CBAB9B2FDF8B6285C +MD = 7AEAC42446BBC0A2E06FB14289A48945A9B3D3D35E847FC975C614B83417E246 Count = 202 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 -MD = DC85C4D32F412DFB27C9BE4A2686BF8914D6DE85A3CA421D3A284EE078D2267F +MD = 8C3986F43D8E63AA328796792736A457C5F102E3D5282DC9824B6565A237731C Count = 203 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9 -MD = 7FEA3E42B32E285DB9A184B5B1074DE4E5D72417CAE8DB477E6342FAC3509A92 +MD = 08153B3B41DE962798FC565ED58E9D0CB9AEB9B132394602A0698D6651D01F6A Count = 204 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CA -MD = 4E298359934D1DF7F1BA7EB6BD8CE9D3A13C4236FDE5DDBA377B128B1BD8603A +MD = 1BF02C3159C6F1AF48E360EE944F0AA9199B8777A1EED88A06DD45578C4AF2FC Count = 205 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB -MD = 3553A45FBEE76A377F4FDFC89E600D6236AED44860713BB41D7833A6AAF0FF93 +MD = 2152A88881BEF28AE1A92A816ED47AE39126EF2CA5A2D47561620C0A290E25D4 Count = 206 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC -MD = ADA4CD489AE5DCF15175083E0EF41F738FF77F370EBC4A5FA57CEF97BF3E7238 +MD = 0A6128FC659C6D1C0CFA628A429C3DEAD55A68474C5BC536EBC1049BD5A6EB40 Count = 207 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD -MD = 5C8111F06452AB34428C80295A39B9247FFDABF9BF4A510831DE7D1D2C2231DA +MD = E1A03E385129860859EA4F8C7D9BD20D6982A8F03569DA8E10DE96A2EF296B90 Count = 208 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -MD = F38755EE7B8615BE4E06C8E9B92582A3770D275A8362671D6622BA0133B33585 +MD = CD04C305347DF90516967D6A7211C6C378A52F53842CBF1AA7014BE33F9E9941 Count = 209 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF -MD = BC360617B608606A7630E0D5402807BDEEA0721E6D3AAA7230BA470A6A9C957E +MD = 13F0A2A26AEFEEFD0B927944CE400BCDB102F07CCF4670ACA68CCDFD896DC51D Count = 210 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0 -MD = 3E91B0A0FD7C3A3D38F30F9F5912DC4930B764FF773A0C2690B1769465AE1F8B +MD = 0A00FC73415492234E6DF043003F47CCF7827A5D9D7C287F779A1D0D3876246C Count = 211 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1 -MD = 664A2D7ED9158176D2728D99C45F25135F82F30C2107627414B460EF942065E6 +MD = 7597E1FD355460311241C7C08007056DBA015EC34B115917BB197706E44C9452 Count = 212 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2 -MD = C20F80864290C6FE89D631E6B907B37277FA6138DD6DB3F2E181DA08CB38E487 +MD = 047AD8226C4FBD0F8EC3E95BBB81DBA721C581DDBFFA634BBB55EEB9B8059678 Count = 213 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3 -MD = 4050B6BA790ED053F6DB37BCC0C5BC7EB3CE6730C1CA14554317B44BDF1921BB +MD = 2157F5F7A5B25B11ED8CAB3FCEF6638105D7E93683DC6FD620CEA00BA1B254A2 Count = 214 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4 -MD = 5FCD26F03DD43AAB08507CA2CD803913C058AA4B54CEAB867EBB10B403B167FD +MD = B1E7841FEBDEB4A1A58D70D0F9A787B6841706FFFC51C51A39B5557CA299C73F Count = 215 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5 -MD = 4B8639B1912E710812F2FC2DBB80D9793293E41CEC07CF4403AA3591E9924EB5 +MD = C0971C9E8DE04B9C5E84BAD26AA24F3312032B396DA1FE97E7737DDC575E388B Count = 216 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6 -MD = 075BDD96260A0A6E4245B3FC8B00AFF63B567D75634BBB63327B56B782785FA9 +MD = 37E03D793858C0A07674153E8D3A565AA8AFB9A320560310E801C7B44BC0B4C4 Count = 217 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7 -MD = 697F1A42A5435F953E919F783F872CC59C69306CB9BFB6B22E97EA180F60882A +MD = D1DD199844D4EDB97F231979FD02B9DFEAC589DA43DB261258D11A6D1285312D Count = 218 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 -MD = 292EF522B929B52F6BF2BA52A687D58520B344FF951A329632ECEBC72B41459B +MD = DB39A4659D8AA21A13F0DCC84B570CDD749C2855A84547BC332F4EEA95FB3774 Count = 219 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9 -MD = 67CE2587A3E69C9EF9B2EC0BF4C513CEF3B1C7F6783635EF71DC74F0380FF412 +MD = A4FA9B87D745C982674E21D6F09DBF6F67B736B8A29033E7D8EC7E1EAD387DA0 Count = 220 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DA -MD = 64104D4621AAF56C90C364AB224E00723F6E9F062D0755CDD39B2A8340191733 +MD = 265DEDB61933F38C92E8A5A40F7E21CC78EB820B905F294C69F7F60EB220BD5B Count = 221 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADB -MD = D9B8B8079CB3C7B0220F04EB9BC44CFFDB34B5700161C5F9ECD7500D6E9778D6 +MD = D7110983DDEED8B318A5C2EEF552CE34D03E1FF8599EC723BBFE63E1D929FA56 Count = 222 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC -MD = 395DF6E761F4D79A645E67FB829765BD8A70EFE663D5C7DA112B978CE4164924 +MD = 8AFAD9A3539AD989634644DA4C57804F54C313690EA45D0CBA2480B064C6EBEA Count = 223 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDD -MD = 54A4D19DA2A510C302ADC9C525C8A2FA996D10A7743EAACAE2C8D7B2D51BC79A +MD = 8C7EE6220507B3D5327A6D381593C224A28E67D1B7EAAC8147B535148EA1F523 Count = 224 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE -MD = F60DD35BA86B71B0ECBBED84A76813E80C51842493EA650B9A19F85E55A37C85 +MD = 875C5BF623B36E363629301A6E455CD39A92C23E4F4C27424D96FBDD95F3DC8E Count = 225 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF -MD = 74A51859BB5EFBC5FBE6853E517AE56F9C6CF26C84D17A1CB80BE0BF647D10E4 +MD = 910420EB59D1347A7D3809B6932E316E4E0A2166A790831DFC9430CB948C3607 Count = 226 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0 -MD = CA9FCA5257C3E8E63CB96A8D6B3A19DAF34D0A2B6840B51952D99FDC839CD49A +MD = 5DDD69F9D6A02AF79AD3CEFD1FE1C65D13C2CAF4F21B977BFA56CB695F2D173B Count = 227 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1 -MD = 4650B7D45FE91B0689B0FC7725C3870D259E791E34CF33720BE9A5DA4227D335 +MD = 214342EFAE902E20241EDFCE2DF5AE47F3B286412F105F2CB57A0873151EA368 Count = 228 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2 -MD = 0E8665B3C606232AA3F417923CD3A8D132B4E11B8D65DECFC3F9D0F01A5F1335 +MD = 7C63A6EE262B26A75C92C37FD6B3B216C55F1DB685A6C07E77C368FBD64105FA Count = 229 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3 -MD = 625D5B3E7D8A022CC256C11CAB245C4D10E54C2EE3EF021CF6196818DAA378C4 +MD = 1D4CEDDB9AD650CEDA6FE6FB337C5D17E1A4B01709FC7FC283F43850AEC8EC86 Count = 230 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4 -MD = B4C1B5A1466E51D292DA514289C6218A4053F79FD500573169C619577FF4A6A2 +MD = D4FDC4B56E3131A86EC3197ABE058A403495ED7B1C7CC610A4C7CB93AD1BBADC Count = 231 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5 -MD = 9FFEF804030FC11FD93FF75C360D4A07BDE8E5B3581D98E62DCF6F4EC0E7908F +MD = C6BA81D6E70DD4B75528CEFC846524B45AD69407F0655E4F7D0FD3935829B837 Count = 232 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6 -MD = 086FF73156940FA863B033BC988320119FB19BB9B9F515BD95D7A3AD6B809500 +MD = D9A06B9A9F28A5D04435057D4C24BE3039120F65453AD39CA66A3C470AA18E41 Count = 233 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7 -MD = 9A112464CD255CC053B0622814803E4A6E20EA92724036288ACADE74FD9F16D1 +MD = DF54E839030CC6BC382595776C48273CFCB7BF5CB74937AAC275E3E6346F6E01 Count = 234 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8 -MD = 8D57BCC74A97CB05785C22C0458A0D6AE2ED4060AA62694E5C157F291D0A35FF +MD = 83FE8FA4397C2472249BB38A2453CADC28A1B9D09ED5BEEE49FDB4AFB3A32562 Count = 235 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9 -MD = CBA2CD5D432E0744BF81A0F8EF96A6BF5C5149D86548A02EBF6E5E30E8A0EC3C +MD = 2723B289C6F7DF920563C84481CBEF111971F66AE04FA702C442C91EEEEA2343 Count = 236 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EA -MD = 43331F7391983115039F603AE1AB735A8ACC20843994A38070147EDD011582C8 +MD = F900F12434422F5F5C37E0781CA7617130C712B2270DD779B9631CD199136CB8 Count = 237 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB -MD = 855718C853C76F75F851BF2F7D15124B7F9A27EA1FE99E543D1EE922B6B1C787 +MD = 30ED743FC75646A3B677D472D41BFA2C62F3CCC380CDAF48A3CC19D7FF015EB1 Count = 238 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC -MD = 1AB018F5A9987C4C42ED8436C9146F57791B8B6D814DB5CAC7386B0E6350D1DB +MD = 79D0587AD637EF5F2688C7273032B56DF4D4F68B606A2CD85BB67EC037258AB8 Count = 239 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECED -MD = 31BD9D43B23450000B3BA74AD14A6E4AE9CFC20F71587A4B38945BAC7165FBD1 +MD = 934252B6C0FEBFE88825908C9AC005999B85378C38459B14AAC07244AFB294C4 Count = 240 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE -MD = B4545D9339D6BD8EC931D47F034D8923D612ABE8507C5D64964D5DDF751BFA74 +MD = 547548BFE674F246B8CA769BE6879249729C1A614F45C41BB68018A0F851090C Count = 241 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -MD = DF3928EB6FE49589AC6A70010144DD44D6588580C687F53A939C882221E1E985 +MD = 4546C7E5DFC1791C85A9679F9D1C45F109CA5537A4F6F7547D93097CBA867BC8 Count = 242 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 -MD = E17025666B8C6D5ED7CDC4136B82C52D5E5391808B853FF2B516DF121EE0E12A +MD = 03DD990DDE96201311BFCD882CC14027BDA5E4EB772257EB31666B2E01D449FC Count = 243 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1 -MD = 4E49ABE37432F8CDD45532BCBA8C2E233DCD2C8965B8955C31894E250C0A6957 +MD = 946A03AFB7D12F817AE3E61BD44FA31B582FD04D6CF2896C8B4E4DB6B5264D6B Count = 244 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2 -MD = 6C0AAB8A4A5E5D629B7C77D48F1BFA8294A235A74CE8F1627D0B4B3666C580F7 +MD = B1C420988F4D1024787C39C6D81D16DF4FE4BCE95EC6916BF328D325235F6294 Count = 245 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3 -MD = 5178CD25275B48DBBCE51FC3CD140DC3C2DFB5E1842618943DB4C4247474B221 +MD = 8F70F7B94B1A3B2AAC3532136C0F0C64718F2C72096DCC65AD43DD2ACD7202AD Count = 246 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4 -MD = BE7FD080CA8CC7785159D2BC966065B97386B4B490022AD30EB7C5A49C1227E6 +MD = 0137ED401214621BAA722F95323B1ECCCBC90B2BA7BCC9562E95324982CB4E9C Count = 247 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5 -MD = 1A372B0A453924B05E7FEDCE8BDA52116921D02BACD93C5C9981132CE8B38341 +MD = 6369E732DF5D654F96FD1E218B02CB353FA0E241CEBA11F37838C0BC6501BC4D Count = 248 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -MD = 59B44B982C3F2F295B199DA9CCB303ED0E987C4CDE43F13FA0A154624551646A +MD = 2F15850B051A8F3B55366436353662B550CA9792D216C4E5C620EF365952291C Count = 249 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7 -MD = 93597340951EB94A897C0613F37F945BB808F9CDFF7095A6482E76BE9D16589A +MD = 627BFBE08DE29C7A1D0BB118875CB8A11B8D3C803CADC3CB2F4F11241AEBBC6A Count = 250 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8 -MD = 0ED81939BA7ABBD670D37F85142A44F3C17556B8261521119F51819A15FB09F8 +MD = C7A922FB7130CCD4CB0A7EDC8556467445AE7C8B8EA6AA79005C0487DBD6DCFD Count = 251 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9 -MD = CDE914385AA57DB66B97D442D7B78D5053BCDB3A5706E1D2562F06AB1A898971 +MD = 92EFDEB769B412AD6DBDB1B1CA505D1D940B5FFD830AF881C41885A97D7A5749 Count = 252 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FA -MD = DD748BA3A10F064462B5F15C7A5D80A4E598852BE9358D0F8ADC30C03E5E6561 +MD = F0DAAD0E1E7FBD0EE11A39FAF43CA3791BEC8328DAE000570C55559BECBE1C4F Count = 253 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB -MD = 0A8DB2730A83471216492B2873076B58E5EBEAA36F14E18C662AC4D237A2942A +MD = 44AC26CD8697BCA21A5AEA59F7908089195FC34F3244667ACF043A4578EB8E94 Count = 254 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC -MD = 5AFF6454828B4999B343E79DD2915936133447F1BCBCCD70F772DD68FF88E34B +MD = 9447CA3300FDAE0510652EFE580336F2F9F8DB8261C1199B308B780C45E6A492 Count = 255 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFD -MD = 1BEF4501AACF1B43E6A3C829585218C3759905F59F2B284AB1B2816B5A51BFB6 +MD = F459BCD359BB5722C749A77D32B137D01553ACDBF64794AF45B09A79865FB5CF Count = 256 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE -MD = E0D8329526D0338A2B0A1F2EF81337955733CEE0F2637456C71FC1E6D0C4062D +MD = DB034EA709F0310C0612F776A98B37BC2B8EA9B2045B5E5BBEF42BB9B88DADA3 Count = 257 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -MD = 22F9B014BCFA824FFAC9184B9064A9BC17AE90284A4250A735452CB47036FA17 +MD = F1EB2DF95B70BD6ECF96716DF92338E4AB26BD7BD5789F6C8FD9750F117B4C69 Count = 258 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00 -MD = 06DFC7F216C95102C2619789BBA2444B7A23C9B3B04279F96B98425ED5886DF8 +MD = D7C4BA3B6D13F5ABEBD0561605CD9813EE8E5C3AC93933A48D20F8E1C081B791 Count = 259 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001 -MD = 54FF9EA3BF0932A2A83DFD70A0CD982C95AEAE650601586A6C1C179CC06A49C5 +MD = C399511C61584381C77F227C724334902D6CADF214F6B4DD16B8B4B1B951C69B Count = 260 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102 -MD = 9F578DDD9EA1FF04571F5450865CA17AE6F22C3B3BA5D895DA6C41A7D54F19CB +MD = 1C184A636E039C72648287FFBEEF272BD1A8528926B0D79BB7A2F045BD297C00 Count = 261 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203 -MD = 169690C2C155555A56A4CB671A37F7F6448C9B5B9F14BA43E8D705634A279F93 +MD = 3028BB0D3C5DC682D40D076DB6684735DF7F68DBE55B14A60135EB61943D2C2B Count = 262 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304 -MD = AEC57D56344502B0FECA16C027BBDD7F5EE56AF859BA1501E80D0F6A20628D9F +MD = 5FCB0FFA231A9AE08790F501758A31E38DFB52751A8C549BB74953B755142688 Count = 263 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405 -MD = B7B28B407904B7B7207007CE2EC5F656CA49F4F7966773C0A243A7BADA822D99 +MD = 0E7E5D0FAE7194C20F1269954A2859FC85E5B40BEE3C498681D8A710D7E8738D Count = 264 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506 -MD = EF6842D640DC32BCB3918B9A4EE01B2964DAF7CCE5FC363C58BD4B22548D1029 +MD = 3E2B2D11E743C7334112B86E3AB050BF5A5EEEC71A6913BC93D8B2D5EC0E47E9 Count = 265 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304050607 -MD = 2667BEF2E03BF64AC98DE05E2EF154409BD147CE77FB581618DC983AF8B1F2FD +MD = 9CC64ACB7E235CD4DBD249F44B59DD423A84AFAE86760AE29E6ED5A4DB54C481 Count = 266 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708 -MD = 33F09F4B000A106D95AEB85D263E21FF0B74C18E2C2020FE5F90FE128D2B7D92 +MD = 8BEF362C8E741D05A4DB79026DFAB34D96ECF16D3BA207D6E56EE6AFFD35C5FB Count = 267 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506070809 -MD = 8ED2CFD1D4DA53AFB404E24BFAA7C706B86F8D723766D4BD0301F518AB48401B +MD = 6D45CF8C780DE681A5D87294718EE756C3428A3FEFCD8AA965E30E0AD236954E Count = 268 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A -MD = 29CB71E1700E8511196CAA46E7B27EB680DFA090FC4050CF38994BE9F738A94B +MD = 206F11951088217C7925D82DB3FBF355DAB6C39510A108A663BED87FAA8F169A Count = 269 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B -MD = D0F947D323DB90FB30AAA67F35CFAEB493409AACDDDF76224987C6B6ED160122 +MD = 28A3C23F9BA4EE1228A82236FBE3E20673F435751D5ACB21B569D6FB1E6FCB09 Count = 270 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C -MD = E1260C823A71AD8218AC893AAC50FBD02F9466192C6A112F245F15ED7190E67B +MD = 8258DEDBDE396A4CDB898FEA4D47CB97713D721224B35F84EE4616D3B618F8FF Count = 271 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D -MD = 6D225D1681B360C86417FAD12D24E45F51CE9B7B9CAAF4CEDEA39FD5603F9405 +MD = 646BC7C8109D55A6B8DC533E83ED62A0BF4EE2E1AE43BF499AC03614B9B34073 Count = 272 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E -MD = 22AC3179F2ABBA6B2CB78C6F258269A5A697BEAA573FFB26B5E74588F284D206 +MD = 676191A5CF97134B6F80D1F410C231107B3910B5661892241BB08D323BFA031C Count = 273 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F -MD = 9CCB69CA79557BC6CB556BDFF9EDF1BC34D28215F1615E4C4FB4D9E55D0A3B72 +MD = 91C7BE5D7BDEB68BBF4400B39885059D39F65E89DAC19CCF94B3A92F4A0E1B13 Count = 274 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10 -MD = 9606C6CBC02A901F8D617D80107B849616D248EFCDD81558C3F8DD0634AECF26 +MD = C2F2F6D589A03F11F8BC854A7C6448FA34522A533D8381D3A743A6CF6DAFC977 Count = 275 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011 -MD = 0BB68134D9DB58A961DA80AE6AEB286E1F06460A9D1583849A08B7134E001F33 +MD = DB5853B058BFE3C36CA5E8D14B96C505A284FF3C83CDCF9A16BB191CA6E14B5F Count = 276 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112 -MD = E4CAA93F2A6286528CDD497BD8FA569F13F6B30CC68C14CC27CF01042BE318A8 +MD = 936A9F7A08C2B83628FC69E1AE12D2540BD09F5BCB35A2EDB696CC5D43F259C1 Count = 277 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213 -MD = 86EE621BFB3973D63C9FC03AEB999B697B2379B5ACA1E20EAB29D862365DE205 +MD = CD28B2A8B9FD9B68EFED8B94CA60254B56C286D01E5D324B0A29A0DA1FFD59C8 Count = 278 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314 -MD = 46AD97E9CEA9479190C19D3AC93F04AB1E0CC0EDB3E7A09CBCD9C02D313F9AC7 +MD = 485878ECD6184B774F6D2356F6B2CADD565D11DB5EB1606B405B8C31E2F00D6F Count = 279 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415 -MD = F41098327C8D2252A82BB985D80B652F8E5AAD502E11881857BC01BDC8E48124 +MD = F20347D8AD827B2B96699A56B1864F30DF18A0A61CA61FA1642295C9C69D6582 Count = 280 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516 -MD = 99DC744CCF44609B86FC064372BAE3409FEDC8E9B254AB111AF5422547126253 +MD = E2BC0EEFBE606BDFB743DE6A683A054F2319779D081E59CA40CD9BD1C7B8818F Count = 281 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617 -MD = 4CD4530332873DCA40CAC4D65D7E43C64C5706D0E147AD0FBFF9445511C27C1A +MD = 94EB5DECB2C80D23E41C03D5B0F893575A86833624F71C80A25E84DEDE1C20A6 Count = 282 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718 -MD = 469C33597B0EC44110D5A45A4FF1BDE55AA968F76009B62B82F05AE48FE22111 +MD = D74AF993428F7CCB3288C45A6199849D8674DF6A49302EB823E4953446E32A4B Count = 283 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516171819 -MD = A10DAD21C0E120201288D11169DE47A5106A17A40F0F273FD4069159606B153A +MD = 494E65065C5553F04741A1D034824D6703CC9AD34F253C634200E96A4410D8D0 Count = 284 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A -MD = B77BC4D755B84B3581CD699280ED9F695395512C2BE027A44D0FBEBD894E8DFC +MD = 23311677C7FDA39E9091B8045B1E939A21DD6A62FAAD888AA188EDCB963B5883 Count = 285 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B -MD = 5BB6A65F86BD06DBD9E9608B916CCA1F6B4597372B57B6C9461EC5B988763748 +MD = B7F77E8F48F02003BEFDE9D717556173F826F25617DB6CDB2A6E807BD89F5DA0 Count = 286 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -MD = 725DDD5A283B398A946EB9E7F7F35E2AF5B979363B43B7085110DD0FBCC87F01 +MD = CA90EC7E3D92DF5CB1FD0AF308853CF0C8FD9103CD05B4759296AD65E92D1AC2 Count = 287 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -MD = 33844BFC7FE62B3741BC783351125605D8C1C0E2830CE474272DB017A609E45A +MD = 8084871199CAAF1B322B23B698C594CEAC1D70C5D2B90D0975BE7BE98BE2D797 Count = 288 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -MD = 02B1102F50ADB3FACB2CA9458DED3DF7FDC84BF48977594A740F9B46988269A2 +MD = 7BDADA66F08997045A0FEC0D7345AF4AB81AA23445AA8ACB9EC07C372F771D02 Count = 289 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -MD = B43DE51FFF50D864C243B176FA6BA7663BA8E428A68E3B3220FB7F832A69EC69 +MD = 31D56E083230E556831A29FAB27B7262FA10C157FB3DA030FE9572FA9E7B4199 Count = 290 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 -MD = 6C265DA5F072030A9B38E147616E19E3D5F2113597FE0BD33CA4B253C63E5C48 +MD = BCA324C3D665503E0FA7B7E01CFB4A97BD7382B49CD7108116DEF9079FA2C802 Count = 291 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 -MD = B0B832835C2DACC558982D9638176C838DA9F08FD0ADC4E5145285F96E14344C +MD = C9E2AD8DD5A8DCD011528567F7BBC8B059AB229216C449B6E0931F885804F92D Count = 292 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 -MD = 10C537CCF037E5E739AD1961863B1DA70C583E3028C72A8CFA32968EF32AA6AA +MD = FF7FC879DDA33054DFBBBA51C255772C4522C1086FD33032016253EECF6C8D22 Count = 293 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 -MD = 38D8D909268217A6CF2DF81BE268DC1A344DAF62637E7BE7AA708F41B4817A9A +MD = 89B873B7F3511429EE951B18DC99E8B194877836DE35521C7D31E2F745529B04 Count = 294 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 -MD = 563AD49BE917E99749090A702CCB7E7A74A22C24C1E6FC8C521E9F52478C8C5F +MD = D0A8BA3801AA439806BFC1AA0DE13D2B4991983F83B02320848B98EF8DEC0C31 Count = 295 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 -MD = 8BFCAADF7721F98B14E1C401E9861682795F55FE8FDEBFF7D1EB18F9E06D3CC8 +MD = 42B3953EC4EC5D0F16BCA924303B64BFB61763939986BB9758E2CF89EB9B609E Count = 296 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 -MD = 5CDBDCE937EB0839E9CB0E4CDBAB9FD4C92470188A2D6170B81F0D20C798EEF0 +MD = 587A77E972D430F7F17CE069675A4045759F1EA3BE45DEDDDA5FA4F1E3036FF8 Count = 297 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -MD = 43490A211C3090D56119775370BAA9CE096171086AA0279A234FF933996AD473 +MD = A4B0393306259CBA4F54378F7A017CAF863CB7D32FF7412DCE99A0DDE725936D Count = 298 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 -MD = 6F2A0E6B22327AEB1AE534DD0326E51D2648FA3C1863CDC1D0197040F06D86B0 +MD = 89500C25922A94B01372183A52C6F80120CE36CD25A5E7141E455471037C8B34 Count = 299 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 -MD = B54759FFB082B190AB61A2B8816879DE48BDA6B19EEFE1D938C4B11623D1F210 +MD = ACFAA915F8B526CB7080A548D59FD433BD83850D82E0110D846C940D8934746E Count = 300 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A -MD = B4E2D637EE75D9D58E9D8AC4EC64003D0561143495F3D74842548CBFC3795CAE +MD = 1D36160BBC35D5F9EF5BA7CF31DCE2B995B8BB11990393A602AF547D929715E6 Count = 301 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B -MD = 6C3A36C4059962D545F4368F36C1DC557EB97603F425ADC1416CE82BE66917E9 +MD = 5CDCD64CFA05FD9F3B29F31B3CA83FCD7F37A2ABB7B8FCCED9255EEDD7F4C053 Count = 302 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C -MD = 868C2C7E2FE134A1D91899EB5F46A2AE7437AE48B58B96ADDC01C03073B8AA78 +MD = DC182B481337582A000C88ABF5F317F2ABF9EF12CC2470C910A39A616FCFCBBD Count = 303 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D -MD = A7C4A9BF0E79D740C0EC4D4B5E4DBB3C27BD727934A16A4177539ADF2419540B +MD = 3B284159E2406004C433F097591F9C5421CF8C29E151FB141A45CD1AF2B5874D Count = 304 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -MD = ACB4D59447BD552851861D7BC7F9228A880B8850E7555D93B79520B950586435 +MD = FA002481B733EAE75A7AE83293CE6B778C8EC69597850C4240DC39A8F6B38C22 Count = 305 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F -MD = B802796FC9180739699684287B062C5C3FDDB292D9D9B93E157186E76DBDB681 +MD = 221C1B51EE7BCB123205371D8B1E9F0E5632766E52F515AF13B90E91F77A6046 Count = 306 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 -MD = 080550208686E824FA56B6CC0D52A080E29A801C0B46C6D3380094F4DB754D39 +MD = 324FAE16F25AE1DCCCD33F98B89A46ECCB287EFBB3EA0B18E8A77B3C53635402 Count = 307 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 -MD = 20EAB6231EC94487FB95F85E5E54AA210620DF407F8EFF6A32A023DFD5A0DC48 +MD = 83C8E442AB2690060B01574E4963BA53D40F317AE9308F9E03F680689980C87E Count = 308 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 -MD = F5959A51F05F74F2D143C41CFF3F25455A1347EA2354811CB2CCE40E2D8A0C71 +MD = 21DA4D1832084626D1056F8C6E843785CEE0D2F609EAFE74D740ADEC136BB15B Count = 309 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -MD = 1526F798D1530A99DDC272961A9A52F8539E30802844CE237B83461F2AB0AA5A +MD = 95F18A4142D88555A3AC7C4F2CC4D91753C35AC013394C9BD88E3212F7568C61 Count = 310 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 -MD = 7B984BFFCFEA14F1D5AF6A9136400B4DB7944FFD298734165844EF4A0114FEE1 +MD = 079EC83051DE592C251C92A5AE99737B6C7D661EEB3DA3D5A6B8E972BE7AB853 Count = 311 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 -MD = 4418E6020CCD7CD2E8EA77C767087E72EAA9CA790469E2F5B13AAB73F3D79070 +MD = 5E0E530EB05DD43768880E7042EED7E5A68E562567A620B6B6EB2CFC29E027B8 Count = 312 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 -MD = B45F2C0E3AFF4114C5FEE87D46D52F6EEC52CFEC074005D324EABE66F507181E +MD = 8406B6EB6710242C583ACBE1557FEBA3786F40AD566333AAD4DC09847A3FDBFA Count = 313 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 -MD = 0245E2D96F435256F649DD3EACC4C775E06AC5AD16A6AC39D63B0053762C36A3 +MD = B259C6026078EF6E5664A9BC3323A54C7A6EE4C7EE47C1E1BBE1AEA5DF8C5D11 Count = 314 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 -MD = 0FF358E9E9B87A6F9CD654E33BF0DBB3487199CB260B4E5E9B978C3FBEEECB03 +MD = 25659526F3A2E3B4F4885654E09452AB312AD3575B9F30D27F90AA1FFA63E9C8 Count = 315 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 -MD = 28F2F214794841DAEDC56F6ECE1C6264AAD860A8B5647DBC562FDC29556E1F54 +MD = B04BC4257D76E283E3AE6335969C6126735673FBBADC6B1D08A59A7AB00CD67F Count = 316 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A -MD = A4178A62C4516EB63B601B3E26A55E724DB732279EB48AA805B7B71EA30C672C +MD = B713852BA61B12B40FDD6B42F7005E89EB058C716C9B1B714575D0226037393F Count = 317 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B -MD = C1356CA2C5F4B96A60D151FCE0CDD6F1514C03E5FFE6D84367D3BE266A3359C5 +MD = 04582EA84B2459AEE1A85F635827BF7C48151EC70C9797979F0E06F18460EC0D Count = 318 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C -MD = 0DE020EF67D3FF4CD45F1C1CD5DB8795448DD4894F0EFEDE7907D19E263D1AC6 +MD = 66CEDD4F30E78597E85602EC2ECD5690D9AF3675522D42EF82DF9BDE71384EE1 Count = 319 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D -MD = C3768BE46DF04755372E89A976199BDCC5477CE0B0B7E9EF16140BCC9CE25BD9 +MD = D790C2C12F6ED6EFE68D8B43C428E66D7079203E609FA90F7E0AC475A541FCBD Count = 320 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E -MD = 23EB97A7152323E12206AF117A1F5E54D498D90A57DF220B7B0E54A9E314E4F2 +MD = D158900F25F10B45331AD95DCDAE3AC7C3F3109B0225720C3E2B24FB634064F9 Count = 321 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F -MD = 1F41A31995012822DB43CE1F194E6ED7DC9301F5CEFCE57DCB1E023D9B7D2E41 +MD = 385F2C3BF3B26AFD2A03D5BEBFBE451F2DD8AA4FAA32BAC383DDDE420B745018 Count = 322 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 -MD = 3AC84D7C0476A20B1645C753B25BE86E7A2D85F453F01814425C4DFDB64AAE34 +MD = FC21F02BB91A210EC7FF737277C1B70AFCE87C65A066D60606E63B2214489534 Count = 323 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 -MD = 29D5FE3EAF6EF79A050ADA678CEB8DF2640B59A6FF8E4F18352AA27E22D7FCAB +MD = 6816F3F1901F6913A8B33220390823150C61DCFB96D2E39BF13B2F0C059A7D26 Count = 324 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 -MD = 0DE593A55C7C029382D5C8699BBACEE8E079C89F8E3E710DBFCF0ABAD55FEF27 +MD = 5019FDD4BF3FE7CA521F39FFA9F8CC08278BFF14D23CE8120B9681663B948339 Count = 325 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 -MD = A05237F775007EF247A48611C99AD3B13C623ED5CB9BC20F3C9A79880B1AD7EC +MD = 24EBD520FABB9E509747AA7875DA0BE938D227DD1C2ECC43115CC1A696E8DC17 Count = 326 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 -MD = BDB2721C987D6DC6B2BE5A97F2654F182570E9DC99917FDBB3617EDBF88B5EF4 +MD = 6D8C098D6A0B7E7193AF298E46C05CBAC51727F46674E66F6F3D0FA026634EFD Count = 327 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 -MD = EA13CBEB28C406804E4F9BDF83844C52D131C43DA54F6BA18D37BC7DDDC7CE10 +MD = 72543FA26CAE288A18F76D32688D19602E9D3580493DFA5D7D8A8393D8F0DC9F Count = 328 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 -MD = 0D645429386A50D82CBDD820D5D4E45432415AD91D1CE329AB4102BD37C09D54 +MD = D61A5DEE5643F905F84D80B73ECD6910EB42FABC3DA678127C8359C3796F72AC Count = 329 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 -MD = 79DA04E782EF2A4D35793EC759BD8A0816D87D0DBA88D1F3CB7234B563610181 +MD = 83E61B13B0164AE92E65EC3627C0DC4E41A799FBB23A7DAE93AABD6AA790B1E1 Count = 330 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 -MD = D67B180EBD4D7098588D81DEACA54CFF1AA912AE02B0F130B5B1C16F00082A34 +MD = DAF3B1564C305ABD428C620F7C7027B720AA8DD88A9AD8D89DA5E0B7E0530735 Count = 331 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 -MD = 00850B9FB581EBD32A6212860E56453FCFA31F8157C18009AA1A3DACF7C9185A +MD = 549C184687762DA8B12E029405BB0DFCE0F5A85289195E705EDD85921C44FC1C Count = 332 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A -MD = 4FCAB42DEFA8FDBC7291B871481A351F375DB80C31B6559967B7001BDABBF8E9 +MD = 4DF92138CEFD866E14DF929452D512B1D051A99063013F12A5EC9771BC9B0228 Count = 333 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B -MD = C038D063FEDE536141A59ACCCC5B3252EABA2DBE8FE6965FB14528D73DF628EC +MD = 8B8E04EFDB6779C3A27566E42A6239AE7C406ED35CD7CACE83C8CBCD4D431708 Count = 334 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C -MD = 5FF9EA19875E3990DCE721A92AD2DA0802CBB70E5C5E99178C1169415AA0C9AA +MD = 3340AE82F160F4CCE94DC1B3098F6651F01ADBDD1003755491F946AA3FCFE048 Count = 335 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D -MD = 417E3A81DFE1D5D67181465639D49EC0EFFD0A5C87A2BE2B55487F8C12F068A8 +MD = C676B8FD032D11D159117D253E82627323C642CDCF3055C31B643C62FBBB0AA7 Count = 336 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E -MD = 6B9B5820410F5DBFB393F04DCA59E6EAE05129B10EA9E8E6CA6F6EBFAE16EF32 +MD = 8AB7348738871C294BB1F56B29D213E989FCAF94AFB9DF4E4D9BFE5D2B65A9DF Count = 337 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -MD = 8B64217E0671E4C18814D19867CF635C810250B131045E5F1BBFB57CDE941B4F +MD = CF83A7B5C5A7C0C30F381DAEA95B38D595272A62EB730E534F6801DF6B1BBFC9 Count = 338 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 -MD = 8461073C77245E5F1C069BE24A8C78653974DAD80AA03BE9B501913839076E98 +MD = DD20F719AFC08B61914E6D12D9C0D2F46F5663A7BB1AC5009B4F9D6F90601D2B Count = 339 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 -MD = 619EC3A9670FA8B769291D749E8EF61416E5B75E937F05EF276F314CD61AB60A +MD = 3D6347B052009026EDAEE6160F6CB22CE09DA545C09079AAB69367A67E404AFC Count = 340 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 -MD = 405CEA1E90CEDA7903CD6ECB989C960E4FF6010813BAF375307D3E044AB8D24A +MD = B0E6524811982577A009EBAB0CC970B726093CB01D1B8AEC36B0084E21291111 Count = 341 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 -MD = 08B761EBBA9113B914235E65AE90EAA7FAA29F7210FB432603770EF0372BCC5D +MD = FF9BF10F740D4755788E2E4FCAEE9214ACB9FC54B9B4B09770D9DAC090E1BC49 Count = 342 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 -MD = BDF197EDDFE1E6B36E8FB3BEE54277316EAF72C6BEAC1D12E6ADCEBF5758331C +MD = 6E4506520750A63AA705BBC2B6EAF4828BE93253A7C1E703FD1C2F11A5E3E9EF Count = 343 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 -MD = D6DAFE6752B4B01611A1F21DA7E466B0DE4C434E87BE35846ABACDD74BB0995C +MD = DC84E90FF48370858FA857DF1ECE87643613C0A090F2821292B74866657EC284 Count = 344 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -MD = 2DB0099B85BCF33FCDD87AAA65E20FEC36D926D9637A3FE623C5F897296FE58E +MD = 92D827A5BB7249E6B1DAD186FE6EF779D30E35D7C5F63D07BCFDB553B760965D Count = 345 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 -MD = 4E868EF3F52C9CA25AA2EC3FC7F9B5DE89C66D6FA2D918C271DC2ACDF9BE5CA9 +MD = 1A9BA73C0E0C275D879EACDC067DC504B194B96F7F58F78E1145CFFC4D0A858E Count = 346 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 -MD = 8EEC864046AABFA695FA23C97FC25C472AF3F66D3FD508CBBC917586C191492C +MD = 380436153E02D8D4AAB8EC7261688EEA5C7E177750AC004AFAAC6571B9D11967 Count = 347 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 -MD = D7737EDEEBBFAA4635D2AE21DCDFADB4F3078453D8A8F2E6469E5B0C515F0F01 +MD = C94197098E542B20B9A32CC541AFEED82DD13AEF8C6E43E7F6E20971BB9F7E59 Count = 348 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A -MD = B6DE3B5A5CF80E8457FD38965887BCD67B96930C443C30DD113BCDADC9B7889E +MD = 620AB4E38C3A89AE773E2047BD6FA5CDC05B0E943DDFC6F8CA3C7DFC9F6ACDB9 Count = 349 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B -MD = 9D6B5312B9F5E1DE689E5E49B1CB6B8A66BFD1B299ADFF4E064488FF94994C41 +MD = EEDF58D3CED551CFA4B10E7326698F44B7EEE1B22EAE39E9848B1586C64371B0 Count = 350 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C -MD = 6F8595A2DB897E9E313FC41974AE71AE9420F242FF8A159D771F7C6840E1345A +MD = B4B4B4E378C07984307FE07BF9ABEA9A759D279C3662F3927212865BA66E02AB Count = 351 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D -MD = CACB31499C5583AB851589CD27892CB3002898A598C34A98FA2DA7D3EDE90ED0 +MD = 95C7E92A9CC33CBDE805CC0975C456BECF0168A6BDA12422643474475F9F9F60 Count = 352 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E -MD = C889F4C57E6E0ED91BD07EEE1AF47DA7612C87C77CAE78925E53E6AF6B244870 +MD = 170ABFB06652ABC8D1CFF969AD8384B0C59AFADCD6DEB303754D9983AFCE73F8 Count = 353 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F -MD = 3C128368CEB7812FBF48EC77247C379B6C87C2F8330D7484E5B35E80A1FF2888 +MD = CD9DA39B5B49ACC8922C19B3390F8AAEFD72E4821036C8034769C63DDF165BDB Count = 354 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 -MD = 50B6BB0E8DD39C50B7660C59E1A2470EA0325FF46998DDF96D15184EF1356FF7 +MD = 3092418D1E6815BF11F0E977F384AC75A9E95AC2EEF33F0ADBCAC1EC3153E52D Count = 355 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 -MD = A6C6340A074DB1450DE1CEBF5FE00BA7CC280539B60AD3170DAAC7408C00D3AB +MD = 08060D8DC52A300F27BF7220DA5E379044780BE20C49DCD21D3B588536C89636 Count = 356 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 -MD = CDFD4FA20986C8DD9726DA364BBC0CF330B0BC3954F281ED578E8D067E5290AF +MD = F76C4A6E73ACC3EC54967D53A275AD05E24E05B360F72FB6C7D473B3E7C19407 Count = 357 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 -MD = F6E5A184AEAC9B784F0B9A9BA6C964CCCFB65E441AF8DC5181B2AB155A747AED +MD = B7E157E6D270D48CBA6A12C2B1E105A1B7400D93985613349B12651FBCCB0A62 Count = 358 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 -MD = C9DA06F64C8E5994B633BC4C496BD7C46A3E475D069B088C936E584B20438EBC +MD = B0E4C66B595DD94EB481B2C8025EC99BDC73703417AD2BCD402EEAB4C2F948C5 Count = 359 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 -MD = C3A690FAE2637CFD9E6586B74641D3BB55A7101266EA7BFD2B8AF1F0C268336B +MD = 02FE0894C8DCFD02ED78A04439C3506A2548D37657D85ADF78428A8CF2F87730 Count = 360 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 -MD = E3B0884298BC69A0857607773BEB80B24F0DA3D22CE0A1CFBD4F8BEBC171B89E +MD = CDA7280463B39E489CC7B34404E857CA9D3B38286D2A525D381FE67F56BA27D7 Count = 361 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 -MD = 1AD548C17E6066C3792543C91C5C60D5719BB4B029274B6D8C7EE6CDCF0B773D +MD = 73677C9CCD89BAB2C5ADECB5A896B5D3D10A8F45BF57B9663919CC64F683A466 Count = 362 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 -MD = A41AD21E33816DB256016728C18FB3635E049C432BA7AD340631ECACFABE8FCD +MD = E392BF085A9E610C08E23C34FF7AB779BAC30A9AF00014E0A645C89ECEFE808B Count = 363 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 -MD = 80C2ABB13BB156366F66B9B90016AD7ABE52783E4B43912EB377737C40426B92 +MD = 3A594A7E6D4096B7E3CDF0166518CB3A084CA671BA8A5D5BCEC72E7B78DF9EEC Count = 364 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A -MD = CD76F6A1A882217140B68E155FCEFC200D5BE59CA63FD74A2A6A71A7FAA4FBB4 +MD = 020A72CE3EA0AA02AF12F7E18138E73FA770A14D2B052356AC02BFC2DAB9C21D Count = 365 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B -MD = E3F90EBC5EBDDD0690070D9F2A64D8FD7A4BF2F189FD7AD2F04E9C77D689D900 +MD = 3AF7AACD2BE697D1363FAE91E966ED3C9D6C4F13E07AC4337443FA79AB1E479E Count = 366 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C -MD = 70A8D5AC52A2023A399B638AE7E659AFB04D53B02BE8E3B182986D5F8F53229B +MD = 734A1F96D1DF98C4772BB595BEDFB0221D0867A078BDBF25D51D021CE30698F9 Count = 367 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D -MD = E3B21E71D6AFA14A1EFB39F7367FF36750573CC9F7A83D250AF74134660FCA9A +MD = ECAF572376292D5ED5476BB2D0030950597B874FE31DF870574352C7E2F11783 Count = 368 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E -MD = 10EE102B4AFD1653756BE8AFAC4D6EBB0F5E5C6DA40166CFD5375124C6A48476 +MD = A911DCFE6700B45441A5D467A5C26FD94FCE5B2CC6EBFDDF557D316849AC9BD6 Count = 369 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F -MD = 6FF899453C45B2AD739386C1EC38AA846999C50E370A9EB86971C9A75BDE6FCC +MD = DCDAE96BAFF3738F6DB69DF039EC7C2573B9CDE9B61EB3CE79C43D7BAEEC39A8 Count = 370 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 -MD = D3FC13ACD686D573FC1CF4190DC5F4AD2C6E7D611A50571BAC3BCA0FEFD463DD +MD = 69A127BD10581B7BA3771F14ADCB247872159DEAA48175E29E677C699C7F1255 Count = 371 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 -MD = 18C46B3A9A43F110682DBB9BDED7369F52762F3694BE7A43CC4E7A1979930780 +MD = E02B0BF38EFB22AA1BDBB3B75CCC9471F4752CA5E621071048E6399B0CB1F6C8 Count = 372 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 -MD = F3B5AA5E3F5DC2444F11A4B1F87ADB43A3B26C7E76928CB4D189C04810AC80E8 +MD = AD4BB411D7EBBF4120420AFCA6E4CB5009CE5C2D7480C8333EBE7CD0A3583690 Count = 373 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 -MD = 32C636C82B96465A3DEBB1ACD8F2ABFC5200BEBB22F8FA716B51362C57D724D8 +MD = BDD8E8D013519D890232C7F1185EF19DFE169D0F083956FB6F015547E4105FCE Count = 374 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 -MD = 2901252AF8A4111EBF97EFFD1567BF0C7EA6A2AE0860D7CB0BD89E8A4F4E2EB8 +MD = 92F87B47D0D3C9C12D14F4C8DBBB07890F2AB32E939EE27A94BE6A8B4B36A58F Count = 375 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 -MD = 31B488E85F6410024DDC95DB7EB5D678AAACB5388F3393AD537B53B48A9EA93F +MD = BDB2A0ACABEC2CB06298568C9F275DA9FF75CF370EAFC2BB7D3D72419A0B83A7 Count = 376 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 -MD = 0AA010844681C0CE33967793E64B2497300566C5713771C80010405F92F27036 +MD = 592DBB421E2285C17983D794FF2AD4A32D664F9A11FA6D19D50593627302E954 Count = 377 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -MD = 45654671BCEF1AC53E690A5AF31CE36B021FBE3BFC35FEFADCEE9507FC13441B +MD = A54A90F1AA20FA18ECD3BBDF427A81C3E9D0AC110F8F5F417ABDA7CD4951A8E6 Count = 378 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 -MD = 971CF146615B75C62A3B0B13EC58C58694F2FC388AA161622CCACF67DD197DD9 +MD = A9964276977F2BFF1E52875B2562A2CE0CB8BDB11FFD3A72D16E192B5AE4FE14 Count = 379 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 -MD = 5843CE7A97E5906F1FC092D1929EC81BDECBF1C4925CFB0F5F925C44960E211D +MD = 35980A3C5B332D1E9AE0E682633E5F9BE618B10029E409BC28F3857C8A7E47BC Count = 380 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A -MD = B2B9E3810E946568EB5FE497CD9F0B5ED29A5EBEDFBC06D6527697FE7A24B419 +MD = F502CD9F807B864BCA4FC931AA3F452914EA9DB2780F0770E4671E83D2197F73 Count = 381 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B -MD = 10EC2B1D96E4FBE8FF48B44CB31C3507179BEF8B96624573B135F78F0311ED88 +MD = DADD4335F9D893168CDDF468E497B88390ADB8AAC2A14B7FE6F5B606A2C5B8BD Count = 382 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C -MD = 76DFC0BC45BEBDE3AA412106A48876180F212B5991CB322D4777C4F828F56B79 +MD = 60D322EE40FC45E7BD7F7820D27FF0F65FF504F9D4BB7568B1CF470A3D1709FC Count = 383 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D -MD = B168EC9F7B5D4E9151881B2D8B2A92D7036C125283BFBA0759BF969415F27486 +MD = 5E5DCE2498E19820E70E60F4A690209DB38722FFDDC541CC04511F9D5EEBB821 Count = 384 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -MD = 39220777D79E5116137970CA5F706048B042724037EDEDA019479E30EB2293EC +MD = 1CE3D9F38235DC301A74600F4A230C37F084B84C3BEE2CF68C8FDD8B63240EA4 Count = 385 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F -MD = EC5708CB226A5AEE50C9BE08C51F53B9CF8446CEE21E3C1299BC7C476DE86CF6 +MD = 7BA97240C1431B6516D6908C1D89D798635EBA5E9AC6A6DA9BFC02DBFA520D75 Count = 386 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80 -MD = 668A6DC412CEB8086D2D30A7C819C54D7929A8AD7A4CE169334E21BE593283B1 +MD = BCBE16D094552D9CD4E9D44B59AC79D8B77D4AEBF392C2489DAC475BD8097535 Count = 387 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081 -MD = B4FBDD136497D341E1ADA35D6F8ED7F66E5790732E82A0C1F3876F3BB1119F86 +MD = FEEA852FE5D663CC230DC40BAD6C59F482B8ABE0252867B524265636B5C65A44 Count = 388 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182 -MD = 4B5FE0E1F0E3C530C90F9A87858DA53E7533965A4FF6B8F0F6DDD2FD1803529E +MD = 28C17696980D57991188B8EE966E6630FA9A9D66783B167CD22D6587B580CB2F Count = 389 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283 -MD = F35C5F4932CA5AB3DF74A2D2CB8D7E792F5D7CB986BC24FDF346F86CCB4F1D17 +MD = EAF8590F5C26335E3017FE22409443AF1A34EC2B5E7F01CCAA6A7EFAF3471138 Count = 390 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384 -MD = 464401A0819D008F2BAA6E80DE4AB4BF13D425A1E41C2582D18EBE067B0EBC08 +MD = 4F90D3DA0AD1AEFEE0A9F94BB4BF96AE93A79F6CCCEE78D594B25C2C1E00514A Count = 391 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485 -MD = C80FD1F08FDED9E98B35AD9F3129CCE95FDBE0AF508525AC137717D393D3BF04 +MD = 076D3320D5B63F92C65E3897482C5997417A38AC118F1484EA5A426147EAAC22 Count = 392 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586 -MD = B218F969509BA75CF98AE165ADF0188E3008D62DC464BE52D15F1C1BCEEDF015 +MD = 3D1C9C88052EAA04BB5A6D39B651A09ACFB57EE6E10FF3B61F17DBB326ACBD29 Count = 393 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 -MD = A4F934C718D24572A193339E16881D48314C66EE9EDD31938A44197C112EEA87 +MD = BF582B427A5FF41CE9AA217E26B4D9D230E81B1CE0E4CD1F00387CC0BA7DB907 Count = 394 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788 -MD = 25F70087E5138830F53B91A191202FC45E1842EC95B3126E88ABC0644255400A +MD = D96D943A294319D129849718922BFE910B026B751CA5569B2A1813C1292FE493 Count = 395 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586878889 -MD = 47BC9B402F408F457FE4246280671ED5981B5857218ADBF178BC64F22567A26C +MD = 519BB1E1A875D65760C0D3B72A4FA48F38B9F1065B5D2C8453E2A78C19CD5C6B Count = 396 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A -MD = D5CD91FDC8DE9C50A2EBF101C38BA911A5521FA6D70B289A41A076F608FD6047 +MD = 8D70FC343A9AD9A2FC2A3684DBDFF12EB991C8DAEE4E0C638C71427E3180C38C Count = 397 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B -MD = F8505F60C778288F49640F1A184C9789683405E6F9ECE26933DDE83872931601 +MD = 2C5DB82F4FD3677E16FF42C4EAF11BAD128BF3210384A18C7D6773C7BF968898 Count = 398 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -MD = E647F4D876455190EA18020197A661638C80E051940BEE6A6C73F6F26B29614A +MD = F182B40A9E555B0D478AB0BB0AB235630D5193E3649EE32C145B9152856A3741 Count = 399 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D -MD = B8185A9EC484BC051D57A43A52762652F8DA3FD8B99A5F98D256F7F5E6273F6C +MD = 49A98996023F9CA312233F5C5D29C3D3FDE6AC544625444ED6C28F25CD7EC1B4 Count = 400 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E -MD = CBFCC5C85ABAC5E85D0AFC9323B3F73D246E0EFA5E90484631417A344A3F53D5 +MD = 15D677A6F84657F2A0AFD46756866B1FA293C1911EE2E3B842A68966B7AFCD7E Count = 401 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F -MD = D3DCC84879860948BC2FD416CCCD8EF051336B96B220A05DE4B79B0EE5D56AE9 +MD = 1B096C1C7B1C5DE328C39C0721DA2E47B1129F984E922DE503B7EB91C7A139E4 Count = 402 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90 -MD = 677D5EABE8B0948C2486E1CF2919E7DB0CA853DEAD6B392DBB55C4CCEFD26E40 +MD = DA394772F419B0A93C9B5F1AE45940E6FCC3C0DC82CCAD427047D039C870BF25 Count = 403 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091 -MD = 345ED4E54BA8EC56DC55F056F9EE4F59E4969C9F7F6B0F9E0DD252E38D6570D5 +MD = 62535C72EC74DCE94289EEF837FE6548ADB453F65E508FE0A7A976045BC2BDCF Count = 404 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192 -MD = 28B899083E47D0F666DC0358FD70F7B8497D77D86C1849B9A529D547942645CC +MD = C9EEA756A56EEE06B74188FFC87DE0307EA9307498E8A4D1E49E69D521DB6DD1 Count = 405 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293 -MD = E0FE481A065CCC694EBC5C5B89EE11FFA8636B090B3CC2CFCB031D0F0F1289AA +MD = BB5559C0D70D08B053C7DAADF88075A126C309BFD4E70AC142F7F9882AFBCE61 Count = 406 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394 -MD = 7E66402ED2AB248D2CE3AE043002CE362BB6890E2FD876C5DE535996BA088432 +MD = C3C26B9F0E84A7532A745FCC16DD06CBAB03EA87BF8DBD5D3300FD3221BA1D60 Count = 407 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495 -MD = 451A295B955D691E4A15E647653BC60261B5F28F91FF37BEF45E2C298BBA6654 +MD = 1FD3EBFF6071BC69D2EF0E35F5D31B318C15A05AF6BCC210C52AC5EE1050F96B Count = 408 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596 -MD = F3AF944F59F5403143DFE11828A11EB94EF1D59E8C6292F8C7FD0FEBDA4AD013 +MD = 9FAE05B0D814CB127E8D0C5F2E28C2F0A45CE6BAE343249F399F68E85B54B717 Count = 409 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959697 -MD = 86B9EC195CF60D03140D4A3008AFAFBAA131A658462504E1D8A011765C3EE852 +MD = E5153E4C36D7618F95F533A964E7AC2B8A7B6FA1E0F32C2EE57FA585BBEA69AB Count = 410 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798 -MD = 39FAFF08696668DD0952843FA97B19B4ECDA8A15C4138182FE2AC4E64A72479A +MD = 4980D118676AE679B7B866B91EDC6B366718B2AE472249B6962108CA85504D22 Count = 411 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596979899 -MD = EC782ADE684A2FAF9FBF78DB87AA08A408F9C954644AD8CE068407462469FC3E +MD = 704CFB715303A85F7F9A0EFBFC4A817E3C1FA1EB813A890FC5D97641DB09587C Count = 412 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A -MD = 919A6248225D594993AF2D1E1B30E78ED7F00467BD0D63E6823FC20C1A844AAE +MD = 2FE1A1A8412603EDFE6DF4B8F509BFF59E096AC540DF620B52AB4DEE37A64835 Count = 413 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B -MD = 4BD996C52536CB374A92C1F8D3CB36F6518571EDEF76002343A52B8CC8CFFEFF +MD = 1750CD3089981B71FBA007342A4C4EAC2AD718815853C8DDE72702DE9D6C7F2F Count = 414 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C -MD = 2B8C63DA5D436CE4B8AA7EA631C77F80EE21D1091ABB1C9C8DC1346A4569F561 +MD = 7F008BAA4DE4980289CEB46F684E73B71E6B0D4DB6F6B1DD3184998A7F7DB434 Count = 415 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D -MD = D0BE017D8F38A114B362F802B860AA205EE6BFE7E4A2BF55FCD72B64648B244A +MD = 4040DFBAB7CCE6410A992176FF724A97146966C90CDA17162D72CDE208BABD5F Count = 416 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E -MD = 636331D7B681E9C320AE3DF4FC9C1DE4AFE3CAEECDD008AF61688F8B83E278DE +MD = 5C36F465E94F43E9DA714039EEF3E979D856EE4D16E8FA2A0B7263538CE02AB4 Count = 417 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -MD = B34A3686B72632584C6EC11BC920EC5798460115FFFB610F4D573A2D01430DAF +MD = 1940B0956634A6FFCD4F31DC65F9731F79AA05ED1F179D9050891EA6FA1BA3CE Count = 418 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0 -MD = 8C4E848BC44AD47239F616B24C9258EC7CBC46EE15518738C6794713E7E97798 +MD = 30CD136554A8055CBE8F678BFC558455292561CF46174E17A78351FEDA4C5B0B Count = 419 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1 -MD = F1772A3DE73892314C866ED3D9A1F132501E94BBA1F6F4D67FA7D5CDFCF7DF39 +MD = F0B5273BF53473E3F1D9C7A0B5526938E295EFE2B0599D29133A5767ADBDBE3D Count = 420 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2 -MD = 9935F63E6B04DFCFF01159B624B6C1BCB57BB6D3B0BC7FC0600392CB5A19E99D +MD = 96447DC2B30350660C5CD7822AF4E87D1443A22836EF35D76B43E0FB473396AC Count = 421 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3 -MD = D1718452298E627111C24524170126F5B3C484FE183292AF0B32BFDC9EA30B42 +MD = 113AC6A81ECB094B7B4425A818688F7B68FD29F189096AEFCF6E99A46AE9FE00 Count = 422 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4 -MD = EAB27905A7E160132D2BE71B4ED5DFD7D71C071CB6A7992921F8D545ED8FE619 +MD = 730E8127A1F03C830AA50D7825E7E1EF1CF6DE492C7342F6F9502AD93C5DE340 Count = 423 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5 -MD = 39D1C22D2B2BFF202B1673EF9322A1521637F755E38FEDB72488234D47487FF7 +MD = C296973E0D04E45A6E19A6BA0FDDB34C8A0603A1802F04A9749075DDD55DE9D6 Count = 424 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -MD = 6526084435A03BFC5DCDB08B6D480E910F4F0BE85D765475C71662CC75625825 +MD = EB507A81DD794224B6235DE09525E22080FD704905B873813B100EA71EB693B7 Count = 425 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7 -MD = B0EA2B53288F7CEDFC631704F5EC40721061D6334E762F64D1C195E4A6D5A50E +MD = 0336C803C209B8A5273DB57BF470C5BE4635CDDD722369792BCECC31CC5FF280 Count = 426 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 -MD = EA340856830F34B2462B99623D40672D1191F1B598A7995AEF92AC769EBA5520 +MD = 0B11D0EAE437F0FEA93DF389D8FB96A97B140401AC15399F30120974E6FEE9C7 Count = 427 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9 -MD = 056A048F1DFE196B74478DA3F1CCDC56B72BC79D2CC601DFD2682E9C67FE136C +MD = 2CB2C9D9C3E4085B8EC3C175C901CF883C8BBC9697484947C31B05D8C8876F7E Count = 428 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA -MD = 9F928DEEFC959343681ADAA77D6BD8109E357ECEBACDDAFFD02A1AF499A060C9 +MD = 036CE7A72854BFBF7412F792A8E03E1BEFF696C657A8937DFBE108C53245585C Count = 429 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB -MD = E84EBF4B016A548D90CC381F101E8CA13689AF2707B1A19698CA04F9B8B16B95 +MD = AD2748976DEE27BDEDCD1DB1AC75677666344328BADC642196371984A35C4330 Count = 430 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABAC -MD = 01109D19FC943D6AF40CDC6A9806DFDB7269156DE50BB880F1A277A838A86008 +MD = B298EDBC06600F509DC7F2281DD3C6C2FDE8B65CB210A831CB85EAEC4087C811 Count = 431 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACAD -MD = 9BD2C11D457CA43F040C99639B42C26DA9766D5585F9E87D9B979542F2AE6534 +MD = 22AB56E4818D49C1B6D7A05BE90E3E796A5AB9F64A573F0AFECAC0F0F0B7C939 Count = 432 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE -MD = 2D246459F326E925CAC5133F5CFC386AAE3D459A90B810C3B7091F11904FA25C +MD = 6F6BD9488D9643D4B82A3F32BDB7F51FBC654EE5ED714DC7A493103395E09856 Count = 433 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF -MD = 74076C01D3D1E1D79CEDD1C82112FDC10A8039089C033650CDC9A82B6D9B6047 +MD = B7369F525BD51EBA286B50DC1317A5DD323709DE4DCF71A220878DCBADB63147 Count = 434 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0 -MD = 419A83F49327959B2C18C0B5040C0DFFA6930E2F00DD539CF372F386648CEF92 +MD = EAD1D4BE3DB08CE36374CAC5698D3F859F041BF70B3A5720D63725CBC0C862B6 Count = 435 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1 -MD = 1DF993F357AEEA909496F9C6D9D27CF26BF3EE7B4C7300FD1E1D17AAECC99243 +MD = 0C0B599753222BBD03B00B4EE01650B3021878099719EB86EA2AFBD84A94BC91 Count = 436 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2 -MD = 7F6419BF27BEFAA541EAF1BAF7AA37E96683591B5F62A1085298371843525B92 +MD = AFABCF11590E074BA7148A33636DEE40F686FBA00FEF07BF64F60D8B0C7C1EA2 Count = 437 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 -MD = 9B994711968FBA3C95584617A1BFBA3B1E13FC9FB87C113FFA2502C988BC9D54 +MD = EA9FFA4E1A8092160C515DE9B38B545D3D4DDABB39265704C0408B011EABE20D Count = 438 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4 -MD = 31D12D8C9B80F8B2C670BF361D1DD82522C5AD108D528414F5ED87C0E4089E2C +MD = 94CDE905C12F875B2C994CFB0F8A36F32ECEC52028AD5E6AC6C264863DC0F69B Count = 439 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5 -MD = 23522A7E65B2079A40B394C4B9625AC7ACB2F8D333864CB9ACFB3916119C7C71 +MD = E334D1EEB60D50C871C127FB5B45AB1D29E31B83A06556BC1238FA90DB0A7791 Count = 440 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6 -MD = 5FCC345C4E3B5D6CFB3407C2D952D91EE9E57A732441969585FE21C0D59D6816 +MD = 99310084AA457CBAF43732334343DD533B42D49D5827E9A7500201A804767171 Count = 441 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7 -MD = 6781AD877923A95D4687E1BB6734B4D82EFE02BFC4E4134B4D8F7851FB73C53F +MD = 5231C9DEEE5454FB3ADAD84FE88AFA9C2B6AF205FCF531F497F2208DC4E9808C Count = 442 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 -MD = 4B35B9D295411447727906AF20660ABA8585B3CEAD75D8FE69C5DBD78A978DA1 +MD = 8DEC5DC895FE0F6E54DABB54C311C8868A34CAA70FD99BB9845A0CBB7EF25516 Count = 443 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9 -MD = 8CC0FBECE9B32D4255851B9DCF886637F45B74B89E116EA90CE54CF61D4EBD51 +MD = BBEF34B7077F21D3FEAACDD7656779ACF18AAF9A838E378F2392FBB0A5DD0C04 Count = 444 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BA -MD = 212C1DC30D5ACE6FF2A6EC13A57F6D50DADAFD7C0C5BE9EB4393F895D7D5EE0F +MD = 3B7773F286C147832D23D11A2AC0960C6A0706E5EDEDC8C16D63D563269946B1 Count = 445 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABB -MD = 5FB7F03CAC33645CD68419C721B1B31DF1B806B4287B06E5168F0764B759E971 +MD = FBC60DF4A1A62BF2321174A4B0FB0DAFF08D8EC812301A20A2BA8E265BCC27EC Count = 446 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC -MD = BD23BB00F68164C76259697EDE901D0B3E08E1DEF1B3A2FC7EF8915C8B1F10E5 +MD = 5ED5D94D90FC67D636C603028E8CC26825A45496FA723C783C66ADEAA79B8227 Count = 447 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBD -MD = B0C7EBD4D926B4F9FF9BF09426B41A49A164F8CC93E280B5CE2D94345038B8AD +MD = 63D937FFF61DBBE8282ECE8958AB3215A85F688DF85C369A4FFFE0D3F4E41ECC Count = 448 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE -MD = EB2500752FF0A6A70B6F908BED1CC4EF652D2BF4C724C7A5BE321EDA7BE2C003 +MD = E59A9B877B0034908B8411027C2CA1B07ECABB440F112136815EBFA8567D8891 Count = 449 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF -MD = BF050544EC6B81F530E8854E23C07E8DE96BB96B16A2E75D2D352AC78890618F +MD = EB5151DAA5ACFD6EE6BE91EFF2767A9DA442D9201786885334DBF4D9650EB6BA Count = 450 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0 -MD = 09287ECF61B5DC9CCF5138BCDFB58CEFD8CB820DFEF1763FBAA5B951A9A1E22A +MD = 10987887BA46538159021C6638573F8A377C794A4739CD2401AC3E54636806F7 Count = 451 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1 -MD = 40B7A2222804DC09C52E5DE180DDFDFD1191BD5F833E0B148C47372F06351E80 +MD = D473216933C3B1630EE96C6C83C3BA3F14EFB0EEACF8894B7C0012A29EFF24FA Count = 452 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2 -MD = 54771A306E82B58C13DB8BC9702E9EDC09960F6DA9F6DBAA5723280B770AD196 +MD = 09C6ABF6B02B7F6932845911C7B48DE7C88902F6B2004D46BCA47E821D1B8215 Count = 453 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3 -MD = F4FE9E6067438C8C2F38678436A87ADA234A2A422FA4B3CA3995BA86832D574C +MD = 5F1292E7A9DACB47CFC22C55561A06969BF3142443D7FC6EE93DC3C8DFFC1108 Count = 454 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4 -MD = B61BE8CB993B3A7288DB097D0E7827B78C1380181396E238BF2F9BC04DC0DD99 +MD = 44F1EC9E553F832A0D24A89541BDC80AF5B3A3732E108D0C22E5E02C3776D334 Count = 455 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5 -MD = 9B8FC108AA38803EFFBF58C3E221A91F2C4D983F6D3211A0BEA5757F9530AE25 +MD = 86F84943F20D4E3E2F40CCD2F3B8702CE14DCFEAB255121062DD3D34873E8828 Count = 456 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6 -MD = 9C94EAA5CF84CF14E910D34F2EF5D423DB16DAC7B0A263D38ADB650BBBB0B11C +MD = C35E7FCB7EB311CB8DC473CDDCC8BE47B517D77E3B311ECB84DABDFD7512FD10 Count = 457 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -MD = FBB1073DAE6999A4AE7AFA535BEBB711F27F6513C562327563148D3E54825975 +MD = A4416AE9DA0D56E59995786E1589FC0447BBFC6A20560AF3F33E25C278029C36 Count = 458 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 -MD = 940EBBD86C3280DAFB4435C0E8BAC79E08BBDE2214DD92DEB2A3C2E086C090E0 +MD = DCC8C79D264CA844672B3E571F7817658271468A58BA6381A6E4DC1797D6B039 Count = 459 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9 -MD = 167ADE78F4D8A953500254047DC8CEE6DDB3C1AF68E510170D3843AD0FB84A32 +MD = 1AA65143F5AB1CB075B929635A3D817278A1C446717145FC68AA2F8633CC5E51 Count = 460 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CA -MD = CF14CAD24BBFA2456E444DFA58F79A44F5700A7F74523DAB03A14658ADA69577 +MD = 37EF2845924561FA7C369BE1FEFD53E9661C4EC76099588AAD98A0B930EC628F Count = 461 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB -MD = E6008C04AB8A7542D8B128E12000D78158F7FCF2E0CE7962AFA0944EAE2D58EA +MD = E4D020909C51507FFECB46EF59139AD1B529755E33484C14B8B88B4D68E93127 Count = 462 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC -MD = 1AF200F2C4012482ACC8087FB047B8A2FCB94477B3620065D2D2D0D2CCD2EED5 +MD = F7F9278D519B6F4F0640B42A5F163F5C9BFBDC51408B6DDF8D5752208BDE9316 Count = 463 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD -MD = 89A640EDB488A2B8922A9DFD400ABD42C7888E37E55CEC890DF0005055E44088 +MD = CD966CA8D59E39B9F2D99A1791369FD57E4ED56C81C8BF1D45477416835D376B Count = 464 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -MD = E2D4619454BAA12CB4C35E236F5E49C7C4F41299D6E1B4E2BA62C008F14FACF7 +MD = D6F570B5CD2F24C03A6D58CE10E3A1D7E5AD91E72A9EFBA0F148994E436C1F93 Count = 465 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF -MD = CEF735FF3C3FB23FD4A1D6A5DB4909628AA67A593531679F0F859BEA8EBA10D4 +MD = 46ABE73B33D7A6900783ED45BB6E8E3DD65F89AD2D65786EFA554557998C0519 Count = 466 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0 -MD = 673B1E663671DAD4DFD909BC1D9B5A635D04E3D4E21F5872E558CF06E25C998B +MD = 70922E0C50CF98A0E283B24D27BC5875C4C2410DDD24FEB3ADD54934C7C69378 Count = 467 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1 -MD = C4C69696AC78F438946E6AA83B7FC413122C7C203B1ED4B843CC11A1C3FAAE30 +MD = 6502BF84DF0AE6E5A6164083FC54EA60FB6267D9A4B57D246D8FCF07FD91AFCA Count = 468 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2 -MD = 5A8C63E91A002FA804EF74D2CFC80BCED4B3DDE60E7D5F186751FCBD4CF60B75 +MD = 70EB9A9BE97BBC9C385D42F275A076FD8684A2CD869C90963C33810A7791C85A Count = 469 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3 -MD = DEDE907C4D2CB94549FC0E4CE6A1EC98E5D5F73BE4C3084D3DA97BA0BB06536D +MD = 9ECCB5C2099546BE1946F050335CF6CF2A2A18EE51E928A600671968EC567A61 Count = 470 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4 -MD = EB040F9F0C5A6D819CF075C3B432BA13F1914FADD697D5B4F028BCE75A28BB6A +MD = 1175A52529024F7CB214B9F820883838C1D5BE8D56DC42D20ADE33E0C0AE6605 Count = 471 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5 -MD = CF1A9C12D06CFD95144384ADF43FBE3EECD6EEBE938FFEBEF64684664801A575 +MD = D4B9A5F2CB4144A4D92EFA755F3850CE702376F637716CBF6C74439511995382 Count = 472 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6 -MD = 9E9A557CE7BD483CEFF343CAF5EC584518B4186703DE6BE1199E54103B4C3F38 +MD = 095BEC4DDF982B4D80E7FADF391E1594B58D8F11C572139F8DA3CA1047C9AF0A Count = 473 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7 -MD = A70AE41EF008F071A2FBF26CFA82A23404A809727B3F598D9A508FDA588F1838 +MD = 46CD506093F08A9383CB0DBBAB69E2EA05A2294BD921E1966380CD28344D57FB Count = 474 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 -MD = CF4CCCCE01B52F7C5C0E54FD56EE8738D19061E4FA67888F9CF00A990ADEBADF +MD = ACDD6D365E20CDDD107340071F61965E5A1832A07A1C23E1DADBD33A9426C2A7 Count = 475 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9 -MD = 457FA665E306A602B8EF91CDAC7732A47E311026DCA42D76BDC38DD77F741588 +MD = 4A49CF4C1CB289A3C5612B8333DD84B2ECFE74E4D66E51E2A4003E98B29B5FC4 Count = 476 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DA -MD = 75B38836DC55BF6647AB562F0E26E63A77CAC9D8D82AFE39B2655D48BDD97D5A +MD = 88E0D740AC8972FF2BFC9F4D4D850C913C38EB5EBF1590471A42FDA2005E36A4 Count = 477 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADB -MD = ABC01BA2F0181F0FDDC68B5C91A0A4EA4B593DD6507CD8D0FD351A2D13BC181A +MD = 66A2B2E0A95072A11E54FD183026602F59812FD43DA919B4573AD917ADA16ABF Count = 478 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC -MD = 91B64A4FC7F2021922103B601BF5642E8BBD6AAA24FC87D0B7C95B1B9D2C2E14 +MD = BE0926D9ED70D9F1C6B131598B9F48BA8782B8C5144C9416093EA9000A786036 Count = 479 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDD -MD = 24B66B7AB20AD974A8F1447BBCF9FB1A237ED2084A654B52E8CB4029922325A4 +MD = 017C12721577D5B8A7B6AEF6739F0DE083490156B567C134B8B5E8BE714281C8 Count = 480 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE -MD = BD16DE346E929447D4FBAA59E13D8B1120122BB3DA5F740F1405368FAC1DA0CC +MD = A171DF0DE4DBC65831F5D5A26C875E966B4663B0A7F331CF9EDA65593EA8B172 Count = 481 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF -MD = 1F2F8DEC3C3909704F09A4B8A35FB8D64D9389B2C2A52D4964DFBF3F4B0D0BF2 +MD = ECCF06E85A8D328CDDB8957153A90EE0E68EC0075430E828F85BE88E59D3CBD4 Count = 482 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0 -MD = 786543E1948AE612634C329D3EE6ED21B78C958EFFCF121BCF1FDDAD1A0D041E +MD = 27C9ABB85D6A7D8AA6CF1B995C5DCB531932CDE12F149E99490BECC263F07EB3 Count = 483 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1 -MD = 6B418677E93C840D10F54E2EF6A72B8A8D83411A7B594CF74DEE0DB0E76545A6 +MD = B029CAC4F7510D7017FD79AAE5B0B97EE4C62ECB3DB5A3C8F41A8A9231501FA3 Count = 484 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2 -MD = E5854786DE57081DA11F727DB3D60714846FF3A228F734FEB5D56D58529290F9 +MD = A3B5C10842A3F1242D652D66B9DF92A9A6271E5BA5C2A9C2817AAB6248F5360E Count = 485 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3 -MD = AF66D47D8D1C24BC10B56AA2C245074E1E80BB25A559231AA46373D3BD853A4C +MD = 43C4D91AE7C1F4D7DA5464005EAF98F9A64B03899798F6BE13C39ACE7EDA1943 Count = 486 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4 -MD = F5F06FCB158DC82141AAB6BDEA8AC50513B88008212E264CA87EC152E8D7FB0B +MD = 5F4F62EAE047EEDB6A18C1F011E2ACE2DD90E9F87D234D4609D3F2FCF385FE57 Count = 487 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5 -MD = 35E7860C0C334EF59C8411D8B15BC348CB95A7B0890E6E87DFCEC7EAF05AA4F7 +MD = E76189FC437442C4B15ACA1468959636C8CD14F8363E785C62B05E164DA2CE04 Count = 488 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6 -MD = F358070700B891E4B43696E7B04D9BE5E6E310AED4F24C2C3D8ADC619519E031 +MD = E776CC5039BC0A545CB46CB82D3EDBC3FE3EA92FB33576ABE4F01F260C78B16F Count = 489 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7 -MD = F51B8339D461682385A7C3A418B60AE50B0868DEE386DB0D19A391CC31A64BD5 +MD = 2666533B863A260CEFB38C88823271C5345A5496D51E6D95A36784B09D6B5425 Count = 490 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8 -MD = 0A12BF3166F603B51A76658643795BF665EEEEC232791563634731B73B34942C +MD = 774CFCD0DCD1FA51115FA786F72F50EE050CDD5F05B2C581C1CDB2F18F05664F Count = 491 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9 -MD = 941B0B8651E3FB8ACA317E1B3775A78EE13E25C190459F93C4BAD2C4C4E8950C +MD = E23C66ED0D74B6B5231E3C26CA98BAEA09818768827319FED0A7606E2C69AA75 Count = 492 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EA -MD = 0267A63A120DEB04A6E9E6F1854807C1D5DBBBD8757DDB511D7629AD0AF7C442 +MD = 28C13B426AC21DA511A0270CEF4CD6366A87DB47CB60BA310B5CF537AE6BF507 Count = 493 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB -MD = 03A4E35A2172E02EE1FE1A509CEE5FE8778F39D3A761DC108B91B77C3B46FF88 +MD = 0164DC69D7F572FB26808AF501D54481243B9EADA54046C609D4A64E0F59F179 Count = 494 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC -MD = BCE5748B7DFE04E8C302C37E505E6F9947FD88BA4600B6A7B5BE6862322FDADE +MD = 0740837D904749F8806E635F2641CE2DA803C80F442A5EDC7531BE0327F06E19 Count = 495 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECED -MD = 8E7F85099C0B52B52BF6A46FA16CA324880B65F11CEA5C41D34791C98A17CD8A +MD = 20711BCAAC58D1E3AB7A575CD1CAF3852CBA04253D9D9C4FE9FB1B4479C8D071 Count = 496 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE -MD = E17FF3374B79D227EC7B85D51F28146F36D9B8A7A4791DC82C57348F2C556AFE +MD = 48927876E2B67CD3FD745D50A0C88CB12F1376E22E32C52E52770D3D2DC4A5CD Count = 497 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -MD = 1711EB54DB5DD1BCD0DA69B74CDBB8F67D46D636682B37992D68F4DC5B75AEC4 +MD = 9E23A5321F4422D0A1A70223BD934235C5C824F1AF81DAC999EED38F4E4EDF1E Count = 498 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 -MD = 871040B5DE5FAB87F672557FF31771799C87A7B453B6B398C2E08229EC5ED44D +MD = EEA077036DBCA54BD22C889726BD4057889DFD21F739B9B24FA058296F87A2D0 Count = 499 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1 -MD = CEF33333DE9F030C54AF5D12762DA513320EB947282362C9C330BE0FEA8F4E03 +MD = E1ACFD25CFFEF8B1E5BCD9CDEDCFEC7483C4E0A5ACD5FA837E3B60E6E78A8C48 Count = 500 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2 -MD = ADC69F119CD15724CBCC30BE52C238DC46741034CEB352F80059BC6640E39221 +MD = 194326BD6AC112EDA229116005D6F496ED4CF5A6162CED4A7EF6D77B95467C0D Count = 501 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3 -MD = D206ABA08146D5FE0BBD7CDB9983EC4BF03C6D28A4C31952813328A72E6A3112 +MD = 9C3D3B51B2346E3693BD9F73BF5CC0FA4CEE756B47BF4ED229666C8B0EA0AC8E Count = 502 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4 -MD = 04DF1F03D1ED728ED2F29940D62F5DD3F463AFA34E16AC4F2F76E2CF3CC903B5 +MD = F2DEDE60E14BB439BD8E3632251899D1E86F717E81E460D6E2572AFAC686792F Count = 503 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5 -MD = CE011F00FE80A53CE0AE597D7E79834320F28D78EDF460DB71848B8A23657AC4 +MD = EDED8E91ECDA996AAD8AF68F1BC0B7F354A1D43943C2251C9D90907AA79935DA Count = 504 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -MD = 44ED06B638306DE9091E13B90AFD67248264C83C44F2F3ECCC15E02DABA86BCE +MD = D34A2469017CA9083A2F4407BD8E4DAF1FA67F31E439874E90F0D0538E6F4CDD Count = 505 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7 -MD = 6042FF3317043F744647EA5BE2EB59D28FC94A707AD6276D6BFEEC4F574FA790 +MD = 68327C6C97CDFA804B8825A129D085D792ACAEA6B2691C1769F0134995A372B7 Count = 506 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8 -MD = C3631A2C299762B5A62E9F0509C2A451A41BAEF2AA69166014228FF76DF07A30 +MD = B5EC0A3603351434F401744B8DAB955FF7A2DD886B0197E7FBBF52E81ED40072 Count = 507 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9 -MD = E312685D501CB85188A0504291D8A43117213E7829CF9043ADCA8741FE974184 +MD = A1097D5400402B0F6C8276F0C759BFC46572EADBEB214B94847B14835A08147B Count = 508 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FA -MD = 85D07848AF14051BEBA637F791909EE887BB79DE284BFB60518DC6419CB878A4 +MD = 4594C6D3D2F500C13D8A0EB8B3D3DAB9A3641271CD01448CA309427A4EB8803C Count = 509 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB -MD = D5CB852E21BDEF37148171D5653B96985BFDA72D66EC0EEF975CDA11D3A5F4BE +MD = 2E2440D893A1D44D8ADC3AA4EA3BA9F7B5BDACF98CB02077F0B5C6F567D71DB2 Count = 510 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC -MD = 68C478ED186FB650D98C9879B64675BAFA8263763938D430A616971BC618B1A0 +MD = 98F32A4D7A3EC453CC446B72C68E9F035B65BF771F7F8BECD0C75C9A079F5425 Count = 511 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFD -MD = 0D9E829E4ED4E92A996321F360557320161394E5370509B2F19C2BEC089F46CC +MD = 4845895509CAD4B12CBF0AEF484F2FB1A50D08B91C05E3D5AD900FC0823C8C07 Count = 512 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE -MD = EDE12E8FC55B2942AC21992AB791B2CF2A40EA04B5CE2D183347AD0086FF1C90 +MD = 8E73F474C17132F5B70CBE9C1299C11474B3BC9521F3A86C5E4F3DAA1BA7D839 Count = 513 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -MD = DDFBCA84BB88065A01213C0F02594B92C2F629D7F7E17764D68871F317A78695 +MD = 37882F2366F95AB9977C53EFC8073E29F6F092DB968F4F2BE232AA745DFD25F5 Count = 514 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00 -MD = 3BF1BA769B04E9485578148305CD5FBCA1E056B7E9BDBD6F3E03FC541B4895B7 +MD = 4AC9FCAE0952E2D6376F6C9A5B6936EFDEAF179B44D0DB798DDA12450CD437FD Count = 515 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001 -MD = 256BC4B44F22708FDD89CCA1D5A15710D4CE9F8EC3C5B8DED1F69D1C38C481C7 +MD = D149F90F1F947A7B719FD6B15BABCE3678E2B331B63BF4427DE4695DC3555407 Count = 516 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102 -MD = CFA94BC35D163FBD5E74AF3B76F5BE6C0E9E65544520AB5DCF5482B301A29101 +MD = C4E83C8E0D438927A18EEA813D1FCAEDE590D79B5900E174E572F469D6F7AEA5 Count = 517 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203 -MD = EC584860ABAB0E429A077D291F136557CDA6764120F147702680CC37CF91CFE7 +MD = E058235E546429254A28A8E42235D61ADD696BA0EB239964E52C2FA73B96479C Count = 518 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304 -MD = 47583E10C3A6426E6B145E3CB08126F185B434E0E259ED5228C88A7E630920F0 +MD = 8503A74B58331CB891F6ECA33BFE5D5FBBBF5F906D9DD6AE1E737569863478BD Count = 519 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405 -MD = 8EE2268618FAE00A18BD778D62A04BC1CBFBF77564584FF773DFAFCF05ACAFA8 +MD = 416CDD32DE664852B8A5F3899B3882684DC707C5793475FE826198036D688843 Count = 520 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506 -MD = C07C1AEF87F1963FF2ED3452470965849041986B1F9DE6DB281F51B0AC54B6E4 +MD = 52C46B19AF9C5A5AD787E022EC9AD8EA2EE138940A8489A271BCE1CDCD87C9BB Count = 521 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304050607 -MD = 069FD70F80D098133A16B620B81F016172226C7D6186B4751B3D2C1DA0B09E7C +MD = 3AAA850C4E8E9F7A4F88EB762AB0D7D5C392CE47010544B8A2A174A02FFE41C9 Count = 522 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708 -MD = C881ADB4058108F2C043BF40FF713C554C52A09BE9C96072BFB55DEE8B48FED4 +MD = 95C2024A3B4C2CCFDDA5CFE49AC0C19B0F998E8F76402084F541AD562A6A0408 Count = 523 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506070809 -MD = 92A224AEEAAA163AFB9CD91A9F719CDD96F64C2421F1992DC1D51FF9AEE50F24 +MD = A162926FDB424A565A494D602487F0F5B87CBE2E30F5494D589A209381732AD2 Count = 524 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A -MD = 227FAFFE58E22E7CC52108707B0C4AF5AEEE1CF0C1FB5806AC292E3761E99CA7 +MD = 18712D3C9F09427E53C7ECEA40C4BE87E92804C1464DFB20E1299E8F005CF545 Count = 525 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B -MD = 8AB744ABC18F54E7D710A89CD60BB6158BDEA1B86AE152AE489AE02242957CCF +MD = D5672322D337E786DE2D4447563A6343DB42417D6BFFFFAD5307FD74352DBA8E Count = 526 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C -MD = 3C3BFF2F4AD2A44468DAC5B017C3EE01EE3CC776674E8BA524CC3B8BD586B0E3 +MD = 1A2D1D644B8177574A421E8B29412869E333D3403834B7514A1E8D47045773D5 Count = 527 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D -MD = AB9370680DE252944157BE07C682255C03266FFCCAABDD0AB42418B1382C32BF +MD = B80FFD05535CC502FB88ECD9968A5B045F82B151F1B1CE62A2AD7D952AB73DE6 Count = 528 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E -MD = 93DE1F0D7F26CC66EF25C8F3BA653BC7788A2DAA14595C3535FC94EB51DCA520 +MD = 700B82928C4F56B5F06B5A6FD2A511821A08C5D23A9BC59605D75CCBF84C727B Count = 529 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F -MD = 69B8E90175B4509B12C80336F075B4E9E40869AD853B987FBE74A8416BAA3485 +MD = 45838E2782AE2B09ED09EB5AB6174F717B22B5CF898F8F8F7FD9734174DD5327 Count = 530 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10 -MD = A0C05613DD8E3C62996F50B241939F6B19F1F9FAF0B5CCDCBCA658A524B1DD82 +MD = 998BBF07662C59DD2C15C0BF6B7B62D72E46CE05D5C4D101CE830F2C3A311352 Count = 531 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011 -MD = BC5A739D3D851D856F55F49892C1E70D72E3AB0170288F31A341080115117846 +MD = 22FC7B182FA194FF481E7F631111FB33B52BC9EE9F79A0377E1E8F4D653C651F Count = 532 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112 -MD = 73488954EE7529F0AEF48DC0856F5804BC63A5B30B6F943CA012E9613E8ACA16 +MD = E0C4393B7571653A0A1AFE699CD88E3847E66AD81C65E6428B2B7350E99F9181 Count = 533 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213 -MD = 38A40D5D938FBD219D11BF2D4B8CA28AD95F5963C7D97C6748164C0D51B1C0B6 +MD = 810DB219836D5DB107C05E87F34E1F841D2E3884E1D3F06F6C9E80E696E81341 Count = 534 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314 -MD = 0CF3AA3BD209D77F3F5702A66C176F889C6D9194505A81252F200F9DE834DCBE +MD = 360FCA6543C82350A4166EB1D7390D6B47C05B6F138A3ABDB45D58CC5F0F3E44 Count = 535 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415 -MD = B9C8E0365949281F760238CFEBA6FDD16058A94B8F4CB40D176EF97A43CF57D3 +MD = 75487E497EB9C3A80E9D8A711A755CB13EEEA81DF4742EBA636845D5B07F1994 Count = 536 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516 -MD = BD30DFF4AA34B59D9D4619C7D3ED6E872FD2822571499AC0B0E76437723A4AA2 +MD = A1DE2FD7983258CDFF0B0998D9F7FB5D3F7C8CA97FECB58A61ABD9B3B4F32C1A Count = 537 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617 -MD = A2D9DF78BEC747AD383EFAD5A9392CB685403F490E348560D880D6C00C1F20E6 +MD = 38760A9C72855DFD6A0AB93991672AA3B709C8555AFD720C3FB486DC5918D461 Count = 538 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718 -MD = 795FE55132BAB29C426AF77401940336BC4DC36878CD997BD32388DADFF9E6FD +MD = DD7851353B7BBAC954DACC5E026E231DA6FAAC67C960C5A65E6F387904DD1580 Count = 539 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516171819 -MD = 2D18EC3D24F4890657297ACCC9145D2961C02664A6F9AFD327948F3C4B9C8A1C +MD = 7672C64B5079B9B45ECAAB0A1343B5EC16B9F4E4F2545A2ECB058CE5179898C6 Count = 540 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A -MD = 310F8E115ADF391E8DB1CD1B05622A614F55C700944F9C3B72A508F40C3CF35D +MD = 51227686EB5EA31F5CF43C984F5173E569350086CD3D1F1E0EE17EFB2CD45EE8 Count = 541 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B -MD = 33B8A409B13057213783707A3373B948DE1F5AD2FA528C0913A2101D68C95C1B +MD = 0ED9BBF652D235CA5DC8DE2A01D22B5D57B6EE78D2B865544CD896A778AF76EE Count = 542 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -MD = 8CF3CC67C96EE17779D0842F1D8E18E2A309D7EEE98233EA843F18566DAA13DC +MD = 88F0D3EABDBBB7465F70DCA34CFB82415C8308A4AE4424BB14601C1BA2B2BB9E Count = 543 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -MD = 4F7514182909A433D66BBF578FD9EF29D7A25A2CCDC4C7A53471A9E111468A53 +MD = 98544BB7D7229C1B5EAC35D0156321493AE07830BF0A62FABF547C01561C5954 Count = 544 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -MD = 820E9B5F544466F305A8D00F7FDE8FF09CD6583DA14870EB59A0C68170E50CA0 +MD = 15F2995F6FD3C933F887DEEBC358B5C982E13AEECC84ECB74FF66DFF11B6CA37 Count = 545 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -MD = F2101054EF94211002B5550233DADB487A95FFB9C88C97A7A1814BA550D63966 +MD = F930542E4F29555982364BAE370B63718822AE99866EFF32428FCE751CCCD371 Count = 546 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 -MD = B59908B8A0B84992B3DE6183A8A650EFD35984BF314A24373E53D04A6E7375F3 +MD = E5737BE24BAA4D08E9904C6F8D0A3946FD8BFBEA1509756D4ADA9913CA78AC72 Count = 547 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 -MD = 6F563736EB102E791E3E4A62F3B59771D3B9ECB909CA4E02A264B7F1A63CEC1C +MD = A13AB5A6118BFC683103F4C8159AF095C37D5D1DF4EA048B22C902E9B0C59A20 Count = 548 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 -MD = 74D5ED4A07357B63C0EBD6F0D0C25130D71005BE60239C8872147EE2C9E60F5C +MD = B2F6BAE93DAE48355E4EBD12F403A729F0660205D5A6B81D50BC9A604FC4B7DD Count = 549 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 -MD = CD64AE92D2DC810CE620A87291358F6CA4F339BC6714783FD6DBFC5336BE06DA +MD = FDDE6582EA87C884558B3A1828210E2417A1C31EB372FBC72E20D2F7FEC3E100 Count = 550 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 -MD = 5962E4EE8217F712671F0579AFD34F3DC80093D7D7395AF067798F95633AF8E4 +MD = DECFFDD3E69431AB30A3FD3FEFD6EA3DD7F32D50FAA7B54AF5E80F10879A3C0D Count = 551 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 -MD = ED0F9F71832EF6B345A2FC4E17986635051AA06EC2703BBF398FF04F20E677ED +MD = 11820F325689AE6043CA23BE46D47B918C1CFB8B7AA65083D723926E0932353F Count = 552 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 -MD = BD2A9E61F32E2380FB90DBED47AD7986C3E12226ED1CAE12A64CE95C508A0136 +MD = 93B59942F1977A8EA31171DAAE70D5567E54062CBE27A010F097BBA7EFD55FA2 Count = 553 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -MD = 31777C3F474E59FC6151DEE7329FF4D7B1CC30D1404B42D28E4BA4D8F6D68DEC +MD = B4075756C0ECD3AAA74D860549CC006990AE99403C6EEF53484923DF00F3D994 Count = 554 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 -MD = 303A2FF0D064ECB0939608431C366CC3ECA868966C6B6D5E4C767FF3BFC1BB3E +MD = 3F6967A03DC80F9B1BAD2AD3F2E4D86434083B9C2C89E8A55A80A4D222BE0C0B Count = 555 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 -MD = 242C183D5752D3425504145F7C1ACF2C6DB1B9C59D9363E8EA2D4B19D88D0DED +MD = EB41ECDFB77597895E5A870038DC0CCF12FB0D231C79C073E0345819414720F9 Count = 556 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A -MD = D058F21DCD199079DF5192F753A1231B13FDA1887F2A0D0438D3FFA27E0BE5F8 +MD = E71247ABEE0666CB1250CBA1BE524EDBBDEEAB812925585C7C73F3AC251C3542 Count = 557 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B -MD = 5D18CD3241F063DDD2E1A93B55F149B67E843A3ACA0B9F330D3FE58045A9B2E4 +MD = D54492B9CACDAB4C9A86131FA23E31BA0E6141350FD7AF2ED5D37C0FD9F8E611 Count = 558 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C -MD = BDCD2A8750F8089073FB0DB01BA9E0B2F16DA014167A8B01DB486265DB1F2610 +MD = 867CE991FFC2B9ABAAF3118F07745D5C92E54680000375618574AD4C1459D757 Count = 559 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D -MD = B6068F4E3ABC88CD1916BCD0A7064CBC94A00E87AB6E77220855492D2C74AEE7 +MD = 5F1F5E7C8E743F00CB047B0FE0D5EF3579B7113530AEB194A600F0B9423481C6 Count = 560 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -MD = 57A380CC564D459809EC1CE9589EA5CC0798CFE73C038A8B771D6BBCABD0128D +MD = 8D099A6F1B18744FA0FDC43CD7CBB539EB0CEB83DD0CAE2391460A1AD7989CF1 Count = 561 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F -MD = F8E4BAE768682D0B2A33042BD01523886F356B0A9A1718F298F92B501CE472B0 +MD = 6EEA628F1BE07A7FFC5E758C48A861EB0ADA02BC6A82EAC259D038A35BFBF3D8 Count = 562 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 -MD = F09C4F2C11ADF1707368CADA44695CB90EA1C06A3D42FCF31251B098A66A3122 +MD = FACCE8B66E25617E340EB6C36C15AC0F98A6DFB088F557216A8005DB8E1D8625 Count = 563 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 -MD = 3E16D5E507FE2FB5EBDD902C8FE4C875A3CDF441DBE547E202C3048BF4FDA125 +MD = 3497793F54BEB4ED0A0C53AE3CEEA54CA5CAF4A9D9FED211143AFC55E24FB467 Count = 564 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 -MD = F5C89E4E61DFB86642C0FB0749BFC433DEC7FFD734D3A7894A9880830B0BE70C +MD = D1673FF66FFB8363D6EC4518FEE909B69D4D82BB4A8348A7F8191CD2B3552E52 Count = 565 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -MD = 4DC1F9E1FF6FACFFB221AED99DCBA94E9A4C7869310691BB15C7B7DD6727EC74 +MD = F770FFBFBBD1BF9E62F84F23FF709A3D6BA3E9548EEBF6B9033180A0794429CD Count = 566 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 -MD = E6E2E8A09898E92A077EEB0D4D19A65C0372634CAB7A1A6EF297B803CAA9F3A1 +MD = 59F533CB47171D16694B25F3CD919CA8AB7FBCCDA543D4D4210506B2A753B5BA Count = 567 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 -MD = 91A81A16A8104764AB8180185376E243A974365A871896A27A87D012D3DCCCF3 +MD = 3BFC39BBC6B66C8268CE09FB7B566E55C993F2EB965FCFC01A9983CBC18B5D99 Count = 568 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 -MD = E1FFA7C0A501E7EAA4BD59D58744F01CD78136C72CE7A91311AAAA7CBAFDA4EB +MD = 3A87CC3BC4BDBC501101E847D7B288221DC5383D3F174CB882C69E92EDE5AEF3 Count = 569 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 -MD = FB95B7666F6C497942C28721288E27121910E166C9CAFEDA454FB81C3E5B9EBB +MD = 2B39F6BD24E847364FDA283C43B72BEE5189C50077C1BD01B02067292616AEF6 Count = 570 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 -MD = E92EC3B3B61CDBF7A0B39F413797E69AB1C8C4DF3214C6EDC8759A4B6E153CA8 +MD = 9C068DD6E5F501DCAB71209D290AC358F62835D6DDE8E5B4F59FCAEF3744C535 Count = 571 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 -MD = 27D2F6D49C6C9D9CD7D549EE1CE55994B541AF31A64C81F9DB46BA5C79A9C485 +MD = 4BED4700CFD1F9510789A62A53D644B4B3FCBEA88CF6DA363861800A63C07C55 Count = 572 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A -MD = 1D88E791E4A2E45CE5F97B5ED12EEB57B508BD081B705468D46B37E66C03B8FD +MD = CFAF4B26C3D69D9189C6AF69430DB33E5E5A38EA9A48A4FD34277DDA3FFE5270 Count = 573 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B -MD = C9A5F2AF2A245E8A27BF90EBDA59027748A916875CCE5E1ED534D2F881E06E5C +MD = D0521DD21E80AED85D39CD5394698ACF39D307AA207BE0D21B30D0917365CD17 Count = 574 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C -MD = B124965552010810899994688E8B35452450B9C9B6AFC109A6F6F9BD584F8503 +MD = 33803A8FAC098C18C3249C7AC7311294033F7B185C37E73441AD638E2B8C3576 Count = 575 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D -MD = 27F9B9E323C16273DEAF55475383191ADF455DB165FDA7C6B51EFE108ED916A8 +MD = 81C4FFE218C7FB9A4D265F672115A5723B6A12EE8E59F3104F3BEF04BF4704AF Count = 576 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E -MD = 4733D56D6C3A67BF25E4FB61437D72574EFB2CF81AAEAB3B3A76627358D3537F +MD = E77964E54ADF183B0ADB296DF1727D4EA8825C8994890964D286BD4C8AF342B5 Count = 577 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F -MD = 3BA262D1CCF16BA1D68C4B00615E4FD1D7EEE3AC3F0452B625250F101FE5A954 +MD = 0B950E43F9F345A4D5ACCF08FD6CC538F684CF9537FE8F391C43D46F9A6B3FCD Count = 578 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 -MD = 5B48677EDD660061EBE234C5F4960C2CE65AB71AD39A22949F953AF663197F25 +MD = D1C39EB4AFDF801B224B8D1BBA4581AE98A886B94F577735BAAA67D98C3899D2 Count = 579 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 -MD = 8FFBBDF14D8DB3C331882E5494722235CFC61DCE9BDA1835EFCBD38C2A7633F0 +MD = DA401C64542469FB9F651B270AC6B0376F1F4ABA77B530347B310D1E8ADDF1D5 Count = 580 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 -MD = 7E33AC65BBE2E38D260C8E3AC65CBB44C816C0521D7E86FFB5AC2D8B0E04CECA +MD = D6150DE204C0918B629312A8EB0DB5FE2F617E9BF3135FD45915179389C45BC7 Count = 581 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 -MD = CAA05DF65AE40D4B1C375311FF7D0E961A1E33BE80D0070B274D1E4C2EF81C7A +MD = 3CE47EFE653815B3B235CFA866D2BD1A8352B558C2AE10CD4EF4A63A76B37238 Count = 582 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 -MD = 805C8AB44610F2C1F4F9F628A549FDD47CF5D79BD24FF57681C35DF6B2FC5D1F +MD = E416489C26D858798CA4123E57DA403B63FB23E67B599F1EDFC0D757EEA25787 Count = 583 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 -MD = 7271A3815BD8ADBDD3EFE13998FAB23125AFDC4D0661734BE920F2E6B2F3EC80 +MD = 9EEF8884EB60464E2BFC1150F9DF7EFCEFF8F0E2D6E247B995CB96174AC44BFC Count = 584 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 -MD = F6740F244D424CE86C734256D9EC83FE51E04601BF21C618ED69006B88AAB438 +MD = 86C2468496BE2029A58ECBCB39F68F0BA6291CFFB21BC8D9F96CB1F178AFA013 Count = 585 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 -MD = CB03B83F9678371A99D850B8E14003BE4C8E4533DCB2F0F751B1412C4226A106 +MD = F910A31F33F4C1519916D6E5A97BF7561A563ED4A86B0A0CEACAECDF901B051D Count = 586 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 -MD = F29C64165FBF4EC7165FC0CEB17A907215D741BF6604FBCD4A90B8EF2690D3FD +MD = 7B3F1CF830A1A97B6E2B36F935D3805F10F91C5158C7084A4C8892BE0320616D Count = 587 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 -MD = A0BC75670C76EF5EDD0131529628BA1948819BA15A06D8EFEB4B00CBB74BF1DE +MD = CD9D22DE136232366E2466A16B63A1D5961F63F7AA7C71912D108BDDDA3EA7D8 Count = 588 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A -MD = 55136DF356785C488FE39E1043D58C1CFAD849FF6204D5A8302E0F3D459D3A00 +MD = 77415D4E74BFE77B961F61BD9326A7A31BB092534650418A59E08D4FA9D9209E Count = 589 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B -MD = 723365302ECF719AB3E48D7A90313F4FEE4D31284EE0A2F414ACC8D86DE7BA1C +MD = A2F66E7EA619F0D78551F5B45FE4455F0AABF40DB0F17F6F90B3CE69BF0A3A27 Count = 590 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C -MD = FCD6DB65F3E8B566EBF9ACD0B2F94E46B35149685B01313ACF7C56BFC7C33BFA +MD = 0F58AED06DF4F63D5EF45169F24AD8F046B6CE30A43E8C1C14E185BD5B44207D Count = 591 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D -MD = 197572EC038AEE5D734632B5DD534B8810BFA069D01C2B274A7040006953CAAC +MD = D7713D7B8D7D5143E7E51130EBA0170C7FF7BD3D9E9351DFBE32B09315B59D9F Count = 592 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E -MD = 42703F7D4AA128536ACEA544FE17A52725F2100935B232CB1A2EA872B3817F4F +MD = AAB31ACBD3EBA9197A5BA187BC60599BEF014C096B0B99A3DAE509E6EDEC871C Count = 593 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -MD = 08F11CD11E919899DB3B8249542A2777A9D93EE22F408DB5CFFB66B6A64A847D +MD = FC24F08D27210411698E2A5C5BDC90E6F802D48D7E1209E0125C6C3D9076C76E Count = 594 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 -MD = 352C13D137C6958101C42E1D303EE736FE9AB93758611C9E86C5199668744D88 +MD = 71A1A57F6CF68F5E4EB194F32A3B36FD806D2AA6EDDA353DD2640EBE3D254F72 Count = 595 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 -MD = 2D3FD2AE9ABB4212F8A1DD04FF123F579841C34ECE52F60A94050C44B43BF26E +MD = A4E062EF3882E8B1F9AAE8E246A8B4F7CD7DC7ACD894203EF2DB3D133536D909 Count = 596 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 -MD = BAC907047EB2B4FEFBC3E20857BC4DBC118AE73D7DF6EBCFA7A79CF82FF58C4D +MD = 951250BFC590CC7513A773852038D3D4949AF40112A6BFD591C2E1FEF3F85BAF Count = 597 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 -MD = 2D51347219612D0786E12066C5E3AAA6749EC679CE746891F645D75FC56DEEE1 +MD = 513AA68624187C72DCDEB7DB471DF263BC8D15AF73D31AD91710E6392C84C88D Count = 598 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 -MD = 0828F6D07DBDC2AFF6ABAA5EFE646677EDE6AC3BDE3CB21BBC77DBEB0DDF9E86 +MD = 7A146FBBF7FAF774AA6E4B339035A606E8241F8F333DB5917A4BBE218A4F4453 Count = 599 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 -MD = 8C3625A3F54647C76ADDFF3272371308C37DC3F56FC06123FE6F4CCA7A76DC61 +MD = 9B4586DF8297085C9900F42E11C67A9570AC6D6F22BB6BBC08A1F3D0653EFB4A Count = 600 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -MD = 4066C7D02FDDFCF5680584854463C93916255D7D965302BB7FBA0A1D47AE08E9 +MD = DDDB7B725615E6872F3AB4D40AEAB00031754F872679077A7365FF01B011CB1F Count = 601 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 -MD = 7D195F214E81D1AD3F2298EAE63D2465F44D42ED0D8C216B8823F19EEF1335FA +MD = 7747011BB9C98391D08D8C747FCB5AFFB456D76171E80262968B61A9B95B6F8F Count = 602 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 -MD = B42A6D0EDF4E655B1113F08760FC101209A0BA7B7506A9C392AA1C5C521516F7 +MD = F7CD42302383D8BB357C0E71525F07E6AE5FC00AA92B4566E544FCAF3E095759 Count = 603 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 -MD = 09D9B1D8DFB5BCA43B4F54EDA5AC108924A9872EC046DD6363A91A453F422221 +MD = C2A501C8C72E65BC2F71494D10994FA89434C8CCF35AD582CCA008F6D0250AEE Count = 604 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A -MD = 43BAF962AD3EF49EAD1BA6B4D3FEA8C8FD92BEC2E4E647ECD7704F0600CB03F9 +MD = C76EE3D1186AF5751AF94DC95BEE0E88C3A94D20A0ABD3409549DF5240BCBA6D Count = 605 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B -MD = B36F9FCDCBC4BABBC262553AAF8D409C48385E1DDCAE9F3C10140C28639D1DEC +MD = 04B980D421F19B4129E504B45D53909B9C2FEA30CEC1BCC814653E59DD7F8263 Count = 606 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C -MD = 206385306A936B87D7D056A3A00C5CE288AB80A2051A77F5A5EDA60237ED47B4 +MD = 75FAD861BA3C13B7D26F4C171E736D962F1CD521D217397376D4F4FF76D4B081 Count = 607 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D -MD = F8C507E9B26C980AD173EF5A0CC65EE9DE03265772CE03782E7ED7BF635A585C +MD = 9CE706247716C1E6567395FC1974E36CA0F835D9FD37A9EC0BF7B5228E533E13 Count = 608 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E -MD = 64C2042A0921BD60D2526DF7B68684AB122CFF9072666193C8D7EB22221AF332 +MD = B94D9CDB08BBF5B98F5B7AC012FCA97692186E5E07E893B5955B4C9A4C539CA7 Count = 609 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F -MD = 35AEB20B83B1D31C9E4291208892234FFFF69D7DDAB9DAA6582E69A4EB84D457 +MD = 300AEF8E3438BBDEDD443897429972B3834FA6AEF8D0BE4A1E7A2756165E99DB Count = 610 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 -MD = 1BDBAC183E140A9AA13141FEF8B6C9DD11039C505E8DE569ADA55EBA0F454E31 +MD = D1EE844DC3A17250472CDCC3553DAECBF1BCC6C543AE6B2AD89C3AC84E1DB3C8 Count = 611 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 -MD = 2A08BB2955DC8B58171A07A6B915F9C28D1A36BB45EE1BA4EB754F4757A61C45 +MD = 7A4D87F41690010BB26E465DA1E1CBE30969B9A2256E3388C37D24903ADA0D00 Count = 612 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 -MD = B2737DF2DB6BEFD85AC85E00FE2F9576F8EAA84E54F129C9EF8149803FEDB1A1 +MD = 07E4EE0173A1C45FA45BC07A5D587EB357EF10737EFDC0B72221E3CEE3DA4697 Count = 613 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 -MD = E0779DDBAC3C5046C887D3FF545D9EEC29BAC931D3BBA6826A012BA8927B44E4 +MD = 6F847DA625EED5C36F2C85C240127D60ECFEB53B4D04AA12122A16F86896A96D Count = 614 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 -MD = 4F367E37E91904356131AA481FC43DD02F172E1371A302D3654F956A3958A900 +MD = A054519B6CE29D93D4F1E20C39C257E7A3E7D97B5BE0D64CD9F0A11DA1FFF771 Count = 615 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 -MD = A75870FF6A9B5B97009EFE133C819EA664CCF5924DB413DD75CA9C0252A68373 +MD = 2708E40ED087F4ED307373CC8BAC8FC449454E480006A27D742B92225FD29A5C Count = 616 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 -MD = E5AE940C11C4A30FFA7D19342E54DA69DF317ED09E6DB206CC318D50161A7D01 +MD = AAEBE700AA27165D1BF449194386A06B45D25A4DD5CA304D68289F7D73F9B7AA Count = 617 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 -MD = 828EB856480D0104973303C0BA7BB1C4BB16BA63243BCDB8CDF6C7E46A87408A +MD = 9F2C0B2E724A0E0CF2F03E3A9D2E287485735914AF94345889798CCA7F734F11 Count = 618 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 -MD = 591337AFCD924871763182B042E6D66ED7A326A9B69D80060F85AB3542DEA5EB +MD = 3B502D8FD0994E27EE5BAB686B72D68330B5941C426D7924DBC13531235D2F4F Count = 619 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 -MD = C2E9EBE2BC61451AF22CB668A7E8782B1F0932C917FA8FD198405F89A1418BE1 +MD = 1D8870AD87055B1A05A67D10269F4AF42F1649F0640BD6941A6E3499AAA992E5 Count = 620 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A -MD = CEBEDE03E67C5B0879B84F2CFEF740A8AAD34FBA54196F9C3DAABB3401C8D235 +MD = 9A302542C3EA39C3F9868613A67D185F0DEACDF408972F11D6FADE0B21FE0E23 Count = 621 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B -MD = 9C453E7E3333B7EB3F13721A9918F1846D2B9FA198FF24FD750F3CADB8CD6F01 +MD = C68DFEF916C0EB651F1F3C4DFFEA7CEBF5A015BFA2F6F72D62193284114E4D8E Count = 622 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C -MD = 10295ED705701F9A8E7CB1D6C5CB7B1BB3D2CA4DE2F2E276133BF60469F1382B +MD = E3B61CCCC757996465E53963618F649FF587F2BCBAB67CE74F9FA533FD4D8E13 Count = 623 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D -MD = 7A892245AA742DD26EFE012A42A78B4A53DB121DA1FC4C972980C93AFD42F923 +MD = 504D7144C1B6A87B139CC858F25CA89641EEE9A2F3D00B7C8722B372164C7A8F Count = 624 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E -MD = EC3C6597D1795B09ECC3FFE1AF1CE6F57BB662A10B7ADA97987D3B9B5CD4C490 +MD = 2007A2EF47043AA722C9A3BFBD517CE459452F6A04D3A51F5840413B040349F6 Count = 625 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F -MD = A49E19E4FB03C119FCA21C0FB6E50D9BDA57CF2E9622277D15853447A31BD37F +MD = D0186F5FC888713322D8C8622427A0C734469D05A80AFB713419911308FF5854 Count = 626 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 -MD = 622863EA4DD99D5C1D0072E4AB264BEF1C40096C2EAE6527521DA9948FE2B29B +MD = 95CEA4C9B10D62137D461B386C7B628A7E3FA722736842CFDC644BEF10186CA5 Count = 627 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 -MD = 5D4290A8EA6D3C56654A8A06A010BC564646DDF46EFFA7E4CB198C6A64649769 +MD = 5653BBC726B6F702BBCC5501907A8299BB4C17F11BB28D128CE0526D1505EC4B Count = 628 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 -MD = D6E420140631779E22CA7D6081FF3C251AB2E3233DBB19D493E34DF7EAD0BC63 +MD = 3D690AE9F28B173FC42B93F84B7C9167A640983BF7A9533964DFEEA94794DCD2 Count = 629 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 -MD = A52AB60CEB12FB3FCBE944E3ED33422BAF415AC382372C6B49296F29BB0649B1 +MD = 47B796C588FABF8AD1AAEE2A4A61CD48FFF6D6154B88C6D7ABF68E5F37821BE9 Count = 630 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 -MD = 63BEAC6CB282D393CD9EB9AD4A9CB6C1B0397A657118A4F307B89E9FEE83D303 +MD = 3C47F0BF0AE38DE884011343CC2DCF5425C674C87BF165424E6EDD12CC37678E Count = 631 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 -MD = C3B28EA1CB485CE291A7B767EA0E5FE2C51CCFF80A80720407F17FBC77296A1A +MD = 7FE3AD3946720A50D5A47602BE76EA5263B17026338DDE3C62FCD49A1C6DAFEC Count = 632 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 -MD = B87A7102261F172C1360FBDA6A9A2BE7635458C5C7CF285D92A4D8029456A94F +MD = AB4F2F6D7F8CCB9F6102247A6B6B27675BC661DB6D85AEC7930BD363EE5998D1 Count = 633 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -MD = 4078C32590324ABD03509A4DDE0445962312AE5D4AD98F6F5EFADDEAE2053F83 +MD = 1908AE1C44002961B4B9C8273FC0C01788761E56A73A29384962222715F2099F Count = 634 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 -MD = EE6F7C131B9A9CB436427BD8E3329AF3548FAA142467A8EBE80659DDBC13FF64 +MD = EAD041B9BD208AA28FC9D66883A474E5B67A52BC54B52863569C314BAE34DFB8 Count = 635 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 -MD = 3D9E9CBB9AB59625B9130B12C19F15B6B983B0320C5C8C3FE8BB9C256B742B7D +MD = 19A01E89F36501AD1BDD96FFFED72EEEE46673E0EE06C9266441DC63CED418F8 Count = 636 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A -MD = 2274ADBC8F0AE8167321DCFABEA02D155A4C916A0D1CC9065FB9DA11E7A67D4F +MD = 5857025697D05728B5306130F14D9CAB139949E5B8B28DE82E08B4D180E300CC Count = 637 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B -MD = 508239D595F50B184714F54787C4F47BFCF0BF24698FA2B78C5CB9D9C3A0D23C +MD = 2B621184718A941B260E35305EC06C9F959ED132AA1E0C74B67D0A9C65A7EB01 Count = 638 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C -MD = 5C49A230411FABCF8738C7F772BB580BD2536D0864D37BB4EA519E923907ABFC +MD = 5DCB8431A8FFCA4B2ED729E9ADDCBED4AE0D9A48B79E33A6992FC9521078C368 Count = 639 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D -MD = 7340FAB903E761205052281201BC6502EBFA773C14DC966AD85D879E913E8B9C +MD = FE9E71F1ADF11F5F95F2878314D48091D676E2C63B7C41FC47ACC4059321B13C Count = 640 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -MD = 59BCD73C2AAA43CB7E516A624A8FA7F4DEDC7DE3BD317239E300CEC602F2CDB0 +MD = 4CF7E8F4248215C07C7DB9B7636443881AE03FA8C3060EE45F3612E908C497B8 Count = 641 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F -MD = 2DB70268DC94A2E6A27902829F570BAF0B0BE19AD2019C14DD34C3271D57003C +MD = 4D760E5B3FC6382289BCDD4F1DD0BFDD86FB15EE0D6CFA2711AE416F89C905F4 Count = 642 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80 -MD = D39CDC2E0B6A80C4479DB3E55C24E29559996FA0B32C658AF5951E803A95743C +MD = 00617D6EF8232EFB79DDE1A5313D5DFB08C73D3ED8D03492A1ABA41AF38DFB56 Count = 643 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081 -MD = 38B4BD867C4856EF710EF6C39DC4FF07D18DFEC59C2EC4B6F6B70AB1E5C357A2 +MD = 5592D6222AF4FFF98E25CF750092C84852123E4F2252E8E5669B5A6A1A38DF68 Count = 644 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182 -MD = DD01C0648B4F80143FA583EADB630C5DD10FA3322016448C9F104C51212E253D +MD = F94C0A3158082C0435D086A23260DA78B08945D67B1DF6B96089626E9019D090 Count = 645 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283 -MD = EAEC3841242A19C8C4ED279A6D469D706F5D02B3B599307AFD89BC79E8598049 +MD = 6FF59015F5644581026B7DAC1AD52FFFEE7D1C485DCCCA8C28FCE8ED1D50212F Count = 646 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384 -MD = E0A865BC6971ADF056B7C01720742DCD00AF54F7318524BB867BF143BCF39C27 +MD = A42A7B7C6A98E61D90791CF6E49A6DE020B9ED7842454B68EC4325492AF7044A Count = 647 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485 -MD = 88A409AF15BCE9A108BEBE982021A9BDD076593C1E073B7EB0CD7A7C60D2FC78 +MD = 8B1C5DFBE75014FF731B8DBC712D762419A4ED7900586C9A876EDB391161223C Count = 648 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586 -MD = E3A848557F18F046A9FC97240CA911F139B8B8E76AB3F91C804B18BB534591E4 +MD = F746D6808A12657146214D649ECD535F619D85C67B385F67CED3F20B8D8D8A72 Count = 649 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 -MD = 1331C32114BFB42CD81ABC4A0915B9BE2E4B42E2CB9628B02C63925FF0F47BF1 +MD = EF6AA2D5D883B59FA0D56C16631266E4B7D65451F379209118D81223867DDBD5 Count = 650 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788 -MD = 4D96290578D5A6490DC8669D78D79CC6C69116903AE9189D331F8D2E1DEC6DEC +MD = ECEAA4D6F7BBA64EDC76448E105C60802339E09D79883F1F95F4A8777018BB46 Count = 651 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586878889 -MD = 05243BD21CC51366CC14D619D42F96553FBB1374B379F3053E49FBA9581ACD16 +MD = 799419B52050122054DFA6B03503665F46E6C08A4C6125E4861BF63F6B523D7C Count = 652 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A -MD = 97C6B8C40D70F82DAC84D57C0A0EBE60BB33F4455FE5F69EEF72020EB61D07A3 +MD = EC59DF715A993D2E783FC32685F45EC42B8ACFB7345F24BCE79C4143B6CE8C26 Count = 653 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B -MD = 858A1C5659648F8C9D91BD038356A107E3DED705CC1B34BE04152302DB898E43 +MD = D78E322E921B8F6EDE8C5CDFA9280B3DAFB586223DC6B3074342285296B76BA6 Count = 654 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -MD = 99EA521AD0F2C9BACCB8CC4887586BFCE36EE636D714078CB7CE5E44D6F93D7B +MD = 12BB3205345ACE7E0B27E4DEAF1E937110783260D06500C4E4CE6F43DCF2CFDC Count = 655 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D -MD = 1A144DAEE9EA2E903B6D63F634C9E30FBD1F06DAF4A5379F3E8AA4DA8DC5239E +MD = D430112D90AE07E7A4A06A0046F762F94CC2272F33FC12DDC0181A815B94EDB3 Count = 656 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E -MD = 3C8EE787FF8ACDF0DC9EACDD18DAE14A981F6AB960E43854D2CC3CAF04609B24 +MD = 196FBCAA2FFD78F288367E55AC293AB2F202FC8E120621D7519E6060DC6A072F Count = 657 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F -MD = BEF2D21A0B78A5FB36AE8B26A9025DA2662109C2B71B14DA4A941298928C06FD +MD = BA3943064C7566256FFFA922BDB37E31EF7C9F28331EC8F773F9FE5B9210C55B Count = 658 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90 -MD = FC4FC1F7139D3E03025D5FAC0317C619876E99DDDA544282E6F8F1B87A21397C +MD = A7CDB1970B75B27BF13650EFE696B8D3C525D0919A79B216B300FBB55CA15EB6 Count = 659 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091 -MD = E6E7EB259E90B64212793DF08ED19091BB8C4B3BC8B9D3DCB5E19C2356E29AF4 +MD = 0EA49681B42670571ABB579EE285EDD27E0FFF07959594660152D2DAADC8E349 Count = 660 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192 -MD = 5E6D4E3A877AA6BC4D07078F79BC965779F55EC661DEBA7F1D2187A25290EC9B +MD = 603786A171AF87F1FDF3E6AF85454F5B87B4C69405EAA93425C3C9B56A0F2B45 Count = 661 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293 -MD = 7B676BCD71026A2213FAEC3EC7D719CA0446D05215428FDA5C042646209523BF +MD = 812678E87F659F1DEB6ED89EA812E8587BADDF7765F8AB6D32FF1B2A31C5B383 Count = 662 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394 -MD = CA20E184415FCD7ED0E3EF41F5952BA586E538060C3A63400B6B67DA4B8BB8C2 +MD = E8A957D47CD29FA633B60F656F7D09CBBFB3066831389D5DB96134B87E536B94 Count = 663 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495 -MD = D48F185B39E86E8F63BCF46B9912333C65CA944CAC1D33F477D8D334D339D711 +MD = 8194F6A7403F5B26A929C975435460346C96A427B9E3B7E53FA8CAB32380BA05 Count = 664 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596 -MD = E22B0B99E886797957AD45AC3FDCD10FE0884FBD6FD7683904E0F1EF174936D9 +MD = D7CB7B2CB8C6E2FC25B469E68F31957913FABB1C6E97B9BAEAA555AD49B69616 Count = 665 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959697 -MD = D212E64C2B87B2B79B14980461312AD6CA79733C3404D21CD26CEDF42580BB53 +MD = 25E857B5D71FFC1600576C84AF5C07D3DEC1771A879EBE182875BFD45842E51D Count = 666 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798 -MD = 94DAE41284647FCC8D9582292C140C90B78945A30617FC78DAAB75B98B96A5C0 +MD = 7F7D34C75A8451AA9B8B36CDE522DD212C0CA3E986D1D899025B422951D907A6 Count = 667 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596979899 -MD = 4D0C905DBA03E109A64062234A11C342DAADC2DB484BE6A2A218A7C3C5655FFE +MD = 83993D7A1A3332EA158352E2F0A06DA8AEC00C96C26BCD20676160731124AC6C Count = 668 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A -MD = EAEB17154F6EC22E90789B4055AEDE3E1237E75DE5E7ADE63DC81F490C681BA1 +MD = F67DB6E1B7473E0ABDC7AA63EA822D6B99EA885CFA3FC9697D4557DA349AD3B6 Count = 669 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B -MD = A7BED4B6DC76EF92FE58D0E5FEA17C7FF64097486B1FAA52BC8055EE177A5B0A +MD = 055F4CEAEDCAFDFF97D7BFD8DBDE51D6FE45E17C45865D8654B7C71C877DB579 Count = 670 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C -MD = F67FE6865940E2D55B96AABC580365710CDFFBE116C6DA4A1114AD7A28E8F677 +MD = 7147165DA7808865A1B740FBB6836ED96AE1ABDCF0DFABD44FF5EF25B2603DB7 Count = 671 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D -MD = A271149908C0967A36155DA1B3ED9F40506E887EC094F388D8ADEF4FE00CCD6D +MD = A21E4931F34BA6E439C667105C100CAEB733F20AA0DDE7A6CF8166F1DC6998D8 Count = 672 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E -MD = 470BEBF377B777110B259677BDEE0EC981F1FDBB281BD91D11ABBE3DE6B516A7 +MD = BF8C2DE26D88A57D9919F1761925005FA4D75C92B9C4C567C605506D2CD11A66 Count = 673 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -MD = 75022516F6ECACBC931FDE8BC36B819185DA9D94A654EB63B0A0B518F2E9DDC2 +MD = 864F46050798FD46C4D19C269E12A5580C78B1825A3B69538D0D79F35085403B Count = 674 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0 -MD = 9CFFC378ADCD05B32C6249F14C85D60EB76C6806777BCBD09E49C4A9E8496741 +MD = A3AEAF904C69EF744657D2CF2A91D20C6FFEDEB1A252FD2806246DBB60643633 Count = 675 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1 -MD = 04286B5620A9126DF81D5856CB90810683FB88C9DEA528C86209F2D8CB1BE8F1 +MD = 04F03330ABF9C2CD01A76B25D1606D49500D3084B06DFAA56C88C3132D8F7C4C Count = 676 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2 -MD = 9F6AE5FB7C2D26ADADD43A1C896D8B13E5E2CDF0E892E0F7CD4E11E0C293411A +MD = D032ADE9A305B76FDE7EB2249FDF92CA283DC4923E7B208FAE82B0BD7EEAC075 Count = 677 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3 -MD = D3A08FC9A005395D788A1E0A249606CEB493CF89DC5E2B8621820B1E1F85DE1E +MD = 84F48FD9E6535158272B5B164B2D36BD5CE49950087A0097CDEDA2F524E4F13F Count = 678 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4 -MD = 8941B77736B7CDC5F58B5B44794377D038FB8F3650924DB9EC33D6ACD25404E9 +MD = 73A8A4BDDA89DB509FDB9D6C4BE9DE6E849135906F431039A1ECAB8D7A20889A Count = 679 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5 -MD = 8CBA7AE10D4F65B60C694E5A4F32BCBDDB992943124E54054DC6B05BFB6DF3F4 +MD = 7EB3B4B1642C75840EFF70BE50EECCFB1675FD59E969B90C21CD9C40D36F0783 Count = 680 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -MD = 7385BD628475F8E11C7CCC52496CB66CA1053B732EF0564AD025A98360E86993 +MD = 2E438FCCA443CA55E1736837C2848EADF84738C1813C1852A8EC73934888C103 Count = 681 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7 -MD = 763F7F5D1220C9B61D2DFED2ED19DD4F3F58DACE6DA6B20C1FEE156FBA0DF622 +MD = 94A71CFF3C6889F8E6BC094309D93ADA6C5341321FBE597ECBA62AB480668A86 Count = 682 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 -MD = 87BCD0A09B23770234834DB0D7F9F8D79CCF4D993AE719F14074B95C704DC826 +MD = 616721B08BEC53B0053380204EE1B2339EA1A0D7072F63D3109BC0EC8540BA95 Count = 683 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9 -MD = 79B03ACAD669D44870172FCCA9FDE20DED31A9D69FBF0CA5B247FF0408939376 +MD = 7FC74C4DAEE6472037D72A877F02E787AEBC12CBB21138B4FEDAFAFDD023E981 Count = 684 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA -MD = 4C7E5830847A7719811F8418B51F17FC4672866544EF659ACC56B0E5BFCA78C2 +MD = 2FAD1B6E25F41419FF885A03CAFB83C44E9F558C1E28621FCA8A05436078F298 Count = 685 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB -MD = AFECD6F6935F31A5CAA8FD9B60D77AB82592109AB6C3A3BBDF60559A6BC1E753 +MD = 44B48EF8F180FE048EC21CC69786BECC7412A84C6F4E300DD06CF4B37E5C115F Count = 686 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABAC -MD = E615D27803615902DD0D1B6EC5B20EE47F2351A3821F0352903C97F5C87A3440 +MD = C1F559CA36C1CA3161C83BB4E208EFCC9E590A3C319002CB4FD43B751B3255F9 Count = 687 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACAD -MD = 24CFA61D7E3C6E09CD0F456AE215F46FECF76BDC5C716325239E0B81F33FC984 +MD = 941606B17F688D8CE80F7F1B78D6879E9A6DFD77732B6559B166B75A305E8428 Count = 688 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE -MD = E5E32DC4FF42D514C39E25D1BE1808E0275A95B3A5D1F20C8773A18FA732ACA1 +MD = 0567A1C256ACCA5DAC837DDEE694BF404F0152FFBC84440DE370F89E8F7646A2 Count = 689 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF -MD = 1EB91C518D3136F9767BD864AC742ACFDB26329FC40A0F1AAF9284AC179F6C1C +MD = 6508D340FA46166DE0BFD13FF0A94D294CEAC5331AFA5E9D3AF5E95026ADEDA5 Count = 690 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0 -MD = D77C2033D848A00B94324C45CF5C99FA5F7D5D4362317D440DE200DCCE2896AD +MD = 8E374140507326669F99A717194BCE49BB78F185041C3174657C32C211E6AD99 Count = 691 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1 -MD = DCACEA9BDB5ECC6417C69EEA9BDB6DB47D14CC00F013896A3682967E45248752 +MD = EE4C936228E5E15563AD70ED9C2843BD26C22AD21B2C50FB7BB089D9341A9AEE Count = 692 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2 -MD = A7CACD1A250B267F7778CFE4CBA454F44CF7C2EE5B34E11431D861BE4BD94044 +MD = BEEB5611EE300B9A1AA35B3387F90DAF00B2046A732E4650A272688315950378 Count = 693 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 -MD = 0C0A45BABF9BEF5E639C092C3ABDFD3A0CAEF195DE826FB8D7851515B86F1D29 +MD = 186F895D538A787909E34300DB6E74A254F2FDF151082CAC7CEAADE6F7726EAB Count = 694 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4 -MD = EE6A38C1ECF943B0F2DA70E7832E3B1392AE7C2CBAFAE1AF0779691D8DD3AD98 +MD = DFF29BE51D3017F9790D964272728081C23CB383A441AD287B27C20F8C26C659 Count = 695 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5 -MD = 9567D7C5E5E3F95CD7EF4567D04172C92BFD4DB2DFA9CFB5ECF57B181B24620B +MD = 87C37A2565238908C78095EC423E3EE3F7FD1508C566FAED4C3FB138D198BA62 Count = 696 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6 -MD = E255F3E4A2966A600DA02DD25A67392644C42DB64F5BFF8B4EB5317A007BCAF0 +MD = 054796D8CF2FF6A8F89EF38A6DA02EDF5B5DD9642F58CEB777A24EA8A7EE1993 Count = 697 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7 -MD = ED5A80E28E53FC47A7EAF4DB149FEDE9367127698860323DC445C87003CD0EB6 +MD = 93AB10AF97270E7545F48F052C18B3757192B09A1BFEAF94B529DD3F1AFEAB69 Count = 698 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 -MD = 40080FE4960B7B2109E2342B1FF3BEF489427B707340C2F6807520A9435DA309 +MD = A64A0A8CF32B3FFC8C6E223B85CEEF9B46191AFAE01F6C5023A920510A5E44FB Count = 699 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9 -MD = 1445A25E0F722FCEAD2CD86FD52C3D1CBDC4AA05AC3BD2F08C2EA509C079130F +MD = FCE7D678F60984B5D6E345F6B21DA730DDE438B3E381EBBBF864CB94917E09BE Count = 700 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BA -MD = 1D35A029091E8E9474072484A8DF649C0662C40B90D4F2539D25BEFD2D078726 +MD = 7FDB113001AAFEE912EC29333847E8CB1A2A16EE0416A130D6D294B2EFE4BB96 Count = 701 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABB -MD = 561C147BADC91EE2651054A6F4DA441F9D86F727355DADAF35A1C381D8EB1DF5 +MD = 9D4CDB6C10E3B682E8E027C35A94417E981990B3428B11104DCF0609D6D284E8 Count = 702 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC -MD = 9936BB8F000D0AB53987165CB48F9EBEFBA666C4D82007D5E5153615F46A9E2D +MD = 5309042C05A8437113D9962E0E2BE4E72800C688DE2AF88BD7743B08B05BA374 Count = 703 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBD -MD = FDEBD2C4BF98A92E75D89547615373000CDCD042A7606BBE857096B7342EECE4 +MD = 29911EF4EDD504769D7EE2AFF02201993AE94B20DE3695B6C6BDACE774B98EE9 Count = 704 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE -MD = 92C00924DFE905D9220F563253799BE4DA2C5E3EC99F75D5B317CB1D030C1201 +MD = 9BB043505EBE6B7199870E1DACF30FE47493EB1E590B154EE3602E7D2292B4F0 Count = 705 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF -MD = 02FE3E7A6767C2A6508B8589217FB55BC64D1EB93AC611BDBD1749B74E04010B +MD = 7E6FA2DF03A6A020A3A06247AA32FF3D739A09B2F44D7130FF97C95D82A1ECC0 Count = 706 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0 -MD = DFD47ECE5D8CA14A05FEDB5D3CAEE86612ACAE6CB528124425C41AAE3A4ECFBA +MD = 336A5A3E44EF8204692205149B6B3859079B5DFC0F46F1D4C22F6C13C235B2EA Count = 707 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1 -MD = 91CBA2E6F9564F1DC6B0F599AAEB0142C802FC880DEB01206165C668A35A6D33 +MD = 33E89153E0F9B44430A3D4943995E9470C2DBB97F8968DFB623FABF41913B9E9 Count = 708 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2 -MD = FED5BA6A7C2B7A4F317FE9D3489E1B51AF3CD20D965EA2EBD6BD3849DC35AA7B +MD = 8749C81CC588F3292E7B24C9C1E08616B2791523C7B76B984ECE477B67CF7C93 Count = 709 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3 -MD = 1F890F0166BABF427DBB534DF9B9E474CCDEF82212D1BDB9A2AC2A74E21F39A6 +MD = 4B2771B5CFA39CCA3775DB078378524ED9C2DD56FF6124B241282B2089E57F36 Count = 710 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4 -MD = D138553B5F0509EF25B362F4E04DECBD1E45E994FC2C0022C6E126A05AC4FD46 +MD = E2AEE4ADD149A93CB7A163A877F7234480169A5564003AFD0CE4EDAE4463C98F Count = 711 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5 -MD = 337F8753BEA9BBC1808C6AB94062A0A5043A078233062004337221E5ACE8D8A3 +MD = AED51504BF82D193CE438898BDF2D4BEA670F12542AE80D8C903E952CCE0BCA2 Count = 712 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6 -MD = 8FF6CB93AC51B191985423EAD7073C8ACCEB306CFA8E4B6D21A699D91FD67C0B +MD = 765E9512524297397F9A110E1C5364D25F6405031AE550BC7639194EF32D2E6D Count = 713 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -MD = 54C1F74BB602EB5463D0ADBA3E445D6167B2BB09FF395C56DC6ED1A4055A186A +MD = B22F6225583C8C73B2DDBD5B7BD193A8B27FCF4C62B11C59553D42AAC3EBD4B7 Count = 714 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 -MD = 5819036875998F674D722F97DD41138F748FE69017B84EFF7E1F59E50E1FC44A +MD = 72C528FCA7F9556DEF48358987E0C27D2325B6B7E2CF093AFF3C33E6A9C56A70 Count = 715 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9 -MD = EE38373D90D2414B84A823834C91B15BCEBC5E1FC5668C328379E744DEC5541C +MD = 2F97521ADD55F49253AF90297CB18903F1678C38019DF439DEAF5A77523B0B27 Count = 716 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CA -MD = CC0807FA27A0A1F195C4A8326F39D1A126C06257C101D1AF35685FE273586784 +MD = 97A7DB3AFE27579AEFE61B706F6FE7886914388C1C626264C059B98AE7281CF2 Count = 717 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB -MD = 05A76AAFB70488B2393B1DFA849CED305A21B9B7CC1932EA6DBEE263876F723D +MD = 5D89D698B48143DCB651EEDC77DBA5696E23D1F88A1E5CECA0ECC94D48BC8016 Count = 718 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC -MD = CF232B16C39E5C82F6FA06FE7854EA4031ECB4EC6D5E9E1DB26A0CC4EF6282A6 +MD = 2D7F32422C7AA08C5665922C5F85064BA880395D92A94A042459B89D83140ED5 Count = 719 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD -MD = 44D3C0808A546754E6CAE05C5DAE74AE8F35BBE6086A0BD85B382D4B7612EA62 +MD = 4D1553D3B3B0660FBB83BDF5C2855CDAD004D064C63D521635AAF061E6941CA7 Count = 720 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -MD = 3F59EBC38AB9D162A9C33634404A31E8C200ABC1E8747E096DD24564FA001E20 +MD = C0250EE95927ED25DE182C275D385B25B350A2C1C5703FDC72819297991B8C42 Count = 721 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF -MD = 6DB7A6793960F60B649C6D35A98F5AD5B1EF8739E82275E211AD40221B730E6A +MD = 356D55F87A7EB4E65D509779D75C9CB39369FE9D15F078EEC72B58DA02F732A7 Count = 722 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0 -MD = 0CDCD5AD132DCEB9B9C1F5FCAF46B1EBFAF09FA4ECEC4FE498D308D3CF8BBFE9 +MD = 9D3BC3A3DAD0E7DF46815A17B950912A5395665C49B04BFAB64352A51F637924 Count = 723 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1 -MD = 1EF3DCCFA33C2E4703961D59382C03161A81493A925B2505D320FE1FCBD5B842 +MD = BE35E54C7D32D6AEB8F41F6BF011E1C76EA3BAD1AE6469CA813A80199529EF7C Count = 724 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2 -MD = B43485FE64E660FDFB1C210C895F4FF90F3CADF30DC4E418EE3440C37B9549A6 +MD = 635AB25601EE5D5E278A26C7F6DF9A141CDF2EA18A8AB24B2949BE16F0900BF0 Count = 725 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3 -MD = 8AC473F05475F35A43CE205BC37136CC102190B22861F4EC00356CB9AA3665E8 +MD = F4743A3919435CAA70F429C6DFE5AA1C960D37D4E06AD84D1FB7DE3177F25F5E Count = 726 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4 -MD = 8BC188F26887E92092DBC34A0FBE18D7E86D1CF4938C035513B7F5B61202B948 +MD = 43375184759ECD8CDDF5B8D107C087745B6580BD981A39636FC8BD114F46A405 Count = 727 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5 -MD = 5713DEDAD7857A6B83F4BAFE6FCCD2A5060D07B39A738487249F721E11B17ADC +MD = 6E254F9E0B46A5F8DF6746EFE7CED497EB431F5D399926D7563FC3EC415F790F Count = 728 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6 -MD = E2723D52C040A05254774FC7B0989BB5D17DB63BACB9763009D321A54865EB23 +MD = F4C8C939DE6D8888CDAF1CF6B4249846427FFBDA1FAFF8D7C0B3DFEFBBEDF4AD Count = 729 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7 -MD = 9BC6155FCC2A0985C5FB9976605E2271ACD8153C81AA6A9AEFC5286EB24B60D2 +MD = FE863D889F82461A39DA49B5B1FFC80690FE3D2A33EF137B9D84D02DB17575AF Count = 730 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 -MD = A885A60B6D7DEE656060D078DAA0E29155AF9BBD05F8E3E1A332554C3109AFEA +MD = 26E0D349043DA9BB6A02F42E01DFF00A0648CA3268B2716FBAFE0A63BC8EF509 Count = 731 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9 -MD = 53099649151B59FBB1BA76C7123524CBBDD56235FBC9DD4A12FC88E22BDE3C19 +MD = 20D4D47A3B0AD5FDAE7493EDED4A6165888E90573EFC443E3242C58208CBE093 Count = 732 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DA -MD = B8AA98E32052846680D13313CA31BEC3A2184FFE06FA98313D2D23370C551ECB +MD = 5E59BD9A8ECCC743BB06122011151A552EC4AE968CE4588EFFE7474C603F681D Count = 733 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADB -MD = B86856ED0F2146DE3A397FFB2243D8CCDB10FE5E9BF438ADACECDE8AAE1FB290 +MD = 1E04F63647046DFFFFADC5729E727009352F9459F500F1F59D88907B571AA898 Count = 734 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC -MD = 307045D0E07CB54BB71B900B1E41EBA5BE95CFE098761DBE5ADBF5B8AB57876E +MD = EA048B7670FB764205EB19C4EA8AC39D3953D3B78AF05AB18E88B3D6A9D8448E Count = 735 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDD -MD = E0964B097492201A5292A9FE9B14A1B383A8F40813F22E4C1D82F73D99C2664D +MD = 9876FFF70812E430562BB1362BB8DBD0E60906D5B3A2E6FD5652CE60F3E627D7 Count = 736 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE -MD = E2A75CB464825E5F7F3397D99EB906116F69F2FF2EC015E21027E8442A6533B3 +MD = 8A25656B2660EB8C3CD7178DFE1F1313324E262502D444CAACE3F55A960D59EB Count = 737 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF -MD = 9D817D07D285F586CBEB9DD360F1E54076AE6B84408DC718E40AA31463ABD8B0 +MD = AC7FB0BB490242862EFAF85DF7012CD86B40A346CC9445FA0BDA166C58E2CC10 Count = 738 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0 -MD = EFAB0FEEE87CBBDBD625D4BD1CD75A07FAD0B676C421D7B7F2F940287AD6C08D +MD = 692AA3301EEC87F9E56B4D471F314A08BF0FB025E54458E0C67C59DD8A37EA7D Count = 739 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1 -MD = 2C8F2F479A1997FA0BCACE7BD81A794B218AA50E327FEE3C7A42B708DE1F11B0 +MD = F6B4F4E1BBBEAFDE376D2560F9FC522FD6E585725C720F523DD7CE9117E6C9F0 Count = 740 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2 -MD = E875CEBABB176EF863AF36EFDB358569D26F5A3031940A26B5EBDEDF0481F0F8 +MD = B2E5B99C9B1BE90DD4AAD6375476912715E3A725575E81B33C3D8AE7456562C9 Count = 741 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3 -MD = 00C3C1609922092948C3FE293F4EAC9AAC05E3D3B8A6B1286B3A570918B1F4C1 +MD = F61EEA668F805A26285944653EB6A9BC9D54F85C66009393344A7E9F3B77A0BF Count = 742 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4 -MD = D753AF1227C180F500881BBBBD9067EBB3203F5797BC7BC10E29B653D1B62657 +MD = 54EC239BD8EA29E50E5CDDBC65B4ADA1E3769AC90D53F599C7FF227A20BF337C Count = 743 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5 -MD = A7AC6821B19D8E5ED2E7A41C19573D570139BEB3BB84F22780F6CDB8B303A436 +MD = BE535341D54230ABD37A0E74F37E683BF638A26007F0CD30D50DFB55111CE079 Count = 744 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6 -MD = 7F44D2ACAD1AB2CB5CE9DC6A10F76D2E840358107DC17AFC494F5F7958C71907 +MD = 8F2CA0337D7A0E57305C8ACBDD1BFB06A33A30B587701A63B10D935DD8633EEF Count = 745 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7 -MD = 3652BEDF410DC5B8FAB51B99C0A2765326E51E041DB4B8A0DD714CA0961DF259 +MD = 596134B1FE9BAA5E1CF996466DBAC4CEB2F4ED00B8D01E353A634B6DEB334129 Count = 746 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8 -MD = C9B4199F8A4EFFD5912C482A800752DF797DA0CE515C2BFD20A3442C58809DBE +MD = A21DB2E62769919F50DAEB3BB5FFE807E7BD0E4F3AD5A374E5F5ABE2C72A3B18 Count = 747 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9 -MD = AAEBB236A4D517A305935FBCED17807A07A87424547676D1CD436CEF0C534F4B +MD = ED76B54FEABE414B696C92F18B358624EE7B7E57E81CB2FA2E585A048C1E6999 Count = 748 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EA -MD = 7D49AF61C4CB0D14F084AB3D0AEDFF9D2DD295E1750EAC8C458286718F7CFBF0 +MD = D6DBFB4E5F39BBA91D394E2130FCCF28725734E27B955A9DA12D3B9BBD3F884A Count = 749 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB -MD = 02C53FFCB6B92896B40A4171086A4B31EAC73E946A5E88328862F24C12D7B643 +MD = 415F7A4637739416B9D123F70E84DFFDD44A6A0CFF79162E70E85C3860991613 Count = 750 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC -MD = F8C511F9128CB6A7C7F2DF624B90C77CFCC256C69FBBC376E975A824404C5539 +MD = E577A30EBF6C653F28FEF4057F32B0E8652208A782E0447B8E294D2B663AB25E Count = 751 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECED -MD = 9659B0CA542A61BCA24A6880EFEB5EEDF8589DDFC7A0650B2E9B182A940181E6 +MD = 8902F6A96CF4DEE844F4A62F1A54D0520089D3CA16B9D461ABF6BE7E8B0F381B Count = 752 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE -MD = AE7FB03A0AE9A061E9B0CBA723D73C04F5D12878BD60AC0C33E86EC37FCF034F +MD = E4E2C3FFEA3CB6065990E44D0FD751F509F25C7944CEDF400BE8610E4AE6194D Count = 753 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -MD = F50D520C37FD0E548E292CB23CFB85C4DD021B34D58B5DD0ABD8887F64A2A324 +MD = B0221982B8D01C93A617A6F1EFA2D83A6F41216D825B96C9E161BF4BDA6C0181 Count = 754 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 -MD = 9AF935A1AD973B430037639E8AAEF5E49795861D59F1CBBE215FE2714EC8716C +MD = 13127D091074C5236B3273DA5DDF386C6171C5FC94CBD7350F951E842BC13628 Count = 755 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1 -MD = D15025908DD3DC6905626A51ACB1015F49F6A9407206668DD78B2FA134DE318E +MD = BC5F5E1A1118B41A1C92C4CC0AAD0A232E957F4786AC0DCACD82D17DC15D6571 Count = 756 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2 -MD = 3212B636AFC516EB526B1661CD9EA40D86B6304A85B7A76BF5DDF13E05DB31E3 +MD = 25DCC100273E3CEA1A8EC02198BE60ABC2B4864DE3735CF695F00122C78F2F04 Count = 757 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3 -MD = DCBB24084A303882B0493ACC77D6CAA3E48BCD15C5AC04BAC2F6A701D2127B9C +MD = 532A228ED067D402FD038F394B6DBD3891EE0521B27425C3B28BB5821538ED2D Count = 758 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4 -MD = 94F35038CDB789B2AA984B0B3C1108BE31C28B44EC52BB33AEAFB97C8D30C6DE +MD = 7A328FAA8AD4268CEC2F04B915611503EC9E4DAB48D1115457A2DB331A3DA9B2 Count = 759 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5 -MD = 2A1012CFCA0BA756B58C3DCDAFC27A2A466F065DE87CB4B798BE491C7BF55F8E +MD = 3CAFADC57D3B05844A074B835F6E37964F7623CBA8E19AA77CA47E34FE135C94 Count = 760 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -MD = 31F63E854FAA9B26151FF02CCEA7709D91AB290AE7B05F99C77977D70917A057 +MD = 6AACBC690D23D867ED29FCD577F993EA783AA14942C44F0BCA2A8DD8176F0240 Count = 761 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7 -MD = 6D04F909271982D4716054B5E39F92BF2530DBD15D83CBA421C86D879CC8F68E +MD = 0993FE58E56D2D1CE89B81E86CC59D357479021862A9BDB3C855FF7C42685A12 Count = 762 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8 -MD = 7617B901F627C8E205B0696140A2FA3650CCA04C8BA1ABD15525CAEA2088AF36 +MD = 0AF662C795266C63E3ADDDBA429E3B59156EAE2E10BB88A2492B286638D0EF56 Count = 763 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9 -MD = 9A498252A5CA9A1B39E03A5D48835B1847E741C1E0648531313EBC37317591C3 +MD = E7A24747510C889C9BC1E3D4051F85497E9E6B434CF21591FB4B8684CC527942 Count = 764 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FA -MD = 65022913C442FF437944C12A8CB3E8F52A897C6B091130DB2B3838202DD9885D +MD = F873049581B01D4B02CFF10A48C9857AA418B214C4A6805C4CDC25BFED4143FF Count = 765 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB -MD = 48E2F22406589426BEA1BC08D009ECE947EEEE6013F29BC756461438B913E861 +MD = D43AF6A3EE6FA74492D08705F5075EE7174DFF76BF5CF7AF6CA686D000E44EF4 Count = 766 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC -MD = A9AE9ACC5F6412F03A2DF0F81821849C583B7586D28E626BA864B781E845CCDC +MD = 8330A468DBB44B1AA01B59BC18B98CF506C1F88A72503D1BF940E94079621ED2 Count = 767 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFD -MD = 03E616189E538A18996246B65E89871D3E8D7BD61D3CD5911958734EFF938DAE +MD = E719860DE9BD8A9C36F1FBB5CB879E1D42D9D77EFECBC61D16FE2E97462F9870 Count = 768 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE -MD = DA1F0890B1D199E8BFD8FCC9F8E00F86543CCC423AB5C6C3BB8672C89DA6BA8B +MD = 11D95C57086419BCB2368A6AA66E2A8424307AF19CCF24887B728A334B3EE977 Count = 769 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -MD = 1BF588741666ADFE0D20C950415C36A2CD12B4433BFE3870C6BEAD0423C033F4 +MD = A2D08D1A60C03CB315C80336ABEFCE0FDED0FC26E05C7D74821A3DF3FA1C5706 Count = 770 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00 -MD = 96D687EE641127C72674B57037A69D659B723819B5A3E059E29C3BCE23E3769D +MD = 7D134E023188504E566521EF4538C147BD455661E984AC9CC75F1D462B4C409F Count = 771 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001 -MD = 0D4D1DF306A1F6F064D6283D55C7BA6E2F8624C76504D5724302CB63846822F7 +MD = 98FB8FF9B512CF60E92A47EE17A4456853580D1C23C49743E0916D9C7538A378 Count = 772 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102 -MD = 4168EAD5A6423481BA71060BA23496869C8D63111FD863ABC036921CA003346A +MD = 93CF134E016131FB1B7E5082E90A435B95501B6AAF47B8597AF0F8715859F711 Count = 773 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203 -MD = A2712FD159B57DD05B7937C0D577BC0B8B7AEB8FBB9EA8DFD548B8CADC471212 +MD = FA76BAA6A1F1C0929A95B54B1AEA26F1C05B07EC2FA437247A2E5565383A4DE7 Count = 774 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304 -MD = CC5C36E0E829047A7D4B183BC126047E8D023B47E61233FCA51F6D1C93205CCF +MD = 02CEEBE5A280B098C2B0BDA7A349A41E7A7EC62FD1A512BD7563FEAC3C521277 Count = 775 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405 -MD = 216C7CB4003773A8DAADD0EE9AACB6F561B4A9CF1DA4DE5CB98662E649A154E4 +MD = C6C5045FE2F3E31D41F87A5244BC67B686061FD5549AB9EA04F05BB8C86D3015 Count = 776 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506 -MD = 103AAB5ED2413A317232FB0386BC90F04F88B593C52B9D9A98D4A8714D163FA8 +MD = 5A8199504C07C02F1ED4402AF187DE66790DE634BAD44FC4ADFB09ED1B37FA6F Count = 777 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304050607 -MD = 6F92314D5B0FD8A8051E2BDBA167BEFDD594AC57C611EEC4D589F6AE14812B1D +MD = DDEA91CA13DB0852E31D6610315232813D23BAA1B92E6A28E6CA545024C5D46F Count = 778 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708 -MD = DF05757EF1A3B711D22A779C26290EBE6D5ABD8455DD369F226B21E176399EE8 +MD = EA10108CCAC51580EE0D0A8097CB667FDCD11390AF908DCE82CE9F1553DDE9DA Count = 779 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF00010203040506070809 -MD = E0F29265834F941FAC77C7416A1D6A1A4DC851084739B389911FCE5357720F3F +MD = 7E816D43C695724A8E9C0553041A3A60D0A7D129ECE5B54EBAC74F25C59A3691 Count = 780 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A -MD = 31EE9C86B31244EBDCF223826F7A5E0A76924C16F7273C2AF3D6EB136F45ADA6 +MD = 9FA6F31139CA5E0DB5BB8CE3F162AC11CA2CC185EF0BD529E3211B5AA27496F4 Count = 781 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B -MD = 6F31E42E16B24A4692174B86F27C23BDCECA505EBD02F135C0F8020E17B5C572 +MD = B61B80893367D57AD222526398D0B574D891CA0081933C74E184E7E611EBB415 Count = 782 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C -MD = D82C5EB0C668DA80754CC298BEB4F385AC79577CCAD6C0075BFAD48C1B654F40 +MD = 78190A819F7360A85760D41E97845808B04AA1F25483A19B4737382A02B137E7 Count = 783 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D -MD = 1EDB4F3AAD5EF70CDF3ECF134EF9C0FEBC4EAE38A13FE353B9B85721258DC683 +MD = E59DB0C0C10249B8DD72B463BEA701BF83B5249884F4CB697A7DD99A89A5C400 Count = 784 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E -MD = 5F536412862119A63759F097DF58858C6266CAFCE07127B823BD37F5170AA802 +MD = 8DEC52DD6E452CAA79FF3E59FDBD377C17ED6A32EAEB55AE030FD3C36CB072CD Count = 785 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F -MD = CD83B256BF4BE3027C96043D6896858387298606277F9407624BBD4CD47FB11F +MD = 2960488387AC8D47089B230F7E1CE1E40DC762A9733C4E40FE18E2E36822DAED Count = 786 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10 -MD = 7D7CCB021EDBFA9B87D75307030919EBD48EC666BDBFE80DB57F5F29CB1CC879 +MD = 3CE4FD11AD7867D45DA7BA1CAEFFB0F02A9C458F8FDF7F0BC6E1CFF74EE429AE Count = 787 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011 -MD = 9989B9572C0FB4B62CB04818EF8FA97E03DC7CEA983D180E6E60B81397843209 +MD = CE05C25299EE7939E936B31F6724352D7C11F5D5585BAA07E2337929BDB31537 Count = 788 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112 -MD = 117FC04768ABE14467C66471A24A47C86E1E840D4BB4D5495B7E4730C5C19F7C +MD = CEF4DC593BCD406D244773C93EB0B17AF1FFE7FC42B61910A8716D9C7D4BBC47 Count = 789 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213 -MD = 05232C6027084F7F19A839F1720661F8C6BC6671C37DB9ECA3F2647058C5E3C9 +MD = D1EFED2EE3C81A9F8F81BAA91FC2AF78EC232BCAF7671D162AB49B8D20FA6F90 Count = 790 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314 -MD = A49EBC7EF31C02E8FF1A8AA4C2DD36499CB7F65B0F8712044C214B0842B3902B +MD = 066B41DA62DD830E812EB1BDA25D67069038FBF08BA956AD1213590A717FAEAB Count = 791 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415 -MD = 358FC58F295B589DD1D25E5716DCE314BE89FC89F016DCACC91BF969CABEC219 +MD = D17B38E19BAF5F600029BDC0A18FAAF0F2924851AFE8C6455AEBE947E124F068 Count = 792 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516 -MD = 8A6BE649B34C41779214D5B130C6D87B81F05C8F1A78E8F2A8A0E987AC2CBBD1 +MD = E68584BF8010069CDAEF4321275A236A21B43A8F1AFF53697C29FD94A6D36319 Count = 793 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F1011121314151617 -MD = 92370A21BA3B7BB0B1D9D011850984B0B3BBF05A66AD850769A81D95C5C5D3EA +MD = 7555FC72534AEE9F8C704EFB2B4E3DBD20D3E2D8CFB4CFA6EB36416FB0F75499 Count = 794 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718 -MD = D864F75C0CEF4B212E6E05CE9EAEED14904433767E7E68115DF53F68055F25CC +MD = 7145A87390452BDA67873CED40DCD7E7A8D9AAFCABA328A5B3DEFEB938C0DD56 Count = 795 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516171819 -MD = 018013DA299CAC251E07AEDEAEA468776EEEEE5AC9E7570B7A6D0D543A72553D +MD = 8B472C3685021E35CB26C53498A53217482F1C8AC6875F74E3EFB134EB822562 Count = 796 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A -MD = B8FF5DEF812CCA1358A0B29468E88538F57D243628FAB2E66C33109EE6AC5314 +MD = A2F7283679B2F44535B4B35C86FB57CE26EC0F768265E0ECABE685BE398CB08A Count = 797 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B -MD = 6900E4C5C6F1E9CE87EA621D7214D9959B47E07BBDBD4684423496A78239328E +MD = 96D6CC92EC661BB8699E7F56BD3BE884E041F4EEBEAEED81DCD0952867BB787C Count = 798 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -MD = 8B84E05BBA5F3C8A69F1AE637CA26DCA0035CB3E4BD437D9B7D58477E9353CF7 +MD = 047C3E54051F278E6D10E086DAFE998EE9DC26AB116613BBBB9938237CFBADA1 Count = 799 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -MD = 11D393D92D93D1BC41F10C69BF9315253F351E164269F0722AD5270EDF64F41B +MD = 7DE6E9ECD4F4D30F7E6E6E65A235D5F0BDF0DD2DE0D2D840DC7CC8735B1852B2 Count = 800 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -MD = 0517A98C9E65244606A51290490D02A0E0732AC938719A29AC8220C0E19651FB +MD = D6A99C99E709C3C819CEAA179780BA896B60827BCB0220897723C47A6A4A7CCD Count = 801 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -MD = E89C54C47E8B4DBCAAB8BF40A77184492820DBF51E8450AE6572CF83A56609AA +MD = 049B73660000E6768E2958DF8D0BE6F9D5E72AB2913F3CF54919999FC19E5B62 Count = 802 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 -MD = 7B52E12ED894663F01AD7612B3E73F00D33AB950729944C93E787E7EF24D9F0E +MD = ABBD96B579DCDD16AB86CF87011DDFAB90971A373B0C159E8FD5D54C711C49FF Count = 803 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 -MD = 9712D5C2311D448372DF14C383E5EEF8568D00C7D62E3AF2A1F95EBF6B9B67C2 +MD = C45E3C30527558140F01E2056744708B806224777BEBF2F0D2D6550ABA5CA3CD Count = 804 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 -MD = 5B906AB605629E5D96134623C81810F6D4B6A075D0695E319160D4088055BC93 +MD = AE75EFAA1C98327B44603388C766CBA30DCD96BF1D83F02643122D8DC02825B4 Count = 805 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 -MD = 22D3F85574E0FB5488634DF9EA29605B6714AEFA2F85D885174CA4FFAD21024C +MD = BE0CC54F0386324D3A452B0103F4EBB18BD473FE0A341AD87061FF3A7C32EA8B Count = 806 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 -MD = E974FB9EB53B7DC91DE8590CEA71F5B4CFA6E5B7C34104489008A5940F76EA5D +MD = D1A4A4A095D16F034F856981001C91377262CB8C30F876417C13AD40EFF567CD Count = 807 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 -MD = D042FA8BAFAA2239DD667A02C1F33C0DBCDC8A30EF0EACE2981C685A6986F988 +MD = DDC208AEE28804CAA0DEC036524AA213B202D1CFF3F9B92A7371D581B693C9BE Count = 808 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 -MD = EFA29308F24DE34DA4D7BD55E98C2AFE6C7BDEFFBB12AC801BEB820A8FC89B53 +MD = 6F7255BE588528A35B7C83A4BD8FB6964DC14D35CAA042E327A59CF551DED7CC Count = 809 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 -MD = E6BE82A18F9D1E51A0085B6DA572FC324FDD2B8FA448FBA5EC4CB65F580FD7DF +MD = 2DADA798F5381AD393165F401AF7E41DA347A6B3F74AF98A38EA0095EB583B04 Count = 810 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 -MD = C60B21DEC496207800CEDF240ABA7A638919ED399622D0B2243770D13AF40634 +MD = 7159FC60C0C97FEB6685BD9C321A4D4D3D9F80309C13D652E579EE40CD8DA276 Count = 811 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 -MD = AC887C510F1FF84C3518B2E549EC43EE18A148A8D31AF3CD56B1387F6A737B6C +MD = 074F01FDC31C6F58E3ED884CAD7191AA22A55B64E6CCA51971EC610E411718DC Count = 812 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A -MD = E63DF330D29CC3E0773430A69F2AF40B0FBD7C9DA3CCE12FDBAB8F5D0BE43854 +MD = C844DAE5159A444C5AF8E40045114DBF9C2B51862E4EE34BE3D99B60B488F5A3 Count = 813 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B -MD = 52567EBEEDA9C33552D1989F09D448F87A97140D2A3C190AA1469552AF0EA4F9 +MD = 06DC1A07CF4BC51B7A5052C346F25C8CFB9834F30792AE568FC4731B04C8FDCF Count = 814 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C -MD = D9C78BB956868A6C442CF97EF121AEAC01F64414153C36935C5E8B2F5FBFDB69 +MD = AAF75F5C74CBBD819B3D0A7691BCD6718A0FD44DE5DBD43D2382544D070550BD Count = 815 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D -MD = 6C65A77D80C5AEE0E59C15859C4BF167AE1B0A4A3F400584C7C4842EBFD7863C +MD = 453BB4C9EC201051B6EECA2DA37B38017F6CB827AEDD117A34C3AE4E81EE09FA Count = 816 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E -MD = B380F498E056918E3BDCFE6D5C2D2E2708CD4310ABCCEDD8720A03454287E173 +MD = 2241BDD7D0CE92D12E5CC0BDCF7FAEA256179820E21BB314B60518A24A79480B Count = 817 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F -MD = 8BFC327C5E88F63D3991230FC7190B27C4B2CB0403A48BA6222D254E20E70C94 +MD = F1C82DF36BAF7393B09C5B161B607FAE63588485AEB2E9AAD15A4CDCECC4A4A1 Count = 818 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 -MD = 43604877AE39A967A39439DCC1C963FDA62D0BC4806871D89AC3D1A7C19DEDC6 +MD = BB74324A60723DC53709AB055CB851AFC1CCD3C806ACBD95C229C372751067AD Count = 819 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 -MD = A997D755564607A3542E11C36CD4108DA2483A019934646F87BDE88DFBE7F588 +MD = 104C9A9F7C8B937FD358F55DD602859DC1FE9C37FD2DF19E1F5D405AEC0B87A4 Count = 820 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 -MD = 4CE33E2B692C838E87EC92E172368F8EDF9249A7959F4877CA64ACC6DEF9AABE +MD = FF2931A8A18204A192AA4260A0D2C65B2C01D3BE9B03FF81AABC401BA6F0951B Count = 821 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -MD = 7E636C887E4E66B83B139D576DBE06523AD761F069D6AB6515A91F1A66817DA8 +MD = BC4AC7382C108401AEF6A81292C04AFD72EB89EA72F334AC4FDC562A3EC4C402 Count = 822 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 -MD = 9EDB15AD2CC0047DE881AB56ECEDD5F107AE6AA29F4ACC18B29F6A2FE5475FCE +MD = A4607F49BCD676E69341B680CE9D30B37343815A86101998EFB7245314DC135B Count = 823 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 -MD = D2DA5F39699A6C8E9DC7C0EA27A708C44D7953EAA61E2BA95EF627E44C150384 +MD = 1B00CF2B95C30951DBA28A1E500567810C0AA41F2E7713CA6C495C738A3C03C4 Count = 824 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 -MD = 89EAF481B015A39517A0752F802AE41590F0B5E010F2DD3739B1C47E9D2F7D32 +MD = B7A984D9DEDFCB5C4849A7AF945E427DA42864B36E99806B4D36274ABA72C8AF Count = 825 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 -MD = 99FDD27A2EF98E4A94E22504D2EFD984D844C02104E0D2493A891776CB3860DA +MD = 72B0BCF39B41E1BAB569D79981BA7C8FEACE1A4905397352BC485CD9F4778FF3 Count = 826 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 -MD = 4F3FA3D7E1316F38D15204B8D05DB641FF771F6AE8851806F50798CCA756A917 +MD = A40545389DBDD530957C7320688FD83E2DE6549255036D9FDE6967DC68EC31D6 Count = 827 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 -MD = 264FEDB422B45C130A1C796ADA9BD43AD736B07EC8B79297480210A1B9EB0FC8 +MD = FEBFD44AA17E55E002D281FCA1ED1E469ED742DF9AEA537606B8FB99380D96F3 Count = 828 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A -MD = 1ACD64771165FE53128A877AE5911291106DDADFDC4BBFD82096B59895CF8A9B +MD = A1437DB6D25044E332BCA417B39C94E283C6FC7023922C05911C4246459B8BE4 Count = 829 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B -MD = C20F88EE49590FD7C87EBE271A92C0EEE09895C92759B5331545D7D552B56417 +MD = B08530DE8C528FD7CA3842B890C8E023A3B330F3A72C88F6A9F590561A80B121 Count = 830 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C -MD = 596760080166EC271E2F7362ECF5308950B102BBA483CBB1B1CEEBAFBCE77656 +MD = BEB7438B9ADA26C06BCD72DC10ECD36C0E3DF62C7D46EA366C7827E4EDD1237B Count = 831 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D -MD = 162C3C1EDC004EA302AF17D7702D529D0E3290464BAFE4D49C8660430A7E5C01 +MD = 3137B3B4D3433108DF77600ED53411701940B14D7F843F9A839D9D38A5A871A4 Count = 832 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E -MD = 5DE46B604D6AD6176527DC01E64D99890204E2CDB7588BB43592A4995F5D0D5E +MD = BD163279248B8A89ADC6D35598B3102B845042BB4411D1C31A0C8B49D899BDF3 Count = 833 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F -MD = 875E28273AC286B2A45ED13FE7B5B7953FBF6D2AEC3AA3DB7B020743496B5658 +MD = 27E7ACD9E164B67654CDC36B68307B61D0CC64DD2F7BF34BF44D8C2534507CE9 Count = 834 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 -MD = 9EF410E1C00C1DFECE00CF11C36924164C631A29B2A373D3CA1B8CE8E80BFA72 +MD = 26F2E9CE28F55DEAC1CEE9AC9A50BD062686AA8053D0236A5C53D784AD1CFA16 Count = 835 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 -MD = 453A507D54A482FD8B1FBAB77490E765EA5946D63E59E04E05739AD0406D8ECE +MD = FD169F4F8CB7483C6738872103318712558B0263FB2C6A760BEA3993B21808E7 Count = 836 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 -MD = 69030D0E26ADE975134B495B7A20A0B37A3A0E05FCB30D81CCFB6779C689835D +MD = E23657A2F31EC3190BA2D40175E628D8F836B81BA3A850B94BC348E6B97DBC5B Count = 837 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 -MD = 0702D24CEDD565CA837F368A5D3A6383D05197B2EC6D6438B85A6F5761BF07AD +MD = 602F44653645F2BD83D17122D38671746AA609CFB0B8ED60C6979CB60AC88728 Count = 838 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 -MD = 01BF20AB8963603A359EA8C50E4A7C789A0B2D2B8EEFD2E274A44A70D71042C5 +MD = 596AF38EE0D393927581B24BD0DD305C6015609B6F503902994A5F2B77D44A80 Count = 839 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 -MD = 2065E7BFC1D6E223C602D167AA8D7E3DFF0C564EDFD2697B25F614EEF589C4A3 +MD = B0A30040639D60A744A0579964D86728B293B854303C61375704483779F7182A Count = 840 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 -MD = 14C6C4AC78F342CF7FD24B0CA9C91177A8E184E7B49D2D00C4AD7E86386A3EB5 +MD = 53818D3A6AEDD934FE0302C9B39A45DFF0C9CA8240FBBF3E90310E8A523B80D1 Count = 841 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 -MD = 9B1A40679044FFBE78438EF213175B37472F6D892C7B4CCB1951A3A845E7D779 +MD = 90DC74AE0B63F239704675062887A44680810730D8227BB28E1C70E2DF45C371 Count = 842 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 -MD = ECB58B1F64150FB7FD7383F33DE4533AD6C76C6246087CDC6852899C81A95DD6 +MD = 7B72ED7513A775EA3C5E9801264D721DCF51878EAF93FF2EECD9B5752CE12151 Count = 843 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 -MD = C46F4F50965557289A1CECD5EDFC9CCE5DC6CFC3D1A90A0409B9544ACD8371D8 +MD = F2E57E6BD01F5F102D2A86FD50D01C50B228E38CAA7F40BE4633621A46DBAC2D Count = 844 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A -MD = 49F5C87338E21989619260389549D69DEEEDB27504FEE6F3BE26D30B2AB62382 +MD = 175EDA8C86BA9E627503EEF45CCFD9D9B5BDCE5794DD87789EB60EC016C7E1CC Count = 845 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B -MD = 94AA8D14F556F137E772E9D6FB97A66D8F82648A5DB9764D3CA7C01361A2734B +MD = 3AE6C03E149EDE6162CC81ED8399EBB5E4785D683C36E981503CE96F69EEF20B Count = 846 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C -MD = B195DA72553E2944B5946BC391FF8DD4560FDF0D8E21E37AD2D72F1445855C01 +MD = 4B5ACF787DB84F952F4131B2615ADB9EDCFA784C832DED53B78367FCD04426C9 Count = 847 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D -MD = 6E88D0CB47DA017C4D6D860E6009D8717129121BC4130EB69E01CA87A3481A7C +MD = 867B77FB6276190E9F813B6225311681469935109BA2837DAD9388679A655087 Count = 848 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E -MD = 7A890DC33E7D099513BF441973B99789E1C41ECB02403B381BB9E542886036B1 +MD = 52D4C490BB6D6A46929BECB8D815E0C606CCCFC9053FEE29C14A6E3819A7B9D9 Count = 849 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F -MD = 9D40E11BDFCCAC26F784E375F68063466818CAD45B88CBDC3D288C6842018697 +MD = ACC3C7E31B59140709A87092375105064260F3557D5139BDCFA2D6B86E88E736 Count = 850 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 -MD = 654936F9C42C7A88819EEF62F37F3D4CF108808E56B56C3DF15B2F627F060A12 +MD = 6566319852610C92864F58C1F8D03F66E34210E29C6577EEAB917CDEF2D61D01 Count = 851 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 -MD = CB5339797FEFB734D7D881B5801FA5384D1472E915E7A179625F24070343A496 +MD = B25CCCD6B9ACF7AA6E5CA9730638B2C317D6A5BEFEA086F7017BA0578BD7766D Count = 852 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 -MD = 425C23F034C7EA9D2C8C7E63219E5E4D9212056C8BE5FF4871E82CA7C7D3EA4A +MD = 13BE651474B694D170BCF6B259DCB69C15157151848A2D2195BB877E7766930A Count = 853 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 -MD = 64D049F909F3F96645A2140C3B9E135DA6C141F571A6731416C818B53B6B0DF6 +MD = 74B6A5FFA0235A119B395D3465CBB6A0769883551AA487B9A983877D2651D877 Count = 854 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 -MD = 031B484CE4AB7660A613EB882FF580FD34625F5B04E57D965F6309F1BCFE01A7 +MD = 1E5927C774C51816FF4796AAF203D111960E8487E2A1A5DBB29FBF153A3E98AE Count = 855 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 -MD = AEC8AA71C24E1BBD534FE435CD87F6F4D170204F04FC3EFB154200D2E8DA3A49 +MD = 73AA749044F39003D0ACB93F388574F7DDBA9A4F30D684F848265D8412C8E988 Count = 856 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 -MD = 3B9DCDE4FDFA156495263ADF4E61CA2BA883C7DAFB130AF35BC42B9A0F1195A4 +MD = 8E07B8A7B6439D2453CDDF7BFA610449858B72021B98B796D48D207D02412D1C Count = 857 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 -MD = E8D006CF907DF9339911A472D4C94E8577BCF0D508605C64AC18F35AFEAF503C +MD = 47A6B29AE204C04A3954F5B6289CD54F97DC57726C2F6001540280E4ECD10268 Count = 858 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 -MD = 2E4B97BBF1BDCF8D3382B7A335EF496A8DBBAA6D79E3B997CC342C32B19F3745 +MD = 0BC279D77FADEAEED966E92EC75D9B6C0ED309270FBE4E2F431947A3B4456151 Count = 859 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 -MD = 2429A8F9F21060210F8A6B6B5800E599E4F41A7CAE65E6D7F42F8A2F9087174E +MD = 0F17B3E26EDD8FD62337AEB71381F8DEAD74C025C35AD8553A97FEE5B7260A75 Count = 860 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A -MD = 47FEE0DCEB7DD0C5CE414840CAB3D81DD60B620B873750063BFA16223A4EF3F7 +MD = 510C5F5E0F7F31EA444201834E9D8BB287635A70C6043C3C9D9C71DDA18A6C58 Count = 861 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B -MD = 1FC676ADEE2EB605AD2BBB8076DE3D8EF4090CCA5E2FD98DDA176DE981D59752 +MD = ED59A633988316E68BDA7DF2232D6F80A0AC2910082D6A21960ED03F21355253 Count = 862 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C -MD = 1AE8C541E51F90AAEB6F57488529763609D778BDC9E7823225164550FF3ABAED +MD = DC090CF6F368E23B296D2AADB55630DF51A6C03AA21CD4C8F304263F9C1A3761 Count = 863 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D -MD = D4CB91C44BAC878745B992DE2A696B3F223A132D441ED000F00F2D6678D9FAA2 +MD = 9DA760B77826DC41B8EAD6FFAEA5009DF2824E401D81733EA9173665D455A027 Count = 864 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E -MD = 3525253D90E584279875A13AFD831BCDF3729BA40570528426E82802019A4CFB +MD = D52E12E7FCDB1FB9A41C661B29F4A28B98A59803EE9649186383EBD57234A02C Count = 865 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F -MD = 4B56F7734BAA2979768F5EAACBC0A02B6FD17A6796981A71EB81E22CBDD0A2F1 +MD = D9F142250068E74E03D4958BFD816DCDCB76E5BF9D04D1B5B3FB14C427A700F2 Count = 866 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 -MD = FEFCAEB17F9FEE4E6D31228542FBCC2DC582B004BD555B884927BBFC28822F73 +MD = 56B24F84FFCE1A6AA013E059BE68156354FB2BFD3BD01C05D03D694D3C4F18C5 Count = 867 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 -MD = C0B2BCF7B393BB4FC8495399749A8EDCEFE5A9D63ACE2F585970B20FC4EC81A7 +MD = 4CB3C09760766672DAD64B8AE3CA49BB688B773C66865134F0A39CD0404C2039 Count = 868 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 -MD = E3947FB734F48D6265E4493DDE1E9F462C39E68EBC1C8A604AE8F9AA2A6FF00F +MD = 9A2CC4C1FEF9877E2518EB13FFECDEAE4E9E57823ED7A57C59D33EDD48CA3930 Count = 869 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 -MD = 3D3F3A7593CB8546B38194E590BF2876DC38BB6FB2B5E1CA6D99450D1526CF1C +MD = C05C91314D88B43E3DEA5DE2978D42E80EF2270B0166707E4600E83BCA6C9C5E Count = 870 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 -MD = B978FB5476A1D879BAAC417C007513DC989B69F0DB1E91DD76CA7A42150FC455 +MD = 2C4A19CB912E51B534F51EFF7AFC4361DD79ACBC2BD03F47F1BD848B17D4D086 Count = 871 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 -MD = 8A3730ED161A890A7232BADAE73242745B92C8AD851C4F83829901685C47086B +MD = 41819B3DB78EB0ADFA53426D996FAC7AF521EB7263492FCA8C87A74E0CDB2158 Count = 872 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 -MD = AA96752746160A01D2E6F56AD48B60B848E5CDFD6877B57DEE69EB6B96AB49FE +MD = E7DE950E3AB764760B3301B6995E2E9D9AF1A31D9F0C5C291E8186978457D8C5 Count = 873 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 -MD = 7C1528960BC5FA4BB9E7B450B5D891BABC57898C86017C2FABD2E5972B891546 +MD = B8D7CC224DBE4D52A39323B2908A1972110222030153BE4962E468BAADCB879E Count = 874 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 -MD = 523650376E4B2C473B06AA9FC1500EE35BAE281009ED56575E6F3457FC84EF87 +MD = CDAEAFD3770B6E04B0F79AAA3402F5767AFA46D69CA55684DCCBF0BBF3CDF00F Count = 875 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 -MD = 9FBD68672F3A6FAE60E616FCFD216681B9D486048DB9662ED0E4801E85BECD44 +MD = B6FBCD8820651AAA6CA7FC8B4F24BF93AEA08C4E8317C2F74FBF83C9D9446D9C Count = 876 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A -MD = 85E1E9AF69A9829D3CF72378C8BA34C27392CD578CB732F0C93D8F23E9A16EA9 +MD = 6D5BD0846C8D320275E0BAA9BD9B79BA35B125A99C1E15C4651B3DD7F2917E17 Count = 877 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B -MD = 50AC4C6956AAC55BDDB5477C3E4A7EB5158A4C340CC8A4E6FE355DCE3BFA5763 +MD = 5AC2FAEDFFCFB64B692D8D358E7B2A16D480FB2177E44DAFCEF2FDE932E08B65 Count = 878 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C -MD = 40D03338E7EACB9A35E00AEB4E83656860CFF73F77E014F94F12FE07EF95EF96 +MD = FB932733EDFF61FC051754731469987EE616C450954D1959C0E7BB7C0AD4EE04 Count = 879 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D -MD = 0D8DE4F9B9B39E1CBB545ABB13BE9B1BC2A4088D2444C5C63FB573F879B8F79A +MD = 0496B1686CFB425398680EFCAB73D56222C2CCE4812E9CF59DDF778C0426789B Count = 880 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E -MD = 9740F2BD27A922CA3A8469557011577EE44A8B154B1DCB79A0E0F8C9337829EF +MD = 1715C5AEA99BDFFA35931DC4AC342FF65F0C8413E0291A0702D9D0DBD6736F4B Count = 881 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F -MD = 1A96D6B810AB743618D338AC17F9AE36A42B8A12AC996B637C238480588B3AD8 +MD = B5EFA59B5227709440F107F193C53D1D7566E8B18C91322C21FB4FFBD0300779 Count = 882 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 -MD = 1B82264336A0F51F4F891C0FBE87B1E6936AC817B0D7528C6DB2FF77CBE73996 +MD = 1659C62C1BCA83CE49692F68364C9F82196C80E9710D2BBFE8EA0798BF5D0599 Count = 883 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 -MD = D6040A76F09AE77F338A3F9A8ABE53A668C16B9CBE45C5B053F7F7DE333E5129 +MD = 426C80F10D0B2F32D225D11743F0D8ED64E997AC6A46A0B5648D2B2199E2E053 Count = 884 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 -MD = C95B1055E2A85C33D08E0CA699AEB5F523D6FCF7FFCEF3A9B9B64EBF5E650D9E +MD = 2D8634359D43A8B2B627A81F3AD96C98988A8BD5D6A99DC8864BD3EC97815440 Count = 885 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 -MD = 1CAE84AEF888EC8AF42070B434A36C01D512759D23678D166B9646C5F2AA5842 +MD = A0EB4DFD2DAE04D33B2FFA538C0D2EF96688C9793AD8C0427F9851A562659DF9 Count = 886 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 -MD = 71B3FE7331E8A991C74E3501CDB1ADD90918B6870E216C706984F8683ABAAC60 +MD = A77865F7C78FAE776AC231CE317C42AF7D07F3DBC8991BAADB2F768B05BB0B2E Count = 887 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 -MD = 85ED01DBBA0413824D1C7AC40DB305C791206F0D49364D1B8D7F062F48666ECC +MD = 7A31EE023C741ACDD691C3AC30B1CACBACDB565715EBE5F33B077E71374EB50E Count = 888 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 -MD = AD9175F23C82D916C5C79FCB3CAA855FD615FB57770D0C78014310F9B8CF10BB +MD = 78FC88628CEBAB0E47DC066ABF8CF36F408603AE3A6D64E3F2F4615545EF302F Count = 889 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 -MD = 83E6B5E1B4A2AE1150A3AD3B4FA358AD858F7582642E7BF9D4B35B6C57B4CBB1 +MD = 6832990074B9D29D387CD24CEA20B56179FE42411E6216163AD6EE0390029772 Count = 890 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 -MD = D96A5FACAF37043AF6C375BFB185D886CA920A153C63AC0F36A7D4F8A5A73655 +MD = C7553A07D8D5AA36299C597B40AA28B342603FA0DD877F97C6084651595D3D01 Count = 891 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 -MD = A941076C348C75D43B2A983131654597E9AA63D1A8121F4868F82D303B5C0DED +MD = 7A07E4985872619021F2A2C7B5A3E7D2B2F2CCA9AD21DA4A1F6DD01C7A7DF51E Count = 892 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A -MD = BE5C8AAC6334129DFBCDB55E2C90DB23694CB70DAB9EFB51CAD6335E4503741F +MD = DBF6EDB5A4F722B88B47F48A580373C4053006426878FE4E420917B21B432A18 Count = 893 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B -MD = 431AEEA851D735BA892E323CA18936370907F97F0C1A9FB23627C7D98737B34A +MD = AFBC9F91CE0C48AF38778A88803C1A067583628CE88455BABEECA82CBE33D1AC Count = 894 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C -MD = 9567B4308D8D97DC549939D6B64BF7A897D49480A2B03C3AF4061FDCC559E01F +MD = D1C719295A66342192F72BD9C2A9C65A420D2B4BF98A665EBFD490594ECEB4DB Count = 895 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D -MD = 8B5497E98EC8A50A32AD307AA65F62517BEF80E4E76090835A71FF2208333A88 +MD = F50B2596DE0EE8EF53374EE7B80BBDAFA997BEB1C2A44E13A578AF3D18946903 Count = 896 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E -MD = 8893E0481E04FDF83C877D9BE079A6D501CC861FC636A3D3DFD9E1C9BA64D9BD +MD = F59739BB6F21C392C6DD247D1F40D92B4983861AEE7A351DF5D389B68C08B9D0 Count = 897 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F -MD = C91A6404953404019F2134EBD03DF2D135CE9A1FE2D4CE0135A28C90BA244521 +MD = FCCB62B56918B222EF46FB0F23C17DB4DE84C5C19A6AB126A122A846B8707C12 Count = 898 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80 -MD = 6E20E031D1D71D4A8716107459602E2D38044B3D2CFBA453E81B288B839DBE95 +MD = 197D646CCD707C5B76DE037A5CCEDEB7CB7548F44174382F88198AEC2701A49D Count = 899 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081 -MD = D72F86AF9BA8544D3F80E8FAF3DF34175C0FE21CD86A34C84FB09473314D97BC +MD = 5E4DCF40EA66CEF614F9276073CAB2D7D52DC4E3F5DFBFC206301DB7CAD8253E Count = 900 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182 -MD = 6CCB5EE83129A1F3836F667575000982DF177B79F9D135D3BD42D8937252C3B0 +MD = BFBAC14BFE30D9C64FA17AA453F4A4A0D120C81AB7D09BEFCCA035A232D84807 Count = 901 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283 -MD = B6B29E714123396F5CD1D87E01DCC9459E460D8F605B9AFA8A6E0B638A387935 +MD = 3BFBBDBDDD1768C65F6F02493734E40E1227A3139E5FFC7090FD6B22016F7EB2 Count = 902 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384 -MD = D1DEFE431FD5094BDAFDF7FA5B995DF8D31C741887333D14DE090C0148C4E5FD +MD = C9DEA9655910B7B0711488E1836520DA93AD23DB920A74182C5D02D6C88210F9 Count = 903 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485 -MD = 88AE8C3EADD1BE0392668107A1CD2487BEBF3DA1E8FEB8F439F2AB3EAD78A3D2 +MD = 87C1D92C61D4403664B4CB41E170B1CE480AA9B30B1C3759DD93EB3083392D19 Count = 904 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586 -MD = 92FD8E4ABF95FE8F567DC14D10710374781C6EC2340F51F5A830FD2F65B2047F +MD = 5B747EB5547C9540181A7EEEC7B324150D395C5CB58B68F608D949E36FC3DC08 Count = 905 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 -MD = 630280CAF353B2DDD7D06F33FD777C6E2FC71B30155A99BED3C89AB9FE61A20E +MD = 0064FC508DE16BC4B94E384C61C137BEFCF4EE06F06706F7B746E5A7EB79F7F2 Count = 906 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788 -MD = 4AAE3944BC8FA9DE78F952154FF5BFA6A969D1FB122A85EF8C78BE058E4B4F09 +MD = 2FE94BEE5F3FD26D63DDF0A21197E27C62870886407379597A99F4F2C4179D53 Count = 907 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586878889 -MD = B2CEF4648FCC8B4D988F09FB0F8641B8A01FC9E1D599B5DFBA180B4C6BEB1264 +MD = 4C6AC244044C7137983011D2EB3A1FBE5E6C53916D924BC00F47DDB85A691D53 Count = 908 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A -MD = 1D91932E5C9AEF8B2AC5036272A2B39A8498E31A6AA937557614E974D456C148 +MD = 7100586D36155399CE7D5F9B3AC8AC6AF159FA6400842C86DDA1A0A5F63AE602 Count = 909 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B -MD = EFBC7E0C0B4B0D4B58A5EC3E91D4C30A5C0C6441BB26F49B6E6556EA4B5D805D +MD = B415CE0E96EBB695C4EA47774F5B36CFC3BC30927086C4B0E0CE13B70737F9F2 Count = 910 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C -MD = 60A5F50727712231A9E17C0818C275605C70A5338E5EA01E9AD928E8C97F5C48 +MD = BD82A3AD54DA4B37F1024826E1E465DE2139F1844C3EBD1F3855C83B02B26F9F Count = 911 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D -MD = DFB4F9F7B47C84AF8B49455E8FAD4CEFDCC40171EED9231C0B4AC897E2257696 +MD = 0023133ACE99417DEB1F657359AFEBFAD2449174019E66B63AF0354C1ABB6FBA Count = 912 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E -MD = 9C221B0285C0CA4661D00EC67DAA9B39355E8B87E7584D8F53AE77F8AD5E70C9 +MD = 98195CBEFD326EA827BDBB5B4133BCC335C44F34D2984ACCCA281990EB132077 Count = 913 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F -MD = 29BDBA08DFEE3ADEB51C321475B6A52508824A2962B5175DC55A8473BD6E086E +MD = 7C823511C662740ECD928D1FC364DD1076A5DAD6E37FE2A00F71494B2326BBF5 Count = 914 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90 -MD = 7567644E7D5853E6269A8E87734743191C6D4C667FB5A17E27969D113173F25B +MD = 012AF695B13DD2E999A384C1875BFF1F25F4A68EC8C2F732EF48B4D81083B6A8 Count = 915 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091 -MD = EDB14E3311AC86E9311BA8F3CCCC9F1C695A375D587127DC5DF11BAE0987A578 +MD = 998C39031D0DE9B85389F5E4E164B2EAFE244B0FCEFA837844F5D7185BEF3AEA Count = 916 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192 -MD = AE7F30A89AC63092C0E925B833603C312617D6181463B2570B715CFAE672ABA9 +MD = 40C75167AC7C7C6154A859F8826C99D4D646D464989C34524F011BF66232E07A Count = 917 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293 -MD = E21AA988B44BC620E8706813FD1DDC6DFD36879A14BA638F20116FBE85886B02 +MD = 091262A141EAC49498C65904E3CEABCB4100FED8838333126F87F9BD5FEB2C8A Count = 918 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394 -MD = C8943FCE546DD991483F0D40D660B5DE6F993B46EDB03D8DA5CBB92FBD1C5F89 +MD = 14601958E04154D5D70ABC4A70A71AD9AD5A71479AFD0D303D4EBB5B2DB08AD3 Count = 919 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495 -MD = 173210312C7B6172DF55404E86236508C2AEB1F6104ACE65FF8E918CD5D9857A +MD = 27ECB0C69CFDB486A5F8F770F0DCDDB0467DF3D5F4BF2A6AE556E41AFFCE169A Count = 920 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596 -MD = 29B3C0552ACA3AE9B78AEC864F428A6BBA8CC0D96DD20E3EEF867725EB23BB14 +MD = C04D7D77A240838D26932A8FE1B201C3CCEFAB2AE9DF25CF00F19AE7728EF10A Count = 921 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959697 -MD = E9AA6E991CD465F78D39E0C68A057A2671043C41C20EE20F8EC90E286EE8ED75 +MD = AC36593CDB765C3C0A00205E18B47A33068ACACC7B60AC8C78DC8307E63B7DD2 Count = 922 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798 -MD = B9580D031FBEE5C2599FF79138AEA0FAA92BDC1DEFA24037DCA3A2FB07DC49B0 +MD = 71CBA83F5C4500B6CE6C425941A917EFCCD8A21EBAA0D7828BB0468708A95171 Count = 923 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949596979899 -MD = 5B1047B9B1FCBE76B2B22728C09D9EEBF61D22F4CB200FC0A41D15F8D6C878F2 +MD = 2208EBA2AA1A2B0AF0B06EC7D0017E807E8EDED1109711E761DA8057A73726F5 Count = 924 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A -MD = C4DF68B1CA83277AC6B02E79ED25800D4EACFFC46F9AEB1D148A7F25DA9729BD +MD = 67C887479A097794670554B973A68943FC2FA2D9E6A70DB598F3907D9C43E827 Count = 925 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B -MD = 70B0955104796C107D6121EAA67C7C3EA1EC49DA574FE894E15295463789DF3B +MD = E6A962E6EBA4F47F97C9D09DF08D8E157316BD4866953DABE070A6FE4DB1F3D4 Count = 926 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C -MD = 6E9D66A89DF41F85416C59FDCE381926697B38B0CF98D0481EF645C2642E10CF +MD = 75195DE2661DCC5D541AEC21371CBA4528252BA5AF853C80EBD13EFCA697A1B0 Count = 927 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D -MD = 4E51E62F61EA498BFF4504A999129FCB879F056B9E5F86BAB7121971C779F84C +MD = 1919CD46A72F3B7287A4823806A6AB83C28E1F5F87CFC71C6AE3D6A1A4BF1507 Count = 928 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E -MD = A8DF739A924F494FA6EE591EE9BE5ED69685FBCB353450C396CCE8C7D8FE1A75 +MD = 5050AE39E66302EFB90908A2F41AE3CBF272EF8927979BC98060635F84C3BFB6 Count = 929 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F -MD = 0076128EBB20CB511C50A820596ECB509B2979FD7017860677E3E183310EED66 +MD = B2F6404E26A823A005339203559C6CB6C7F13EA3C375528F755EA224E6545A41 Count = 930 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0 -MD = 6683279D3E1D35AD8B1F186E788627AA80EA71E3D049AAC905B41A154BC65716 +MD = 212749E09A1BB6436C9ADCCCE353A3BEA3CD383F8D3994C124BB4BBA2C521800 Count = 931 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1 -MD = AEE5371F13BDDC822BDA557C938556A72C521BD32860E755EABAB5BE20A5CEDB +MD = ABED59D0E8E2DBCAA05CB3E444312F709F82EB4AF00B51C529DB6808B27B0721 Count = 932 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2 -MD = D2EABA794E4BB5DD61BF035379D2484DE4F5FE0A4FC956AD62DC656453C533B0 +MD = C3785B0CBF3D5C0D1BB0136A959D936D0F76218041ECCC7D18137297BC188878 Count = 933 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3 -MD = 146108953C8DDD0D24AEFFAAA17925C020DE02E8DD17DC1106177BCF056AE8BB +MD = 20BBB1172682BD3855266B89E286EFF2906697C069EF00A74AE95DBBFC6B9FB5 Count = 934 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4 -MD = F3A0BE08D24B92E3914F22DAE4B0807B967FEE25DC3D2F013649CEA167598DC3 +MD = 9DFFEBBA0D0A0E1D2DC09E3B81AB795196BD8E5D4440D67C1172EF7B07FEC7E2 Count = 935 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5 -MD = D5A8A229BDFAF584F7E47892BED563B1A27351B233944D4EC94897D2F8BD19BC +MD = 9870D1FCA78DBBC81EC1368760083B89AED83D4E965BD132BC5A2EA0D270E92E Count = 936 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 -MD = 5E8D0DC454FC265B1A238DC0B4CCB8C11EDA97105236A931A09ED5D636B1C95A +MD = FE5FB0CB3561157DF737FB009C5E1F33317B65A7A4AC04616F56F1B00DE27A87 Count = 937 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7 -MD = FE717CD9C785D75AFE2C956B38635A29271937BEC1161E02F3C5A5F52A2B4CEC +MD = 09D6BFB9B30929B0D9B5EB0EF7442D2534A2935932425CACD76A551EF8394AAB Count = 938 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 -MD = D7CEF74375ED94849985A29811208014F877F63ED29AB568E9176C9B9E4B988E +MD = 755A378CB5C7CECA09EDFE563A8992077F6C105EBD5DAF973BF28A1801ED97FA Count = 939 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9 -MD = 2EF354901AFD01F8EDFB59E168F74AF79F99AEEC7A16F11A40ABB56DE8D43225 +MD = BFA1BEC8D1DF027E3940924F2D08773EDFB4D17CDFA8A75929123E5E370F9221 Count = 940 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA -MD = 251DD1C72A0C2D6BC18466F3B1B286CDAA8C48100BA4EC0FECF38DC881B056B8 +MD = 1BD552D0F05EE25EA4B5F4ED1D044A8BCABD90EAFF80B3B5B1C147A2F388CE5D Count = 941 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB -MD = 230B106D87C67BC8CC99346514D54461E2C7E773EC87421F9B59C6CE7A749C28 +MD = 0D94E5E97CBC32267B7C4FEEECAAC82E8B4C3050502C3A347F1305F75654E872 Count = 942 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABAC -MD = 4EF17A04EC373F941C04D412908204B82D08C71F814073E7957B8A68759C32CD +MD = 46F9E9EBFB6967064DC6D666769508C17E948D49D0FFED0F7D062CE036C051F7 Count = 943 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACAD -MD = 16C9198BB3F85E7F6D970670D97E53346B08BCA2F74D7C1F9F24477ED0A2044E +MD = 20EEA2D23EA71BC2AE572B01E8A970544CD45062DD453F6F5066FB17C1AB4473 Count = 944 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAE -MD = 29E83A6CB4E102F4A154D16875AED76BD6E7FD616D7ED828D7B6B6D0130A3811 +MD = C6A65ADE7C26BC7E70FDF192F54BB2303C6F61627E9DC205774915AAF5721537 Count = 945 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF -MD = B7B4E2575871072705CF618EA8B3242C7E5B8D7EDD20D89CF8EE81D1D3DFA687 +MD = 545A28E81B594AA31BB6CF5D814725E7404AEAA492799CF9574A1C212DBC7EAF Count = 946 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0 -MD = 3F1D34C773B9B1A7D19365D33B6C1A118713E54CF57E068A0C45973403A03FE2 +MD = 25C799447A601C472100874A78847D86D25782246476950EA97545CF0F382381 Count = 947 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1 -MD = 7E31798B6FAC9C9D7332D48610A5A098DAF4D34390C2B070AAD53FFA819E38D3 +MD = C54A5163415B3B631CB449B60CD9D154B7BC50A9A2651B0E02158B75120B87A6 Count = 948 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2 -MD = C601BB5A5910AC37B2C0FD6DE8BE5AFCC9EA09EDCD5C129D36F445C9405922B6 +MD = AB27AC77B48EEFCA043B8ACADDC703002A6FEC777D004C7B97C537E796EBA728 Count = 949 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 -MD = FEEDEDBE5BED531404C8451F0EE37ADB5805863487BF78D7E98BFF421720727C +MD = A1B48CC9314267B32A3C30116B458293F61E618F3B5D7249C870CC9917EC89E8 Count = 950 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4 -MD = 6DFEEE119FE0E4809BF4056A60977CE31C178B9544F58AA0BE138F2F971959B4 +MD = 3A5152177EDED9B67ACDE2BF799CD8B06CB2CEA5C7EB18C7780A4DF937AA1936 Count = 951 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5 -MD = 852AAAFAF106EA074B19A24E7A2AA1A39865FA4955D04153BCA488CEB2708316 +MD = 8019EA48B6E4C7F3C616EB754B34781B1551E61B4270FA0F70BFBF28658B1C80 Count = 952 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6 -MD = 78AB47FBFE5AB187B4B2A26D3E6643EBC2FAD4260069FA654261F123802A381F +MD = 99F8053D99C0B8F66A2FD637E7A8E7C46F44EC6C689F34A5B6D6B7BE6321BF36 Count = 953 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7 -MD = E9EF49A124AE99CC67E8D81B3987CD04AD3EF7B1308D4F062F64C2B2BF4139EC +MD = 7817E054ED6B0F997E949E78677EC27B0B740A12FAFE7BDBC809FA7BCA534075 Count = 954 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 -MD = ED9321DD9855EA8810E35310358B13E79D6EAF2AA5BC43A1D1858BC0A6081083 +MD = ACF1EF010A08E27A5089D2461F5CFA1B3938AFA602937009E950D70527D196B8 Count = 955 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9 -MD = FBD96A3AAD9C5B6E7C6F47A3FBB954EE3C1F5BBEF50A8B08E77D7A4B65334A0A +MD = D96D3C7F4097AA0EA0371D67FA08954FBA000E537C46549F970EA284548BF147 Count = 956 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BA -MD = E69187A6D9BDF1D734FB563C1BF7A75153EB05B05556AFF747EF785927DAD081 +MD = 57665F220F8D50F1D61EAA4BA55589B19D404FED481B3B48BA5D43B6B6239E14 Count = 957 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABB -MD = 005C10A3F7D7ADA734BE878444A6C62DD04E0575867D80C98FEF94D702050111 +MD = 8726464F76E5FAF832CAA15D7474DD62EE3E8563B0A686D612836FDD73B32112 Count = 958 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBC -MD = 6C946BB4333944D9C34B8852CC5A683FB48D4498D0739AAD01E1309322FC3680 +MD = 33DA45F9554B4284E84DCA28D00BF0E252224B1461C045109CE79BD97575D832 Count = 959 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBD -MD = EB8FFDCAB8E4F37BC4C1881D159E9FC94BFB58BA76B2B53E18C6B9AEF63168A4 +MD = 242C44E9CB1D34C4264E35CDCCA9070F65F47D65E6A1C4629AABFAF1E016CAF2 Count = 960 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE -MD = 6128842D6BC7B3187F0C37295F863B3DE2056E9DCBBBC7264E517B7BFD07E13B +MD = E6B40FB9205C783EE311333512CAE9C57F431BAC079A478F390B402562D7747B Count = 961 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF -MD = 3F569CE5AECD678C81B82AC40E5F03B8A032BBDD9885B5EEFE79ECCDE2A0378B +MD = A7127F3C11E75B9CF246B1B335ABC880929A611CE0692662311315DFCBEB3A8F Count = 962 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0 -MD = 6BF738BF1F7C458EE1EE479F1809DC496D8AAEB17A00B0CFC73B57F0DAFF1263 +MD = F5A0167ACE09A006B0BC44DD9F1A55A781BB515A52402F36C00EE6301B06BACC Count = 963 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1 -MD = 601193C05D50645EA931701DDCE7CD555D28821A55FCE8B437ECA247DCC87E3F +MD = E6226D1BBD327245861FA6875121883923C8AFA13EB7F3D649A85A5B9297D110 Count = 964 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2 -MD = AF914C19AEAACF9568DBBCE501B7CF56582B5B256EEAAC6CDD23EC984BA1E92B +MD = E3FA8F4199D4E00D39109254554707071FBFC204517BAA2BF9AF542CCA31500D Count = 965 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3 -MD = C7F550A43A9658BA2E07E62389FC4E6AD4881658294D58F58772CF7D15E01984 +MD = F5F37E08F7264862F8ACB37A0A07B7AB5311AB0B164DCCD52087DC3098822208 Count = 966 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4 -MD = 61702AB7E781F13B4BF2F053453BBA58E422BA80C8F62F0012ABC2E74FE4D512 +MD = FBF9AE4584BA23BDE0D285B650E37E54777454490026963C48121E466D5425E2 Count = 967 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5 -MD = D5C1B4B39591590C21C983F35CE508AA3B01D897CC79B9983BF7041B6DAD4281 +MD = 72760E889A844465B7C70C3612FFE9C7182D5CC552CCCAA63AC389D296FC8E4E Count = 968 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6 -MD = DB4ADD547C1BFCBC837520117D10FDE552BCFED9A29EC9826274D26649F72E43 +MD = E2F9F1FEFF74AC1A44158A6E55DE73C39B74C60B8891E927F8B787CD2F654E41 Count = 969 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 -MD = EA9BC85F8623A097B297A15B3F3A6666639ADD84B46C005A89ACA70A8A7268D3 +MD = 2ECB0A30301941A4DCF280BCE00F6D9C973A91CC10128935D148EC3379F299F7 Count = 970 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 -MD = A7B3D92412D9BE795530E40C0803130BF83F471A3E9E7F22479B143499CCC493 +MD = F415B65B220C8FBC15F997BD237E4E4F93CE34C78D5EEB24056928AC7CE93E31 Count = 971 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9 -MD = 8167CBAA19A41EA060A681AA34CE40F5E215734EB4B24A0EFBF9F42104C75D7C +MD = 1DD57823CE9AF4B325AACC5A3E93E21B92D82271F4AA06D810D1CD67CDC2844D Count = 972 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CA -MD = 7ACB3B2A215904BE07628BCBAEDEDF7452F9921FADCC3FBA4148793ED9248A80 +MD = 75293FD8D34193CCCD8B3517E21021D136484F0CFAF9834E3B25B6ED458265F5 Count = 973 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB -MD = FFD2F2E01C624FE190F4EDE58D724BEA0A68839E8BA2D2755D459B66ED8659F1 +MD = 2159417009562C5B52DC72CD1A341E79439D669A5E571D62F70EDC4A64A9A79E Count = 974 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCC -MD = E7CBA522A6D6B64A88BD8E3370A258ACD99135988CC94D39262A319167424088 +MD = C77EA64938A3BD5D819318DCE66A9DE8A8CDF1B6838FB757659F3972976E3F0F Count = 975 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD -MD = CD402D00DDB1F8BC4BE4137B73D7B2E58AA11D3EEAA4D8E6490CF50463434B33 +MD = B3724A0373B50121A4923BF3A3F38B0A45ACB014E5CA989CD86064D82AA52394 Count = 976 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE -MD = 5B618A9CABBC72B20C9F7744135B39F17C5A168AD795BE1D90CA888A7CBFF52D +MD = BC832C1D496A46408C2F465AA656438E2D1033ABD759298E057B9E339FE4D1B8 Count = 977 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF -MD = 6A03CCF26C549C3F3A55B6A45E1BEFBAECE572A8F7BCA375E3729C7A32A1141A +MD = 90E86C3F881EA28F81E9C3C4B2BE4FB6F7A574BBC9F64EBB07ACA73511A37281 Count = 978 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0 -MD = BAAEECCDBE75FDCA85814586E44EF1733BEA47246ECB56A8277E742F829F35A0 +MD = 05F5527613CAE687E7767CCEA402E784F8C00E1180101B7BBDC9D77194A00E3D Count = 979 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1 -MD = 579E5094BAB16B0F7A685A24A6448DFDF7B2ABC57319F7F5D89BF10FEFC4A12D +MD = EC87800078A5A9FFF7A66D283848E060B8CCDE64C5237217CC8DEC7B32453D3E Count = 980 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2 -MD = 889D79B5A869B420B3182C04C6B963E3CB32AC1BCFB805F8291C629587355111 +MD = AB3DF4F5D4AD13F2A256F6A602DCF5763DAD9B99AF84E0B27598BF38E5A8057F Count = 981 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3 -MD = F56943626E59C0A3BB18EFBB2B9A430C4FE00948E43E987CECE9EFB6F4747DC0 +MD = 7E92C8003C92DE1C60F89397D4F6426AFD6E85EF2829AC1A9AB538BE5389451C Count = 982 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4 -MD = E0FA946C44E67619BB82C599BF07300B03AE8C8CC7BE6618B6892AED41A8FFA7 +MD = 5FBC287FBD94A19432AFA177A806006B424C6415D110FDCABDE85ED1365F926D Count = 983 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5 -MD = A51857ECC876184F1DEFF6F919D78FCEFB7AB398D21F4EB57DCB171624C0D8CC +MD = 6CD6BB599F7DC99FB6910B8396FBB9AB75A8C3AEF3FB1010788E6349EA686C8B Count = 984 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6 -MD = B6A17A044AB65B57F7B98D667865F5ECFE6936A8C32410490CE8208CBFE05A76 +MD = 3BDC284469114276097B5CE24B36CC5558AEFE6802D654B2C20D588496C5DE38 Count = 985 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7 -MD = 684631F8C9883DA8C14181B92B3687AFD228FD06029FA580EA3FB25788190438 +MD = CA87268A406C9389B09AA5CF6344850CA3616ABDADEEECFDEA49CB5960D5D626 Count = 986 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 -MD = D9D4D9490CCDA67300C8B34AFEEAE4FDF60B6A1856B56AD8A1FADBC5A1EAD2EA +MD = 9DFD932C61C5A842FD3C8C84D3894CDC436375A06963F02C6AB1AEF47798903F Count = 987 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9 -MD = 82ED293A455C053EA2377C3D332CAB7CFB25C4148C605B09AE3A2116325386C4 +MD = C7FF50E31CBA0559A6AF9C9833DF71E2802187CD3290DBEC20C0D42A88F5A34B Count = 988 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DA -MD = D4C2011C92F4775F56A21098C4BC98E85B904C648F6E4F37F08F8B0E9AA58490 +MD = 07D78F13FDC79DCDA82075193AD77CB322D9CC9B26107CB82205D7F9419DBAB2 Count = 989 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADB -MD = 8C3589889EDEC6E2F151066558EA7B26D60D020027315055FBBAE02C76B48C73 +MD = D053BDE276F47090BAE19A7A28A6EE20D3FD81E2A7BDC9BB82C914EB6FF8C336 Count = 990 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDC -MD = 2BCE760B1F908FFA39069767E42B1144BF7CCA8FA366E00A57278C086411EEDE +MD = D52C58857B47D0BA1CE5FE44D28DC02F69EABCFB3A579D22ACD2B487732F385E Count = 991 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDD -MD = 2EEA1D848175B81C381F4E30B777A89E2BB677016DF1CC599F2CCD2B0F7E8FC2 +MD = FAA7999A6AE07E390C7EA9CCED66E86AA906D0FCA2D4983F34C90D6072F22C3F Count = 992 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE -MD = F5548ED647619202B5BB1DE1DDDDF64CE441451A23618E928252D3657DAA78BF +MD = 3CD4DAAD4B794A7AD2675EA99CD6CDB3EF45FFC16F65CD626F7841C95248507F Count = 993 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF -MD = E463269773A6E26DEE09DE08AF43678D492943C5A640B04197DA612305C102A3 +MD = 0BBF94E0A66345FB65328F3B0FD61C309CD4DC9E449D3EA4AC412E76E4F572DD Count = 994 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0 -MD = 8754486857E4CF78974DB784B080B4E2C5A647C49F4B9422173C484408EDB05C +MD = C1D259B70942833CEC79098ADE42BF5FDB47508E4EE565721CA416B10F04B390 Count = 995 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1 -MD = 71B308C66C2CD2861D80817397254C4CB0D712272677B3601CDA3C6161E02CE4 +MD = 75C615DC24155692E01BF5DB07EC9500C5366A2EC6C8E441CFD79A411C41769A Count = 996 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2 -MD = 4EFB5372242201574A9E9BAF454E5B1B03D2AABC2BB159EEBCBA2E5BFC2F809A +MD = FBB2FFA297876DDE03E757A7E1DA7B22C2F8ACCFB218DE57F89B9772A4BAC333 Count = 997 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3 -MD = B4EE303BC4BD62FE7168EB79570366CFFB1F4000D9C9AE37C28C708AD23039AA +MD = A2AB737972B9C6B40A910224814313C76A2BC3AE8742C1081516D11AF60E4A0F Count = 998 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4 -MD = 40A39CB5725C4A87BAEAD89CC944201999331E3F5AF8F4303287E94A8883E037 +MD = 1370DA9859436A61E8EC24ECA1F7A131A0F56DD737A3170166420F9F2F7593D0 Count = 999 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5 -MD = BA27C4CCB1DE534220BD9A25B71048D9539828E4CCBA3CDB6DA2D713BEB8AF26 +MD = 3F8BF7856CFFD02029218E959AA171F4D5E60E1A57371632693BCDB6F570FCD8 Count = 1000 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6 -MD = A2B8437C12851ADD4DCD80A71941BF3AD8F0F68F6726BAA8B19EEB7932EDD2DA +MD = DD7C376D9F5646EE60DB9613490BB9041112CD205C424A3245108F60810BB885 Count = 1001 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7 -MD = 575D508A30937C69CBD310EB82D2ED3CB935508A750EA84002647BB6DB831142 +MD = 54E24BCCCCE3C6CEB324EE7A35F31006BC02AD4792AB673D9ACFD9B3A3021CBC Count = 1002 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8 -MD = 828C06AF177BFDF654EEA07B1FB250164684C62952C1424E5C63CA8F99096706 +MD = 4C1356EDCD2762D18E21573BC7596A81A05CED84581784B63DB4936FFC41B9CC Count = 1003 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9 -MD = E1E64605BFA4E1AB6B0DE59A2D71F63290D725069FAFF2A79AB4DCB913512149 +MD = B59F243A251EDCDA0C730A9F1B9A7A4765DB1ADAF9732FDB907407D361F1B47B Count = 1004 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EA -MD = 9B7B0D1881D49AC81BFE25A5313DCBD9D0C2888D5849949325D69E306B0E2249 +MD = 3142500867B2D9AFCBD6F1D8879A714D3C31E6875A2A7F9D92717FE963AAA7EA Count = 1005 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB -MD = A674858009AA804B33D8AD3230B2A11BE17A9EA8329F9C9F311EB58A65B717CB +MD = 56D6C4C288ED98A9E7D0983B65DCE6D8A6BA3DCA022EA6E9E13E8C5CACB8D0B1 Count = 1006 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC -MD = 9FE6CE077801078C58546CDFB831A065C771457E148BE8B6AE29BEE74170F337 +MD = 3C7918729B34836572F95122ED17DB483B0C1903EAD3459060241CA332FDC3AC Count = 1007 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECED -MD = 888B1EA8911C53F5B4221347CCCB3B4F9CF0AAC1F2C781C1CB8399A14BE549CF +MD = E230A3AD08B3DF92E793BCAB5BACD3C77D9D7D0582CBEEE3B8F63A0E419E2CB7 Count = 1008 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEE -MD = A3683A86FBB18D0E52A9F83B4AE4494E695B5BAD6ECE41EA4C07EB48F1940240 +MD = 67B5C9BC310E0B5C61C5D998A211E2DBEE7D3423850D8DBE41E178A876998586 Count = 1009 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF -MD = 0D39FBFE83BD7F7561AA29B169EDE2BFB2F5FF7092E611353BB5A46B72E3EB3D +MD = CCEFE819CFE465C53AF1462A2E24D11278A9DBEAB5046A5A6328F84B8AB84798 Count = 1010 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 -MD = 411DF6999B42D66F47A778F69C0D61C1DD8D47526BBAD5F4C72AE1BA1896D802 +MD = D90ABA5D2D84C123EB290480AEDA4356C23B5519FB8CEDB942FB542CD6C725BD Count = 1011 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1 -MD = A3B86A065A502C8D0D0BEAB692F277B247A209C0FA49936D43AA461A90913866 +MD = FB0C362D78E433AC7A5E2C19ADB0AA8AE3EE9BEED045CACE0870772DE098D58B Count = 1012 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2 -MD = F04EC45A142BA618F92DEBE218817506F1D0025DA6A3BF27D83A2B49B8442EB6 +MD = 5F505C31722037B58F24822563501ED82ECA4878970F43476952E6BBBDC35EF1 Count = 1013 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3 -MD = AA957F644E1B545ECE19AABD07CD9CE3E8186B9568CAAA771901C0632C4B1D52 +MD = 4D9ECD5B9CF1E2F24904B033BF741DB41613A2E593BB788A74BD9367F4A1DA00 Count = 1014 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4 -MD = 983B8FFE1169289517E4F92AF777FFDAB1C2575AEC71E0872433417B1D82A504 +MD = 19EECD365FAE2ABF369825CF1ECE2352CBF30C34E4ED77AA514B1BD1EE68AAF1 Count = 1015 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5 -MD = 26FF6C76BBDBB0D64EA7B897B5D050646533A35E28C18A13A4B9B3D9079182E2 +MD = 23ECA2EC7D11E3BF9BDC692E1E270937FCBF477B2DB51456C287EA70F6544DE6 Count = 1016 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 -MD = 5EC9E86B962EBB686AE978C7BF9A2A7C03D85E97B76E029C6751396DD4198E19 +MD = 328BF85D3E269D62B89C308386EF0F5A1EEF6B1E67D4B284560CFB7C0118B2FC Count = 1017 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7 -MD = 40C6FC9360850069E3EB4CABC11FD325EA7C566020D0400005ECB3D5A529C91C +MD = 5C54B309BB42F44E5B0472DE1A761DB2CEBF5B1D534D941B29712B4372DB9C5B Count = 1018 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8 -MD = C7244C98C3F017E66AF7CB25294C85A9F2A6471F449AAA6F8A8F3B70CBA8A804 +MD = DFF954198998682D0AEBC88A4B0EDC031CC893537344CC845468D926B3A7BB3C Count = 1019 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9 -MD = F9CF14026DE82FFF6350EF9DA9D3D41E398087CE334168F77F460DE4AB4D0DD2 +MD = B9BD846A79EA4B30842E479CD0D5608420DC22A133CD8C945CE78476EB76AE83 Count = 1020 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FA -MD = 72120942A623327B17C86022F9FAAC0BBE04E143DDDEC72136D59557758005C6 +MD = 8AF4A4B02D5DAD406F2E8E4FE394ADC9FB83E9EAACC1FBC8A874CEF5BABB2E79 Count = 1021 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB -MD = 8967578C0328E9670AD76989C380328289ABA90BE8467FCFFD638FD6B81C896D +MD = 9C2113D24D8929288A26FD45FB405A06A142901C7C4B69FA018F5C6B155C9832 Count = 1022 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC -MD = 779C302EEE1CC902A2006A8169704A9EAC8A0117DBED57CF6029841BE23A8490 +MD = 49ADDF386B08C593DE5F90DA3AEEE55A0A953556F52BB6164BD48ADD9B94A93A Count = 1023 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFD -MD = CCD52B9E20044D4FAFF45BDF448EA3A4FFCB2D4D3E577619E784DC441120427D +MD = 4BC682EC7025916FD03963CBCA40236A73C823FF1B1A361614840EF51AD105FD Count = 1024 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFE -MD = B256D0299F21A9AB0800AAF0F9956AF423C563C3865C4611F61F87E3552DD6A4 +MD = E13D45A0C84C2E9F32E012730E8721B32164C04626EC6C2158221AFDB20A8280 Count = 1025 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF -MD = D556870D019ED903A9F7CAFDC578C68A3D18A7950C7938EFA3DB104C37044228 +MD = F0D276AD4949F3E68E5D0399ABF1677DC535FCF18831EF43BC340BED3E24E9DB diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.c b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.h b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/api.h b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/hash.c b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/hash.c new file mode 100644 index 0000000..c652a6f --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "orange.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return orangish_hash(out, in, inlen); +} diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.c b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.c new file mode 100644 index 0000000..b8743fe --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.c @@ -0,0 +1,479 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-photon256.h" +#include "internal-util.h" + +/** + * \brief Number of rounds in the PHOTON-256 permutation in bit-sliced form. + */ +#define PHOTON256_ROUNDS 12 + +/* Round constants for PHOTON-256 */ +static uint32_t const photon256_rc[PHOTON256_ROUNDS] = { + 0x96d2f0e1, 0xb4f0d2c3, 0xf0b49687, 0x692d0f1e, + 0x5a1e3c2d, 0x3c785a4b, 0xe1a58796, 0x4b0f2d3c, + 0x1e5a7869, 0xa5e1c3d2, 0xd296b4a5, 0x2d694b5a +}; + +/** + * \brief Evaluates the PHOTON-256 S-box in bit-sliced form. + * + * \param x0 Slice with bit 0 of all nibbles. + * \param x1 Slice with bit 1 of all nibbles. + * \param x2 Slice with bit 2 of all nibbles. + * \param x3 Slice with bit 3 of all nibbles. + * + * This bit-sliced S-box implementation is based on the AVR version + * "add_avr8_bitslice_asm" from the PHOTON-Beetle reference code. + */ +#define photon256_sbox(x0, x1, x2, x3) \ + do { \ + x1 ^= x2; \ + x3 ^= (x2 & x1); \ + t1 = x3; \ + x3 = (x3 & x1) ^ x2; \ + t2 = x3; \ + x3 ^= x0; \ + x3 = ~(x3); \ + x2 = x3; \ + t2 |= x0; \ + x0 ^= t1; \ + x1 ^= x0; \ + x2 |= x1; \ + x2 ^= t1; \ + x1 ^= t2; \ + x3 ^= x1; \ + } while (0) + +/** + * \brief Performs a field multiplication on the 8 nibbles in a row. + * + * \param a Field constant to multiply by. + * \param x Bit-sliced form of the row, with bits 0..3 of each nibble + * in bytes 0..3 of the word. + * + * \return a * x packed into the bytes of a word. + */ +static uint32_t photon256_field_multiply(uint8_t a, uint32_t x) +{ + /* For each 4-bit nibble we need to do this: + * + * result = 0; + * for (bit = 0; bit < 4; ++ bit) { + * if ((a & (1 << bit)) != 0) + * result ^= x; + * if ((x & 0x08) != 0) { + * x = (x << 1) ^ 3; + * } else { + * x = (x << 1); + * } + * } + * + * We don't need to worry about constant time for "a" because it is a + * known constant that isn't data-dependent. But we do need to worry + * about constant time for "x" as it is data. + */ + uint32_t result = 0; + uint32_t t; + #define PARALLEL_CONDITIONAL_ADD(bit) \ + do { \ + if ((a) & (1 << (bit))) \ + result ^= x; \ + } while (0) + #define PARALELL_ROTATE() \ + do { \ + t = x >> 24; \ + x = (x << 8) ^ t ^ (t << 8); \ + } while (0) + PARALLEL_CONDITIONAL_ADD(0); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(1); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(2); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(3); + return result; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts a PHOTON-256 state into bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_to_sliced + (uint32_t out[PHOTON256_STATE_SIZE / 4], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* We first scatter bits 0..3 of the nibbles to bytes 0..3 of the words. + * Then we rearrange the bytes to group all bits N into word N. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 + * 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31] + */ + uint32_t t0, t1, t2, t3; + #define TO_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + #define FROM_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + t0 = le_load_word32(in); + t1 = le_load_word32(in + 4); + t2 = le_load_word32(in + 8); + t3 = le_load_word32(in + 12); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[0] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[1] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[2] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[3] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); + t0 = le_load_word32(in + 16); + t1 = le_load_word32(in + 20); + t2 = le_load_word32(in + 24); + t3 = le_load_word32(in + 28); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[4] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[5] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[6] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[7] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); +} + +/** + * \brief Converts a PHOTON-256 state from bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_from_sliced + (unsigned char out[PHOTON256_STATE_SIZE], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* Do the reverse of photon256_to_sliced() */ + uint32_t x0, x1, x2, x3; + x0 = ((uint32_t)(in[0])) | + (((uint32_t)(in[4])) << 8) | + (((uint32_t)(in[8])) << 16) | + (((uint32_t)(in[12])) << 24); + x1 = ((uint32_t)(in[1])) | + (((uint32_t)(in[5])) << 8) | + (((uint32_t)(in[9])) << 16) | + (((uint32_t)(in[13])) << 24); + x2 = ((uint32_t)(in[2])) | + (((uint32_t)(in[6])) << 8) | + (((uint32_t)(in[10])) << 16) | + (((uint32_t)(in[14])) << 24); + x3 = ((uint32_t)(in[3])) | + (((uint32_t)(in[7])) << 8) | + (((uint32_t)(in[11])) << 16) | + (((uint32_t)(in[15])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out, x0); + le_store_word32(out + 4, x1); + le_store_word32(out + 8, x2); + le_store_word32(out + 12, x3); + x0 = ((uint32_t)(in[16])) | + (((uint32_t)(in[20])) << 8) | + (((uint32_t)(in[24])) << 16) | + (((uint32_t)(in[28])) << 24); + x1 = ((uint32_t)(in[17])) | + (((uint32_t)(in[21])) << 8) | + (((uint32_t)(in[25])) << 16) | + (((uint32_t)(in[29])) << 24); + x2 = ((uint32_t)(in[18])) | + (((uint32_t)(in[22])) << 8) | + (((uint32_t)(in[26])) << 16) | + (((uint32_t)(in[30])) << 24); + x3 = ((uint32_t)(in[19])) | + (((uint32_t)(in[23])) << 8) | + (((uint32_t)(in[27])) << 16) | + (((uint32_t)(in[31])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out + 16, x0); + le_store_word32(out + 20, x1); + le_store_word32(out + 24, x2); + le_store_word32(out + 28, x3); +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +/* Index the bit-sliced state bytes in little-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[(row)] = (uint8_t)(value); \ + S.bytes[(row) + 4] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 8] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 12] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[(row) + 12] = (uint8_t)(value); \ + S.bytes[(row) + 16] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 20] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 24] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#else +/* Index the bit-sliced state bytes in big-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[3 - (row)] = (uint8_t)(value); \ + S.bytes[7 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[11 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[15 - (row)] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[20 - (row)] = (uint8_t)(value); \ + S.bytes[24 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[28 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[32 - (row)] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#endif + +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]) +{ + union { + uint32_t words[PHOTON256_STATE_SIZE / 4]; + uint8_t bytes[PHOTON256_STATE_SIZE]; + } S; + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + uint8_t round; + + /* Convert the state into bit-sliced form */ + photon256_to_sliced(S.words, state); + + /* Perform all 12 permutation rounds */ + for (round = 0; round < PHOTON256_ROUNDS; ++round) { + /* Add the constants for this round */ + t0 = photon256_rc[round]; + S.words[0] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[1] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[2] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[3] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[4] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[5] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[6] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[7] ^= t0 & 0x01010101U; + + /* Apply the sbox to all nibbles in the state */ + photon256_sbox(S.words[0], S.words[1], S.words[2], S.words[3]); + photon256_sbox(S.words[4], S.words[5], S.words[6], S.words[7]); + + /* Rotate all rows left by the row number. + * + * We do this by applying permutations to the top and bottom words + * to rearrange the bits into the rotated form. Permutations + * generated with "http://programming.sirrida.de/calcperm.php". + * + * P_top = [0 1 2 3 4 5 6 7 15 8 9 10 11 12 13 14 22 23 + * 16 17 18 19 20 21 29 30 31 24 25 26 27 28] + * P_bot = [4 5 6 7 0 1 2 3 11 12 13 14 15 8 9 10 18 19 + * 20 21 22 23 16 17 25 26 27 28 29 30 31 24 + */ + #define TOP_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x07030100, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + #define BOTTOM_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x080c0e0f, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + TOP_ROTATE_PERM(S.words[0]); + TOP_ROTATE_PERM(S.words[1]); + TOP_ROTATE_PERM(S.words[2]); + TOP_ROTATE_PERM(S.words[3]); + BOTTOM_ROTATE_PERM(S.words[4]); + BOTTOM_ROTATE_PERM(S.words[5]); + BOTTOM_ROTATE_PERM(S.words[6]); + BOTTOM_ROTATE_PERM(S.words[7]); + + /* Mix the columns */ + #define MUL(a, x) (photon256_field_multiply((a), (x))) + t0 = READ_ROW0(); + t1 = READ_ROW1(); + t2 = READ_ROW2(); + t3 = READ_ROW3(); + t4 = READ_ROW4(); + t5 = READ_ROW5(); + t6 = READ_ROW6(); + t7 = READ_ROW7(); + t8 = MUL(0x02, t0) ^ MUL(0x04, t1) ^ MUL(0x02, t2) ^ MUL(0x0b, t3) ^ + MUL(0x02, t4) ^ MUL(0x08, t5) ^ MUL(0x05, t6) ^ MUL(0x06, t7); + WRITE_ROW(0, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x09, t1) ^ MUL(0x08, t2) ^ MUL(0x0d, t3) ^ + MUL(0x07, t4) ^ MUL(0x07, t5) ^ MUL(0x05, t6) ^ MUL(0x02, t7); + WRITE_ROW(1, t8); + t8 = MUL(0x04, t0) ^ MUL(0x04, t1) ^ MUL(0x0d, t2) ^ MUL(0x0d, t3) ^ + MUL(0x09, t4) ^ MUL(0x04, t5) ^ MUL(0x0d, t6) ^ MUL(0x09, t7); + WRITE_ROW(2, t8); + t8 = MUL(0x01, t0) ^ MUL(0x06, t1) ^ MUL(0x05, t2) ^ MUL(0x01, t3) ^ + MUL(0x0c, t4) ^ MUL(0x0d, t5) ^ MUL(0x0f, t6) ^ MUL(0x0e, t7); + WRITE_ROW(3, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x0c, t1) ^ MUL(0x09, t2) ^ MUL(0x0d, t3) ^ + MUL(0x0e, t4) ^ MUL(0x05, t5) ^ MUL(0x0e, t6) ^ MUL(0x0d, t7); + WRITE_ROW(4, t8); + t8 = MUL(0x09, t0) ^ MUL(0x0e, t1) ^ MUL(0x05, t2) ^ MUL(0x0f, t3) ^ + MUL(0x04, t4) ^ MUL(0x0c, t5) ^ MUL(0x09, t6) ^ MUL(0x06, t7); + WRITE_ROW(5, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x02, t1) ^ MUL(0x02, t2) ^ MUL(0x0a, t3) ^ + MUL(0x03, t4) ^ MUL(0x01, t5) ^ MUL(0x01, t6) ^ MUL(0x0e, t7); + WRITE_ROW(6, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x01, t1) ^ MUL(0x0d, t2) ^ MUL(0x0a, t3) ^ + MUL(0x05, t4) ^ MUL(0x0a, t5) ^ MUL(0x02, t6) ^ MUL(0x03, t7); + WRITE_ROW(7, t8); + } + + /* Convert back from bit-sliced form to regular form */ + photon256_from_sliced(state, S.bytes); +} diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.h b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.h new file mode 100644 index 0000000..ce8729a --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-photon256.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PHOTON256_H +#define LW_INTERNAL_PHOTON256_H + +/** + * \file internal-photon256.h + * \brief Internal implementation of the PHOTON-256 permutation. + * + * Warning: The current implementation of PHOTON-256 is constant-time + * but not constant-cache. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the PHOTON-256 permutation state in bytes. + */ +#define PHOTON256_STATE_SIZE 32 + +/** + * \brief Permutes the PHOTON-256 state. + * + * \param state The state to be permuted. + */ +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-util.h b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.c b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.c new file mode 100644 index 0000000..641e117 --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.c @@ -0,0 +1,384 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "orange.h" +#include "internal-photon256.h" +#include "internal-util.h" +#include + +aead_cipher_t const orange_zest_cipher = { + "ORANGE-Zest", + ORANGE_ZEST_KEY_SIZE, + ORANGE_ZEST_NONCE_SIZE, + ORANGE_ZEST_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + orange_zest_aead_encrypt, + orange_zest_aead_decrypt +}; + +aead_hash_algorithm_t const orangish_hash_algorithm = { + "ORANGISH", + sizeof(int), + ORANGISH_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + orangish_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Doubles a block in the GF(128) field a number of times. + * + * \param block The block to be doubled. + * \param value The number of times to double the block. + */ +static void orange_block_double(unsigned char block[16], unsigned char value) +{ + unsigned index; + unsigned char mask; + while (value > 0) { + mask = (unsigned char)(((signed char)(block[15])) >> 7); + for (index = 15; index > 0; --index) + block[index] = (block[index] << 1) | (block[index - 1] >> 7); + block[0] = (block[0] << 1) ^ (mask & 0x87); + --value; + } +} + +/** + * \brief Rotates a block left by 1 bit. + * + * \param out The output block to be set to the rotated version. + * \param in The input block to be rotated, must not overlap with \a out. + */ +static void orange_block_rotate + (unsigned char out[16], const unsigned char in[16]) +{ + unsigned index; + for (index = 15; index > 0; --index) + out[index] = (in[index] << 1) | (in[index - 1] >> 7); + out[0] = (in[0] << 1) | (in[15] >> 7); +} + +/** + * \brief Hash input data with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param data Points to the data to be hashed. + * \param len Length of the data to be hashed, must not be zero. + * \param domain0 Domain separation value for full last block. + * \param domain1 Domain separation value for partial last block. + */ +static void orange_process_hash + (unsigned char state[PHOTON256_STATE_SIZE], + const unsigned char *data, unsigned long long len, + unsigned char domain0, unsigned char domain1) +{ + unsigned temp; + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + lw_xor_block(state, data, PHOTON256_STATE_SIZE); + data += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, domain1); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, domain0); + } + lw_xor_block(state, data, temp); +} + +/** + * \brief Applies the rho function to the ORANGE state. + * + * \param KS Output keystream to use to encrypt the plaintext or to + * decrypt the ciphertext. + * \param S Rolling key state. + * \param state Rolling PHOTON-256 permutation state. + */ +static void orange_rho + (unsigned char KS[32], unsigned char S[16], const unsigned char state[32]) +{ + orange_block_double(S, 1); + orange_block_rotate(KS, state); + lw_xor_block_2_src(KS + 16, state + 16, S, 16); + memcpy(S, state + 16, 16); +} + +/** + * \brief Encrypts plaintext with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param k Points to the key for the cipher. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param len Length of the plaintext in bytes, must not be zero. + */ +static void orange_encrypt + (unsigned char state[PHOTON256_STATE_SIZE], const unsigned char *k, + unsigned char *c, const unsigned char *m, unsigned long long len) +{ + unsigned char S[ORANGE_ZEST_KEY_SIZE]; + unsigned char KS[PHOTON256_STATE_SIZE]; + unsigned temp; + memcpy(S, k, ORANGE_ZEST_KEY_SIZE); + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, PHOTON256_STATE_SIZE); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + c += PHOTON256_STATE_SIZE; + m += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, 2); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, temp); + lw_xor_block(state, c, temp); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, 1); + orange_rho(KS, S, state); + lw_xor_block_2_src(c, m, KS, PHOTON256_STATE_SIZE); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + } +} + +/** + * \brief Decrypts ciphertext with ORANGE. + * + * \param state PHOTON-256 permutation state. + * \param k Points to the key for the cipher. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param len Length of the plaintext in bytes, must not be zero. + */ +static void orange_decrypt + (unsigned char state[PHOTON256_STATE_SIZE], const unsigned char *k, + unsigned char *m, const unsigned char *c, unsigned long long len) +{ + unsigned char S[ORANGE_ZEST_KEY_SIZE]; + unsigned char KS[PHOTON256_STATE_SIZE]; + unsigned temp; + memcpy(S, k, ORANGE_ZEST_KEY_SIZE); + while (len > PHOTON256_STATE_SIZE) { + photon256_permute(state); + orange_rho(KS, S, state); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + lw_xor_block_2_src(m, c, KS, PHOTON256_STATE_SIZE); + c += PHOTON256_STATE_SIZE; + m += PHOTON256_STATE_SIZE; + len -= PHOTON256_STATE_SIZE; + } + photon256_permute(state); + temp = (unsigned)len; + if (temp < PHOTON256_STATE_SIZE) { + orange_block_double(state + 16, 2); + orange_rho(KS, S, state); + lw_xor_block(state, c, temp); + lw_xor_block_2_src(m, c, KS, temp); + state[temp] ^= 0x01; /* padding */ + } else { + orange_block_double(state + 16, 1); + orange_rho(KS, S, state); + lw_xor_block(state, c, PHOTON256_STATE_SIZE); + lw_xor_block_2_src(m, c, KS, PHOTON256_STATE_SIZE); + } +} + +/** + * \brief Generates the authentication tag for ORANGE-Zest. + * + * \param state PHOTON-256 permutation state. + * + * The tag will be left in the leading bytes of the state on exit. + */ +static void orange_generate_tag(unsigned char state[PHOTON256_STATE_SIZE]) +{ + /* Swap the two halves of the state and run the permutation again */ + unsigned posn; + for (posn = 0; posn < (PHOTON256_STATE_SIZE / 2); ++posn) { + unsigned char temp = state[posn]; + state[posn] = state[posn + (PHOTON256_STATE_SIZE / 2)]; + state[posn + (PHOTON256_STATE_SIZE / 2)] = temp; + } + photon256_permute(state); +} + +int orange_zest_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORANGE_ZEST_TAG_SIZE; + + /* Initialize the PHOTON-256 state with the nonce and key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Handle the associated data and message payload */ + if (adlen == 0) { + if (mlen == 0) { + state[16] ^= 2; /* domain separation */ + photon256_permute(state); + memcpy(c + mlen, state, ORANGE_ZEST_TAG_SIZE); + return 0; + } else { + state[16] ^= 1; /* domain separation */ + orange_encrypt(state, k, c, m, mlen); + } + } else { + orange_process_hash(state, ad, adlen, 1, 2); + if (mlen != 0) + orange_encrypt(state, k, c, m, mlen); + } + + /* Generate the authentication tag */ + orange_generate_tag(state); + memcpy(c + mlen, state, ORANGE_ZEST_TAG_SIZE); + return 0; +} + +int orange_zest_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORANGE_ZEST_TAG_SIZE) + return -1; + *mlen = clen - ORANGE_ZEST_TAG_SIZE; + + /* Initialize the PHOTON-256 state with the nonce and key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Handle the associated data and message payload */ + clen -= ORANGE_ZEST_TAG_SIZE; + if (adlen == 0) { + if (clen == 0) { + state[16] ^= 2; /* domain separation */ + photon256_permute(state); + return aead_check_tag(m, 0, state, c, ORANGE_ZEST_TAG_SIZE); + } else { + state[16] ^= 1; /* domain separation */ + orange_decrypt(state, k, m, c, clen); + } + } else { + orange_process_hash(state, ad, adlen, 1, 2); + if (clen != 0) + orange_decrypt(state, k, m, c, clen); + } + + /* Check the authentication tag */ + orange_generate_tag(state); + return aead_check_tag(m, clen, state, c + clen, ORANGE_ZEST_TAG_SIZE); +} + +/** + * \brief Rate of absorbing data into the ORANGISH hash state. + */ +#define ORANGISH_RATE 16 + +int orangish_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + unsigned temp; + memset(state, 0, sizeof(state)); + if (inlen == 0) { + /* No absorption necessary for a zero-length input */ + } else if (inlen < ORANGISH_RATE) { + /* Single partial block */ + temp = (unsigned)inlen; + memcpy(state, in, temp); + state[temp] ^= 0x01; /* padding */ + photon256_permute(state); + lw_xor_block(state + 16, in, temp); + state[16 + temp] ^= 0x01; /* padding */ + state[0] ^= 0x02; /* domain separation */ + } else if (inlen == ORANGISH_RATE) { + /* Single full block */ + memcpy(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + state[0] ^= 0x01; /* domain separation */ + } else { + /* Process double blocks until we run out */ + memcpy(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + in += ORANGISH_RATE; + inlen -= ORANGISH_RATE; + while (inlen > ORANGISH_RATE) { + lw_xor_block(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + in += ORANGISH_RATE; + inlen -= ORANGISH_RATE; + } + temp = (unsigned)inlen; + if (temp < ORANGISH_RATE) { + /* Last double block is partial */ + lw_xor_block(state, in, temp); + state[temp] ^= 0x01; /* padding */ + photon256_permute(state); + lw_xor_block(state + 16, in, temp); + state[16 + temp] ^= 0x01; /* padding */ + state[0] ^= 0x02; /* domain separation */ + } else { + /* Last double block is full */ + lw_xor_block(state, in, ORANGISH_RATE); + photon256_permute(state); + lw_xor_block(state + 16, in, ORANGISH_RATE); + state[0] ^= 0x01; /* domain separation */ + } + } + photon256_permute(state); + memcpy(out, state, 16); + photon256_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.h b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.h new file mode 100644 index 0000000..de5b00c --- /dev/null +++ b/orange/Implementations/crypto_hash/orangishv1/rhys-avr/orange.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ORANGE_H +#define LWCRYPTO_ORANGE_H + +#include "aead-common.h" + +/** + * \file orange.h + * \brief ORANGE authenticated encryption algorithm. + * + * ORANGE is a family of algorithms built around the PHOTON-256 permutation. + * There are two members of the family at present: + * + * \li ORANGE-Zest is an authenticated encryption algorithm with a 128-bit + * key, a 128-bit nonce, and a 128-bit tag. + * \li ORANGISH is a hash algorithm with a 256-bit output. + * + * References: https://www.isical.ac.in/~lightweight/Orange/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for ORANGE-Zest. + */ +#define ORANGE_ZEST_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for ORANGE-Zest. + */ +#define ORANGE_ZEST_TAG_SIZE 16 + +/** + * \brief Size of the nonce for ORANGE-Zest. + */ +#define ORANGE_ZEST_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for the ORANGISH hash algorithm. + */ +#define ORANGISH_HASH_SIZE 32 + +/** + * \brief Meta-information block for the ORANGE-Zest cipher. + */ +extern aead_cipher_t const orange_zest_cipher; + +/** + * \brief Meta-information block for the ORANGISH hash algorithm. + */ +extern aead_hash_algorithm_t const orangish_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with ORANGE-Zest. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa orange_zest_aead_decrypt() + */ +int orange_zest_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with ORANGE-Zest. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa orange_zest_aead_encrypt() + */ +int orange_zest_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with ORANGISH to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ORANGISH_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int orangish_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.c b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.h b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/api.h b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/api.h new file mode 100644 index 0000000..bd8cdcb --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 8 +#define CRYPTO_ABYTES 12 +#define CRYPTO_NOOVERLAP 1 diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/encrypt.c b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/encrypt.c new file mode 100644 index 0000000..681e037 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "oribatida.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return oribatida_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return oribatida_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp-avr.S b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp-avr.S new file mode 100644 index 0000000..65fba20 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp-avr.S @@ -0,0 +1,949 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global simp_256_permute + .type simp_256_permute, @function +simp_256_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r23,245 + mov r10,r23 + ldi r17,14 + mov r11,r17 + ldi r16,44 + mov r12,r16 + ldi r23,25 + mov r13,r23 + ldi r23,133 + mov r14,r23 + ldi r23,248 + mov r15,r23 + ldi r24,105 + ldi r25,51 +14: + ldi r23,17 +16: + ldd r29,Z+16 + ldd r28,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + mov r2,r29 + mov r3,r18 + mov r4,r19 + mov r5,r20 + mov r6,r21 + mov r7,r26 + mov r8,r27 + mov r9,r28 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r28 + rol r29 + adc r18,r1 + and r2,r18 + and r3,r19 + and r4,r20 + and r5,r21 + and r6,r26 + and r7,r27 + and r8,r28 + and r9,r29 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r28 + rol r29 + adc r18,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + ldd r0,Z+8 + eor r9,r0 + ldd r0,Z+9 + eor r8,r0 + ldd r0,Z+10 + eor r7,r0 + ldd r0,Z+11 + eor r6,r0 + ldd r0,Z+12 + eor r5,r0 + ldd r0,Z+13 + eor r4,r0 + ldd r0,Z+14 + eor r3,r0 + ldd r0,Z+15 + eor r2,r0 + ldd r0,Z+24 + eor r0,r9 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r8 + std Z+25,r0 + ldd r0,Z+26 + eor r0,r7 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r6 + std Z+27,r0 + ldd r0,Z+28 + eor r0,r5 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r4 + std Z+29,r0 + ldd r0,Z+30 + eor r0,r3 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r2 + std Z+31,r0 + ld r29,Z + ldd r28,Z+1 + ldd r27,Z+2 + ldd r26,Z+3 + ldd r21,Z+4 + ldd r20,Z+5 + ldd r19,Z+6 + ldd r18,Z+7 + mov r0,r1 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r29,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + movw r8,r28 + bst r2,0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + bld r9,7 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + ldi r17,252 + eor r18,r17 + com r19 + com r20 + com r21 + com r26 + com r27 + com r28 + com r29 + mov r0,r1 + bst r10,0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + bld r25,5 + bld r0,0 + eor r18,r0 + ldd r0,Z+8 + eor r0,r29 + std Z+8,r0 + ldd r0,Z+9 + eor r0,r28 + std Z+9,r0 + ldd r0,Z+10 + eor r0,r27 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r26 + std Z+11,r0 + ldd r0,Z+12 + eor r0,r21 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r20 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r19 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r18 + std Z+15,r0 + ldd r9,Z+24 + ldd r8,Z+25 + ldd r7,Z+26 + ldd r6,Z+27 + ldd r5,Z+28 + ldd r4,Z+29 + ldd r3,Z+30 + ldd r2,Z+31 + mov r18,r9 + mov r19,r2 + mov r20,r3 + mov r21,r4 + mov r26,r5 + mov r27,r6 + mov r28,r7 + mov r29,r8 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + adc r2,r1 + and r18,r2 + and r19,r3 + and r20,r4 + and r21,r5 + and r26,r6 + and r27,r7 + and r28,r8 + and r29,r9 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + adc r2,r1 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + ld r0,Z + eor r29,r0 + ldd r0,Z+1 + eor r28,r0 + ldd r0,Z+2 + eor r27,r0 + ldd r0,Z+3 + eor r26,r0 + ldd r0,Z+4 + eor r21,r0 + ldd r0,Z+5 + eor r20,r0 + ldd r0,Z+6 + eor r19,r0 + ldd r0,Z+7 + eor r18,r0 + ldd r0,Z+16 + eor r0,r29 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r28 + std Z+17,r0 + ldd r0,Z+18 + eor r0,r27 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r26 + std Z+19,r0 + ldd r0,Z+20 + eor r0,r21 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r20 + std Z+21,r0 + ldd r0,Z+22 + eor r0,r19 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r18 + std Z+23,r0 + ldd r29,Z+8 + ldd r28,Z+9 + ldd r27,Z+10 + ldd r26,Z+11 + ldd r21,Z+12 + ldd r20,Z+13 + ldd r19,Z+14 + ldd r18,Z+15 + mov r0,r1 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r29,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + movw r8,r28 + bst r18,0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + bld r29,7 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + eor r2,r17 + com r3 + com r4 + com r5 + com r6 + com r7 + com r8 + com r9 + mov r0,r1 + bst r10,0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + bld r25,5 + bld r0,0 + eor r2,r0 + ld r0,Z + eor r0,r9 + st Z,r0 + ldd r0,Z+1 + eor r0,r8 + std Z+1,r0 + ldd r0,Z+2 + eor r0,r7 + std Z+2,r0 + ldd r0,Z+3 + eor r0,r6 + std Z+3,r0 + ldd r0,Z+4 + eor r0,r5 + std Z+4,r0 + ldd r0,Z+5 + eor r0,r4 + std Z+5,r0 + ldd r0,Z+6 + eor r0,r3 + std Z+6,r0 + ldd r0,Z+7 + eor r0,r2 + std Z+7,r0 + dec r23 + breq 5407f + rjmp 16b +5407: + dec r22 + brne 5409f + rjmp 475f +5409: + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r6,Z+20 + ldd r7,Z+21 + ldd r8,Z+22 + ldd r9,Z+23 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + std Z+4,r6 + std Z+5,r7 + std Z+6,r8 + std Z+7,r9 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r28 + std Z+31,r29 + rjmp 14b +475: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size simp_256_permute, .-simp_256_permute + + .text +.global simp_192_permute + .type simp_192_permute, @function +simp_192_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r25,245 + mov r8,r25 + ldi r24,14 + mov r9,r24 + ldi r23,44 + mov r10,r23 + ldi r17,25 + mov r11,r17 + ldi r16,133 + mov r12,r16 + ldi r23,248 + mov r13,r23 + ldi r23,105 + mov r14,r23 + ldi r23,51 + mov r15,r23 +16: + ldi r23,13 +18: + ldd r27,Z+12 + ldd r26,Z+13 + ldd r21,Z+14 + ldd r20,Z+15 + ldd r19,Z+16 + ldd r18,Z+17 + mov r2,r27 + mov r3,r18 + mov r4,r19 + mov r5,r20 + mov r6,r21 + mov r7,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + adc r18,r1 + and r2,r18 + and r3,r19 + and r4,r20 + and r5,r21 + and r6,r26 + and r7,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + adc r18,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + ldd r0,Z+6 + eor r7,r0 + ldd r0,Z+7 + eor r6,r0 + ldd r0,Z+8 + eor r5,r0 + ldd r0,Z+9 + eor r4,r0 + ldd r0,Z+10 + eor r3,r0 + ldd r0,Z+11 + eor r2,r0 + ldd r0,Z+18 + eor r0,r7 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r6 + std Z+19,r0 + ldd r0,Z+20 + eor r0,r5 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r4 + std Z+21,r0 + ldd r0,Z+22 + eor r0,r3 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r2 + std Z+23,r0 + ld r27,Z + ldd r26,Z+1 + ldd r21,Z+2 + ldd r20,Z+3 + ldd r19,Z+4 + ldd r18,Z+5 + mov r0,r1 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r27,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + bst r2,0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + bld r7,7 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + ldi r25,252 + eor r18,r25 + com r19 + com r20 + com r21 + com r26 + com r27 + mov r0,r1 + bst r8,0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + ror r9 + ror r8 + bld r15,5 + bld r0,0 + eor r18,r0 + ldd r0,Z+6 + eor r0,r27 + std Z+6,r0 + ldd r0,Z+7 + eor r0,r26 + std Z+7,r0 + ldd r0,Z+8 + eor r0,r21 + std Z+8,r0 + ldd r0,Z+9 + eor r0,r20 + std Z+9,r0 + ldd r0,Z+10 + eor r0,r19 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r18 + std Z+11,r0 + ldd r7,Z+18 + ldd r6,Z+19 + ldd r5,Z+20 + ldd r4,Z+21 + ldd r3,Z+22 + ldd r2,Z+23 + mov r18,r7 + mov r19,r2 + mov r20,r3 + mov r21,r4 + mov r26,r5 + mov r27,r6 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + adc r2,r1 + and r18,r2 + and r19,r3 + and r20,r4 + and r21,r5 + and r26,r6 + and r27,r7 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + adc r2,r1 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + ld r0,Z + eor r27,r0 + ldd r0,Z+1 + eor r26,r0 + ldd r0,Z+2 + eor r21,r0 + ldd r0,Z+3 + eor r20,r0 + ldd r0,Z+4 + eor r19,r0 + ldd r0,Z+5 + eor r18,r0 + ldd r0,Z+12 + eor r0,r27 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r26 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r21 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r20 + std Z+15,r0 + ldd r0,Z+16 + eor r0,r19 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r18 + std Z+17,r0 + ldd r27,Z+6 + ldd r26,Z+7 + ldd r21,Z+8 + ldd r20,Z+9 + ldd r19,Z+10 + ldd r18,Z+11 + mov r0,r1 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r27,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + bst r18,0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + bld r27,7 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r2,r25 + com r3 + com r4 + com r5 + com r6 + com r7 + mov r0,r1 + bst r8,0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + ror r9 + ror r8 + bld r15,5 + bld r0,0 + eor r2,r0 + ld r0,Z + eor r0,r7 + st Z,r0 + ldd r0,Z+1 + eor r0,r6 + std Z+1,r0 + ldd r0,Z+2 + eor r0,r5 + std Z+2,r0 + ldd r0,Z+3 + eor r0,r4 + std Z+3,r0 + ldd r0,Z+4 + eor r0,r3 + std Z+4,r0 + ldd r0,Z+5 + eor r0,r2 + std Z+5,r0 + dec r23 + breq 5323f + rjmp 18b +5323: + dec r22 + breq 375f + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+12 + ldd r3,Z+13 + ldd r4,Z+14 + ldd r5,Z+15 + ldd r6,Z+16 + ldd r7,Z+17 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + std Z+4,r6 + std Z+5,r7 + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + std Z+16,r26 + std Z+17,r27 + ldd r18,Z+6 + ldd r19,Z+7 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r26,Z+10 + ldd r27,Z+11 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + std Z+6,r2 + std Z+7,r3 + std Z+8,r4 + std Z+9,r5 + std Z+10,r6 + std Z+11,r7 + std Z+18,r18 + std Z+19,r19 + std Z+20,r20 + std Z+21,r21 + std Z+22,r26 + std Z+23,r27 + rjmp 16b +375: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size simp_192_permute, .-simp_192_permute + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.c b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.c new file mode 100644 index 0000000..5d2144e --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.c @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-simp.h" + +#if !defined(__AVR__) + +/** + * \brief Number of rounds for the inner block cipher within SimP-256. + */ +#define SIMP_256_ROUNDS 34 + +/** + * \brief Number of rounds for the inner block cipher within SimP-192. + */ +#define SIMP_192_ROUNDS 26 + +/** + * \brief Round constants for each of the rounds in SimP-256 or SimP-192. + * + * Bit i is the round constant for round i, repeated every 62 rounds. + */ +#define SIMP_RC 0x3369F885192C0EF5ULL + +void simp_256_permute(unsigned char state[SIMP_256_STATE_SIZE], unsigned steps) +{ + uint64_t z = SIMP_RC; + uint64_t x0, x1, x2, x3, t0, t1; + unsigned round; + + /* Load the state into local variables */ + x0 = be_load_word64(state); + x1 = be_load_word64(state + 8); + x2 = be_load_word64(state + 16); + x3 = be_load_word64(state + 24); + + /* Perform all steps */ + for (; steps > 0; --steps) { + /* Perform all rounds for this step, two at a time */ + for (round = 0; round < (SIMP_256_ROUNDS / 2); ++round) { + t1 = x3 ^ (leftRotate1_64(x2) & leftRotate8_64(x2)) ^ + leftRotate2_64(x2) ^ x1; + t0 = x1 ^ rightRotate3_64(x0) ^ rightRotate4_64(x0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + x2 = x2 ^ (leftRotate1_64(t1) & leftRotate8_64(t1)) ^ + leftRotate2_64(t1) ^ x0; + x0 = x0 ^ rightRotate3_64(t0) ^ rightRotate4_64(t0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + x1 = t0; + x3 = t1; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + } + + /* Swap the words of the state for all steps except the last */ + if (steps > 1) { + t0 = x0; + t1 = x1; + x0 = x2; + x1 = x3; + x2 = t0; + x3 = t1; + } + } + + /* Write the local variables back to the state */ + be_store_word64(state, x0); + be_store_word64(state + 8, x1); + be_store_word64(state + 16, x2); + be_store_word64(state + 24, x3); +} + +/* Load a big-endian 48-bit word from a byte buffer */ +#define be_load_word48(ptr) \ + ((((uint64_t)((ptr)[0])) << 40) | \ + (((uint64_t)((ptr)[1])) << 32) | \ + (((uint64_t)((ptr)[2])) << 24) | \ + (((uint64_t)((ptr)[3])) << 16) | \ + (((uint64_t)((ptr)[4])) << 8) | \ + ((uint64_t)((ptr)[5]))) + +/* Store a big-endian 48-bit word into a byte buffer */ +#define be_store_word48(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 40); \ + (ptr)[1] = (uint8_t)(_x >> 32); \ + (ptr)[2] = (uint8_t)(_x >> 24); \ + (ptr)[3] = (uint8_t)(_x >> 16); \ + (ptr)[4] = (uint8_t)(_x >> 8); \ + (ptr)[5] = (uint8_t)_x; \ + } while (0) + +/* 48-bit rotations with the high bits set to garbage - truncated later */ +#define rightRotate3_48(x) (((x) >> 3) | ((x) << 45)) +#define rightRotate4_48(x) (((x) >> 4) | ((x) << 44)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 47)) +#define leftRotate2_48(x) (((x) << 2) | ((x) >> 46)) +#define leftRotate8_48(x) (((x) << 8) | ((x) >> 40)) + +void simp_192_permute(unsigned char state[SIMP_192_STATE_SIZE], unsigned steps) +{ + uint64_t z = SIMP_RC; + uint64_t x0, x1, x2, x3, t0, t1; + unsigned round; + + /* Load the state into local variables */ + x0 = be_load_word48(state); + x1 = be_load_word48(state + 6); + x2 = be_load_word48(state + 12); + x3 = be_load_word48(state + 18); + + /* Perform all steps */ + for (; steps > 0; --steps) { + /* Perform all rounds for this step, two at a time */ + for (round = 0; round < (SIMP_192_ROUNDS / 2); ++round) { + t1 = x3 ^ (leftRotate1_48(x2) & leftRotate8_48(x2)) ^ + leftRotate2_48(x2) ^ x1; + t0 = x1 ^ rightRotate3_48(x0) ^ rightRotate4_48(x0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + t0 &= 0x0000FFFFFFFFFFFFULL; /* Truncate back to 48 bits */ + t1 &= 0x0000FFFFFFFFFFFFULL; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + x2 = x2 ^ (leftRotate1_48(t1) & leftRotate8_48(t1)) ^ + leftRotate2_48(t1) ^ x0; + x0 = x0 ^ rightRotate3_48(t0) ^ rightRotate4_48(t0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + x0 &= 0x0000FFFFFFFFFFFFULL; + x2 &= 0x0000FFFFFFFFFFFFULL; + x1 = t0; + x3 = t1; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + } + + /* Swap the words of the state for all steps except the last */ + if (steps > 1) { + t0 = x0; + t1 = x1; + x0 = x2; + x1 = x3; + x2 = t0; + x3 = t1; + } + } + + /* Write the local variables back to the state */ + be_store_word48(state, x0); + be_store_word48(state + 6, x1); + be_store_word48(state + 12, x2); + be_store_word48(state + 18, x3); +} + +#endif /* !__AVR__ */ diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.h b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.h new file mode 100644 index 0000000..3a95e80 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-simp.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SIMP_H +#define LW_INTERNAL_SIMP_H + +#include "internal-util.h" + +/** + * \file internal-simp.h + * \brief SimP permutation family. + * + * SimP-256 and SimP-192 are used by the Oribatida submission to + * round 2 of the NIST Lightweight Cryptography Competition. + * The permutations are built around reduced-round variants of the + * Simon-128-128 and Simon-96-96 block ciphers. + * + * References: https://www.isical.ac.in/~lightweight/oribatida/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief State size of the SimP-256 permutation. + */ +#define SIMP_256_STATE_SIZE 32 + +/** + * \brief State size of the SimP-192 permutation. + */ +#define SIMP_192_STATE_SIZE 24 + +/** + * \brief Permutes a state with SimP-256. + * + * \param state State to be permuted. + * \param steps Number of steps to perform (usually 2 or 4). + */ +void simp_256_permute(unsigned char state[SIMP_256_STATE_SIZE], unsigned steps); + +/** + * \brief Permutes a state with SimP-192. + * + * \param state State to be permuted. + * \param steps Number of steps to perform (usually 2 or 4). + */ +void simp_192_permute(unsigned char state[SIMP_192_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-util.h b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.c b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.c new file mode 100644 index 0000000..55a3914 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.c @@ -0,0 +1,480 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "oribatida.h" +#include "internal-simp.h" +#include + +/** + * \brief Rate for processing data for the Oribatida-256-64 state. + */ +#define ORIBATIDA_256_RATE 16 + +/** + * \brief Size of the masking value for Oribatida-256-64. + */ +#define ORIBATIDA_256_MASK_SIZE 8 + +/** + * \brief Rate for processing data for the Oribatida-192-96 state. + */ +#define ORIBATIDA_192_RATE 12 + +/** + * \brief Size of the masking value for Oribatida-192-96. + */ +#define ORIBATIDA_192_MASK_SIZE 12 + +aead_cipher_t const oribatida_256_cipher = { + "Oribatida-256-64", + ORIBATIDA_256_KEY_SIZE, + ORIBATIDA_256_NONCE_SIZE, + ORIBATIDA_256_TAG_SIZE, + AEAD_FLAG_NONE, + oribatida_256_aead_encrypt, + oribatida_256_aead_decrypt +}; + +aead_cipher_t const oribatida_192_cipher = { + "Oribatida-192-96", + ORIBATIDA_192_KEY_SIZE, + ORIBATIDA_192_NONCE_SIZE, + ORIBATIDA_192_TAG_SIZE, + AEAD_FLAG_NONE, + oribatida_192_aead_encrypt, + oribatida_192_aead_decrypt +}; + +/* Definitions for domain separation values */ +#define ORIBATIDA_NUM_DOMAINS 3 +#define ORIBATIDA_DOMAIN_NONCE 0 +#define ORIBATIDA_DOMAIN_AD 1 +#define ORIBATIDA_DOMAIN_MSG 2 + +/** + * \brief Gets the domain separation values to use for different phases + * of the Oribatida encryption process. + * + * \param domains Returns the domain separation values to use. + * \param adlen Length of the associated data. + * \param mlen Length of the plaintext message. + * \param rate Rate of processing message blocks, 12 or 16. + */ +static void oribatida_get_domains + (unsigned char domains[ORIBATIDA_NUM_DOMAINS], + unsigned long long adlen, unsigned long long mlen, unsigned rate) +{ + /* Domain separation value for the nonce */ + if (adlen == 0 && mlen == 0) { + domains[ORIBATIDA_DOMAIN_NONCE] = 9; + } else { + domains[ORIBATIDA_DOMAIN_NONCE] = 5; + } + + /* Domain separation value for associated data processing */ + if (mlen == 0) { + if ((adlen % rate) == 0) + domains[ORIBATIDA_DOMAIN_AD] = 12; + else + domains[ORIBATIDA_DOMAIN_AD] = 14; + } else { + if ((adlen % rate) == 0) + domains[ORIBATIDA_DOMAIN_AD] = 4; + else + domains[ORIBATIDA_DOMAIN_AD] = 6; + } + + /* Domain separation value for message processing */ + if ((mlen % rate) == 0) { + domains[ORIBATIDA_DOMAIN_MSG] = 13; + } else { + domains[ORIBATIDA_DOMAIN_MSG] = 15; + } +} + +/** + * \brief Initializes the Oribatida-256-64 state. + * + * \param state Oribatida-256-64 permutation state. + * \param mask Oribatida-256-64 masking state. + * \param domains Precomputed domain separation values. + * \param k Points to the key. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void oribatida_256_init + (unsigned char state[SIMP_256_STATE_SIZE], + unsigned char mask[ORIBATIDA_256_MASK_SIZE], + const unsigned char domains[ORIBATIDA_NUM_DOMAINS], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state with the key and nonce */ + memcpy(state, npub, ORIBATIDA_256_NONCE_SIZE); + memcpy(state + ORIBATIDA_256_NONCE_SIZE, k, ORIBATIDA_256_KEY_SIZE); + + /* Use the current state as the mask for zero-length associated data */ + if (adlen == 0) { + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + } + + /* Add the domain separation value for the nonce */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_NONCE]; + + /* Run the permutation for the first time */ + simp_256_permute(state, 4); + + /* If there is no associated data, then we are done */ + if (adlen == 0) + return; + + /* Use the current state as the mask for non-zero length associated data */ + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + + /* Process all associated data blocks except the last */ + while (adlen > ORIBATIDA_256_RATE) { + lw_xor_block(state, ad, ORIBATIDA_256_RATE); + simp_256_permute(state, 2); + ad += ORIBATIDA_256_RATE; + adlen -= ORIBATIDA_256_RATE; + } + + /* Process the final associated data block */ + temp = (unsigned)adlen; + if (temp == ORIBATIDA_256_RATE) { + lw_xor_block(state, ad, ORIBATIDA_256_RATE); + } else { + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + } + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_AD]; + simp_256_permute(state, 4); +} + +/** + * \brief Initializes the Oribatida-192-96 state. + * + * \param state Oribatida-192-96 permutation state. + * \param mask Oribatida-192-96 masking state. + * \param domains Precomputed domain separation values. + * \param k Points to the key. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void oribatida_192_init + (unsigned char state[SIMP_192_STATE_SIZE], + unsigned char mask[ORIBATIDA_192_MASK_SIZE], + const unsigned char domains[ORIBATIDA_NUM_DOMAINS], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state with the key and nonce */ + memcpy(state, npub, ORIBATIDA_192_NONCE_SIZE); + memcpy(state + ORIBATIDA_192_NONCE_SIZE, k, ORIBATIDA_256_KEY_SIZE); + + /* Use the current state as the mask for zero-length associated data */ + if (adlen == 0) { + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + } + + /* Add the domain separation value for the nonce */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_NONCE]; + + /* Run the permutation for the first time */ + simp_192_permute(state, 4); + + /* If there is no associated data, then we are done */ + if (adlen == 0) + return; + + /* Use the current state as the mask for non-zero length associated data */ + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + + /* Process all associated data blocks except the last */ + while (adlen > ORIBATIDA_192_RATE) { + lw_xor_block(state, ad, ORIBATIDA_192_RATE); + simp_192_permute(state, 2); + ad += ORIBATIDA_192_RATE; + adlen -= ORIBATIDA_192_RATE; + } + + /* Process the final associated data block */ + temp = (unsigned)adlen; + if (temp == ORIBATIDA_192_RATE) { + lw_xor_block(state, ad, ORIBATIDA_192_RATE); + } else { + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + } + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_AD]; + simp_192_permute(state, 4); +} + +int oribatida_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_256_STATE_SIZE]; + unsigned char mask[ORIBATIDA_256_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORIBATIDA_256_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + oribatida_get_domains(domains, adlen, mlen, ORIBATIDA_256_RATE); + oribatida_256_init(state, mask, domains, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen > ORIBATIDA_256_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_256_RATE); + lw_xor_block(c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + simp_256_permute(state, 4); + c += ORIBATIDA_256_RATE; + m += ORIBATIDA_256_RATE; + mlen -= ORIBATIDA_256_RATE; + } + if (mlen == ORIBATIDA_256_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_256_RATE); + lw_xor_block(c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } else if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + if (temp > (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)) { + lw_xor_block + (c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, mask, + temp - (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)); + } + state[temp] ^= 0x80; /* padding */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } + + /* Generate the authentication tag */ + memcpy(c + mlen, state, ORIBATIDA_256_TAG_SIZE); + return 0; +} + +int oribatida_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_256_STATE_SIZE]; + unsigned char mask[ORIBATIDA_256_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + unsigned char block[ORIBATIDA_256_RATE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORIBATIDA_256_TAG_SIZE) + return -1; + *mlen = clen - ORIBATIDA_256_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + clen -= ORIBATIDA_256_TAG_SIZE; + oribatida_get_domains(domains, adlen, clen, ORIBATIDA_256_RATE); + oribatida_256_init(state, mask, domains, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + while (clen > ORIBATIDA_256_RATE) { + memcpy(block, c, ORIBATIDA_256_RATE); + lw_xor_block(block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_256_RATE); + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + simp_256_permute(state, 4); + c += ORIBATIDA_256_RATE; + m += ORIBATIDA_256_RATE; + clen -= ORIBATIDA_256_RATE; + } + if (clen == ORIBATIDA_256_RATE) { + memcpy(block, c, ORIBATIDA_256_RATE); + lw_xor_block(block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_256_RATE); + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } else if (clen > 0) { + unsigned temp = (unsigned)clen; + memcpy(block, c, temp); + if (temp > (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)) { + lw_xor_block + (block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, mask, + temp - (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)); + } + lw_xor_block_swap(m, state, block, temp); + state[temp] ^= 0x80; /* padding */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } + c += clen; + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state, c, ORIBATIDA_256_TAG_SIZE); +} + +int oribatida_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_192_STATE_SIZE]; + unsigned char mask[ORIBATIDA_192_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORIBATIDA_192_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + oribatida_get_domains(domains, adlen, mlen, ORIBATIDA_192_RATE); + oribatida_192_init(state, mask, domains, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen > ORIBATIDA_192_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_192_RATE); + lw_xor_block(c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + simp_192_permute(state, 4); + c += ORIBATIDA_192_RATE; + m += ORIBATIDA_192_RATE; + mlen -= ORIBATIDA_192_RATE; + } + if (mlen == ORIBATIDA_192_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_192_RATE); + lw_xor_block(c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } else if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + if (temp > (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)) { + lw_xor_block + (c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, mask, + temp - (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)); + } + state[temp] ^= 0x80; /* padding */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } + + /* Generate the authentication tag */ + memcpy(c + mlen, state, ORIBATIDA_192_TAG_SIZE); + return 0; +} + +int oribatida_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_192_STATE_SIZE]; + unsigned char mask[ORIBATIDA_192_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + unsigned char block[ORIBATIDA_192_RATE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORIBATIDA_192_TAG_SIZE) + return -1; + *mlen = clen - ORIBATIDA_192_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + clen -= ORIBATIDA_192_TAG_SIZE; + oribatida_get_domains(domains, adlen, clen, ORIBATIDA_192_RATE); + oribatida_192_init(state, mask, domains, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + while (clen > ORIBATIDA_192_RATE) { + memcpy(block, c, ORIBATIDA_192_RATE); + lw_xor_block(block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_192_RATE); + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + simp_192_permute(state, 4); + c += ORIBATIDA_192_RATE; + m += ORIBATIDA_192_RATE; + clen -= ORIBATIDA_192_RATE; + } + if (clen == ORIBATIDA_192_RATE) { + memcpy(block, c, ORIBATIDA_192_RATE); + lw_xor_block(block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_192_RATE); + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } else if (clen > 0) { + unsigned temp = (unsigned)clen; + memcpy(block, c, temp); + if (temp > (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)) { + lw_xor_block + (block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, mask, + temp - (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)); + } + lw_xor_block_swap(m, state, block, temp); + state[temp] ^= 0x80; /* padding */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } + c += clen; + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state, c, ORIBATIDA_192_TAG_SIZE); +} diff --git a/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.h b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.h new file mode 100644 index 0000000..dbc374b --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida192v12/rhys-avr/oribatida.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ORIBATIDA_H +#define LWCRYPTO_ORIBATIDA_H + +#include "aead-common.h" + +/** + * \file oribatida.h + * \brief Oribatida authenticated encryption algorithm. + * + * Oribatida is a family of authenticated encryption algorithms based on the + * SimP-256 and SimP-192 permutations which are built around reduced-round + * variants of the Simon-128-128 and Simon-96-96 block ciphers. + * There are two algorithms in the family: + * + * \li Oribatida-256-64 with a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * built around the SimP-256 permutation. This is the primary member of + * the family. + * \li Oribatida-192-96 with a 128-bit key, a 64-bit nonce, and a 96-bit tag, + * built around the SimP-192 permutation. + * + * References: https://www.isical.ac.in/~lightweight/oribatida/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Oribatida-256-64. + */ +#define ORIBATIDA_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Oribatida-256-64. + */ +#define ORIBATIDA_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Oribatida-256-64. + */ +#define ORIBATIDA_256_NONCE_SIZE 16 + +/** + * \brief Size of the key for Oribatida-192-96. + */ +#define ORIBATIDA_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Oribatida-192-96. + */ +#define ORIBATIDA_192_TAG_SIZE 12 + +/** + * \brief Size of the nonce for Oribatida-192-96. + */ +#define ORIBATIDA_192_NONCE_SIZE 8 + +/** + * \brief Meta-information block for the Oribatida-256-64 cipher. + */ +extern aead_cipher_t const oribatida_256_cipher; + +/** + * \brief Meta-information block for the Oribatida-192-96 cipher. + */ +extern aead_cipher_t const oribatida_192_cipher; + +/** + * \brief Encrypts and authenticates a packet with Oribatida-256-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa oribatida_256_aead_decrypt() + */ +int oribatida_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Oribatida-256-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa oribatida_256_aead_encrypt() + */ +int oribatida_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Oribatida-192-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa oribatida_192_aead_decrypt() + */ +int oribatida_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Oribatida-192-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa oribatida_192_aead_encrypt() + */ +int oribatida_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.c b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.h b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/api.h b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/encrypt.c b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/encrypt.c new file mode 100644 index 0000000..fd7d71e --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "oribatida.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return oribatida_256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return oribatida_256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp-avr.S b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp-avr.S new file mode 100644 index 0000000..65fba20 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp-avr.S @@ -0,0 +1,949 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global simp_256_permute + .type simp_256_permute, @function +simp_256_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r23,245 + mov r10,r23 + ldi r17,14 + mov r11,r17 + ldi r16,44 + mov r12,r16 + ldi r23,25 + mov r13,r23 + ldi r23,133 + mov r14,r23 + ldi r23,248 + mov r15,r23 + ldi r24,105 + ldi r25,51 +14: + ldi r23,17 +16: + ldd r29,Z+16 + ldd r28,Z+17 + ldd r27,Z+18 + ldd r26,Z+19 + ldd r21,Z+20 + ldd r20,Z+21 + ldd r19,Z+22 + ldd r18,Z+23 + mov r2,r29 + mov r3,r18 + mov r4,r19 + mov r5,r20 + mov r6,r21 + mov r7,r26 + mov r8,r27 + mov r9,r28 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r28 + rol r29 + adc r18,r1 + and r2,r18 + and r3,r19 + and r4,r20 + and r5,r21 + and r6,r26 + and r7,r27 + and r8,r28 + and r9,r29 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + rol r28 + rol r29 + adc r18,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + ldd r0,Z+8 + eor r9,r0 + ldd r0,Z+9 + eor r8,r0 + ldd r0,Z+10 + eor r7,r0 + ldd r0,Z+11 + eor r6,r0 + ldd r0,Z+12 + eor r5,r0 + ldd r0,Z+13 + eor r4,r0 + ldd r0,Z+14 + eor r3,r0 + ldd r0,Z+15 + eor r2,r0 + ldd r0,Z+24 + eor r0,r9 + std Z+24,r0 + ldd r0,Z+25 + eor r0,r8 + std Z+25,r0 + ldd r0,Z+26 + eor r0,r7 + std Z+26,r0 + ldd r0,Z+27 + eor r0,r6 + std Z+27,r0 + ldd r0,Z+28 + eor r0,r5 + std Z+28,r0 + ldd r0,Z+29 + eor r0,r4 + std Z+29,r0 + ldd r0,Z+30 + eor r0,r3 + std Z+30,r0 + ldd r0,Z+31 + eor r0,r2 + std Z+31,r0 + ld r29,Z + ldd r28,Z+1 + ldd r27,Z+2 + ldd r26,Z+3 + ldd r21,Z+4 + ldd r20,Z+5 + ldd r19,Z+6 + ldd r18,Z+7 + mov r0,r1 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r29,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + movw r8,r28 + bst r2,0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + bld r9,7 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + ldi r17,252 + eor r18,r17 + com r19 + com r20 + com r21 + com r26 + com r27 + com r28 + com r29 + mov r0,r1 + bst r10,0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + bld r25,5 + bld r0,0 + eor r18,r0 + ldd r0,Z+8 + eor r0,r29 + std Z+8,r0 + ldd r0,Z+9 + eor r0,r28 + std Z+9,r0 + ldd r0,Z+10 + eor r0,r27 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r26 + std Z+11,r0 + ldd r0,Z+12 + eor r0,r21 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r20 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r19 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r18 + std Z+15,r0 + ldd r9,Z+24 + ldd r8,Z+25 + ldd r7,Z+26 + ldd r6,Z+27 + ldd r5,Z+28 + ldd r4,Z+29 + ldd r3,Z+30 + ldd r2,Z+31 + mov r18,r9 + mov r19,r2 + mov r20,r3 + mov r21,r4 + mov r26,r5 + mov r27,r6 + mov r28,r7 + mov r29,r8 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + adc r2,r1 + and r18,r2 + and r19,r3 + and r20,r4 + and r21,r5 + and r26,r6 + and r27,r7 + and r28,r8 + and r29,r9 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + rol r8 + rol r9 + adc r2,r1 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + ld r0,Z + eor r29,r0 + ldd r0,Z+1 + eor r28,r0 + ldd r0,Z+2 + eor r27,r0 + ldd r0,Z+3 + eor r26,r0 + ldd r0,Z+4 + eor r21,r0 + ldd r0,Z+5 + eor r20,r0 + ldd r0,Z+6 + eor r19,r0 + ldd r0,Z+7 + eor r18,r0 + ldd r0,Z+16 + eor r0,r29 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r28 + std Z+17,r0 + ldd r0,Z+18 + eor r0,r27 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r26 + std Z+19,r0 + ldd r0,Z+20 + eor r0,r21 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r20 + std Z+21,r0 + ldd r0,Z+22 + eor r0,r19 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r18 + std Z+23,r0 + ldd r29,Z+8 + ldd r28,Z+9 + ldd r27,Z+10 + ldd r26,Z+11 + ldd r21,Z+12 + ldd r20,Z+13 + ldd r19,Z+14 + ldd r18,Z+15 + mov r0,r1 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r29,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + movw r8,r28 + bst r18,0 + lsr r29 + ror r28 + ror r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + bld r29,7 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + eor r2,r17 + com r3 + com r4 + com r5 + com r6 + com r7 + com r8 + com r9 + mov r0,r1 + bst r10,0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + bld r25,5 + bld r0,0 + eor r2,r0 + ld r0,Z + eor r0,r9 + st Z,r0 + ldd r0,Z+1 + eor r0,r8 + std Z+1,r0 + ldd r0,Z+2 + eor r0,r7 + std Z+2,r0 + ldd r0,Z+3 + eor r0,r6 + std Z+3,r0 + ldd r0,Z+4 + eor r0,r5 + std Z+4,r0 + ldd r0,Z+5 + eor r0,r4 + std Z+5,r0 + ldd r0,Z+6 + eor r0,r3 + std Z+6,r0 + ldd r0,Z+7 + eor r0,r2 + std Z+7,r0 + dec r23 + breq 5407f + rjmp 16b +5407: + dec r22 + brne 5409f + rjmp 475f +5409: + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + ldd r2,Z+16 + ldd r3,Z+17 + ldd r4,Z+18 + ldd r5,Z+19 + ldd r6,Z+20 + ldd r7,Z+21 + ldd r8,Z+22 + ldd r9,Z+23 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + std Z+4,r6 + std Z+5,r7 + std Z+6,r8 + std Z+7,r9 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + ldd r2,Z+24 + ldd r3,Z+25 + ldd r4,Z+26 + ldd r5,Z+27 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + std Z+12,r6 + std Z+13,r7 + std Z+14,r8 + std Z+15,r9 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+28,r26 + std Z+29,r27 + std Z+30,r28 + std Z+31,r29 + rjmp 14b +475: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size simp_256_permute, .-simp_256_permute + + .text +.global simp_192_permute + .type simp_192_permute, @function +simp_192_permute: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ldi r25,245 + mov r8,r25 + ldi r24,14 + mov r9,r24 + ldi r23,44 + mov r10,r23 + ldi r17,25 + mov r11,r17 + ldi r16,133 + mov r12,r16 + ldi r23,248 + mov r13,r23 + ldi r23,105 + mov r14,r23 + ldi r23,51 + mov r15,r23 +16: + ldi r23,13 +18: + ldd r27,Z+12 + ldd r26,Z+13 + ldd r21,Z+14 + ldd r20,Z+15 + ldd r19,Z+16 + ldd r18,Z+17 + mov r2,r27 + mov r3,r18 + mov r4,r19 + mov r5,r20 + mov r6,r21 + mov r7,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + adc r18,r1 + and r2,r18 + and r3,r19 + and r4,r20 + and r5,r21 + and r6,r26 + and r7,r27 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r26 + rol r27 + adc r18,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + ldd r0,Z+6 + eor r7,r0 + ldd r0,Z+7 + eor r6,r0 + ldd r0,Z+8 + eor r5,r0 + ldd r0,Z+9 + eor r4,r0 + ldd r0,Z+10 + eor r3,r0 + ldd r0,Z+11 + eor r2,r0 + ldd r0,Z+18 + eor r0,r7 + std Z+18,r0 + ldd r0,Z+19 + eor r0,r6 + std Z+19,r0 + ldd r0,Z+20 + eor r0,r5 + std Z+20,r0 + ldd r0,Z+21 + eor r0,r4 + std Z+21,r0 + ldd r0,Z+22 + eor r0,r3 + std Z+22,r0 + ldd r0,Z+23 + eor r0,r2 + std Z+23,r0 + ld r27,Z + ldd r26,Z+1 + ldd r21,Z+2 + ldd r20,Z+3 + ldd r19,Z+4 + ldd r18,Z+5 + mov r0,r1 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r27,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + bst r2,0 + lsr r7 + ror r6 + ror r5 + ror r4 + ror r3 + ror r2 + bld r7,7 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + ldi r25,252 + eor r18,r25 + com r19 + com r20 + com r21 + com r26 + com r27 + mov r0,r1 + bst r8,0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + ror r9 + ror r8 + bld r15,5 + bld r0,0 + eor r18,r0 + ldd r0,Z+6 + eor r0,r27 + std Z+6,r0 + ldd r0,Z+7 + eor r0,r26 + std Z+7,r0 + ldd r0,Z+8 + eor r0,r21 + std Z+8,r0 + ldd r0,Z+9 + eor r0,r20 + std Z+9,r0 + ldd r0,Z+10 + eor r0,r19 + std Z+10,r0 + ldd r0,Z+11 + eor r0,r18 + std Z+11,r0 + ldd r7,Z+18 + ldd r6,Z+19 + ldd r5,Z+20 + ldd r4,Z+21 + ldd r3,Z+22 + ldd r2,Z+23 + mov r18,r7 + mov r19,r2 + mov r20,r3 + mov r21,r4 + mov r26,r5 + mov r27,r6 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + adc r2,r1 + and r18,r2 + and r19,r3 + and r20,r4 + and r21,r5 + and r26,r6 + and r27,r7 + lsl r2 + rol r3 + rol r4 + rol r5 + rol r6 + rol r7 + adc r2,r1 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + eor r26,r6 + eor r27,r7 + ld r0,Z + eor r27,r0 + ldd r0,Z+1 + eor r26,r0 + ldd r0,Z+2 + eor r21,r0 + ldd r0,Z+3 + eor r20,r0 + ldd r0,Z+4 + eor r19,r0 + ldd r0,Z+5 + eor r18,r0 + ldd r0,Z+12 + eor r0,r27 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r26 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r21 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r20 + std Z+15,r0 + ldd r0,Z+16 + eor r0,r19 + std Z+16,r0 + ldd r0,Z+17 + eor r0,r18 + std Z+17,r0 + ldd r27,Z+6 + ldd r26,Z+7 + ldd r21,Z+8 + ldd r20,Z+9 + ldd r19,Z+10 + ldd r18,Z+11 + mov r0,r1 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + ror r0 + or r27,r0 + movw r2,r18 + movw r4,r20 + movw r6,r26 + bst r18,0 + lsr r27 + ror r26 + ror r21 + ror r20 + ror r19 + ror r18 + bld r27,7 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + eor r6,r26 + eor r7,r27 + eor r2,r25 + com r3 + com r4 + com r5 + com r6 + com r7 + mov r0,r1 + bst r8,0 + lsr r15 + ror r14 + ror r13 + ror r12 + ror r11 + ror r10 + ror r9 + ror r8 + bld r15,5 + bld r0,0 + eor r2,r0 + ld r0,Z + eor r0,r7 + st Z,r0 + ldd r0,Z+1 + eor r0,r6 + std Z+1,r0 + ldd r0,Z+2 + eor r0,r5 + std Z+2,r0 + ldd r0,Z+3 + eor r0,r4 + std Z+3,r0 + ldd r0,Z+4 + eor r0,r3 + std Z+4,r0 + ldd r0,Z+5 + eor r0,r2 + std Z+5,r0 + dec r23 + breq 5323f + rjmp 18b +5323: + dec r22 + breq 375f + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r2,Z+12 + ldd r3,Z+13 + ldd r4,Z+14 + ldd r5,Z+15 + ldd r6,Z+16 + ldd r7,Z+17 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + std Z+4,r6 + std Z+5,r7 + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + std Z+16,r26 + std Z+17,r27 + ldd r18,Z+6 + ldd r19,Z+7 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r26,Z+10 + ldd r27,Z+11 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + std Z+6,r2 + std Z+7,r3 + std Z+8,r4 + std Z+9,r5 + std Z+10,r6 + std Z+11,r7 + std Z+18,r18 + std Z+19,r19 + std Z+20,r20 + std Z+21,r21 + std Z+22,r26 + std Z+23,r27 + rjmp 16b +375: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size simp_192_permute, .-simp_192_permute + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.c b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.c new file mode 100644 index 0000000..5d2144e --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.c @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-simp.h" + +#if !defined(__AVR__) + +/** + * \brief Number of rounds for the inner block cipher within SimP-256. + */ +#define SIMP_256_ROUNDS 34 + +/** + * \brief Number of rounds for the inner block cipher within SimP-192. + */ +#define SIMP_192_ROUNDS 26 + +/** + * \brief Round constants for each of the rounds in SimP-256 or SimP-192. + * + * Bit i is the round constant for round i, repeated every 62 rounds. + */ +#define SIMP_RC 0x3369F885192C0EF5ULL + +void simp_256_permute(unsigned char state[SIMP_256_STATE_SIZE], unsigned steps) +{ + uint64_t z = SIMP_RC; + uint64_t x0, x1, x2, x3, t0, t1; + unsigned round; + + /* Load the state into local variables */ + x0 = be_load_word64(state); + x1 = be_load_word64(state + 8); + x2 = be_load_word64(state + 16); + x3 = be_load_word64(state + 24); + + /* Perform all steps */ + for (; steps > 0; --steps) { + /* Perform all rounds for this step, two at a time */ + for (round = 0; round < (SIMP_256_ROUNDS / 2); ++round) { + t1 = x3 ^ (leftRotate1_64(x2) & leftRotate8_64(x2)) ^ + leftRotate2_64(x2) ^ x1; + t0 = x1 ^ rightRotate3_64(x0) ^ rightRotate4_64(x0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + x2 = x2 ^ (leftRotate1_64(t1) & leftRotate8_64(t1)) ^ + leftRotate2_64(t1) ^ x0; + x0 = x0 ^ rightRotate3_64(t0) ^ rightRotate4_64(t0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + x1 = t0; + x3 = t1; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + } + + /* Swap the words of the state for all steps except the last */ + if (steps > 1) { + t0 = x0; + t1 = x1; + x0 = x2; + x1 = x3; + x2 = t0; + x3 = t1; + } + } + + /* Write the local variables back to the state */ + be_store_word64(state, x0); + be_store_word64(state + 8, x1); + be_store_word64(state + 16, x2); + be_store_word64(state + 24, x3); +} + +/* Load a big-endian 48-bit word from a byte buffer */ +#define be_load_word48(ptr) \ + ((((uint64_t)((ptr)[0])) << 40) | \ + (((uint64_t)((ptr)[1])) << 32) | \ + (((uint64_t)((ptr)[2])) << 24) | \ + (((uint64_t)((ptr)[3])) << 16) | \ + (((uint64_t)((ptr)[4])) << 8) | \ + ((uint64_t)((ptr)[5]))) + +/* Store a big-endian 48-bit word into a byte buffer */ +#define be_store_word48(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 40); \ + (ptr)[1] = (uint8_t)(_x >> 32); \ + (ptr)[2] = (uint8_t)(_x >> 24); \ + (ptr)[3] = (uint8_t)(_x >> 16); \ + (ptr)[4] = (uint8_t)(_x >> 8); \ + (ptr)[5] = (uint8_t)_x; \ + } while (0) + +/* 48-bit rotations with the high bits set to garbage - truncated later */ +#define rightRotate3_48(x) (((x) >> 3) | ((x) << 45)) +#define rightRotate4_48(x) (((x) >> 4) | ((x) << 44)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 47)) +#define leftRotate2_48(x) (((x) << 2) | ((x) >> 46)) +#define leftRotate8_48(x) (((x) << 8) | ((x) >> 40)) + +void simp_192_permute(unsigned char state[SIMP_192_STATE_SIZE], unsigned steps) +{ + uint64_t z = SIMP_RC; + uint64_t x0, x1, x2, x3, t0, t1; + unsigned round; + + /* Load the state into local variables */ + x0 = be_load_word48(state); + x1 = be_load_word48(state + 6); + x2 = be_load_word48(state + 12); + x3 = be_load_word48(state + 18); + + /* Perform all steps */ + for (; steps > 0; --steps) { + /* Perform all rounds for this step, two at a time */ + for (round = 0; round < (SIMP_192_ROUNDS / 2); ++round) { + t1 = x3 ^ (leftRotate1_48(x2) & leftRotate8_48(x2)) ^ + leftRotate2_48(x2) ^ x1; + t0 = x1 ^ rightRotate3_48(x0) ^ rightRotate4_48(x0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + t0 &= 0x0000FFFFFFFFFFFFULL; /* Truncate back to 48 bits */ + t1 &= 0x0000FFFFFFFFFFFFULL; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + x2 = x2 ^ (leftRotate1_48(t1) & leftRotate8_48(t1)) ^ + leftRotate2_48(t1) ^ x0; + x0 = x0 ^ rightRotate3_48(t0) ^ rightRotate4_48(t0) ^ + 0xFFFFFFFFFFFFFFFCULL ^ (z & 1); + x0 &= 0x0000FFFFFFFFFFFFULL; + x2 &= 0x0000FFFFFFFFFFFFULL; + x1 = t0; + x3 = t1; + z = (z >> 1) | (z << 61); /* z repeats every 62 rounds */ + } + + /* Swap the words of the state for all steps except the last */ + if (steps > 1) { + t0 = x0; + t1 = x1; + x0 = x2; + x1 = x3; + x2 = t0; + x3 = t1; + } + } + + /* Write the local variables back to the state */ + be_store_word48(state, x0); + be_store_word48(state + 6, x1); + be_store_word48(state + 12, x2); + be_store_word48(state + 18, x3); +} + +#endif /* !__AVR__ */ diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.h b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.h new file mode 100644 index 0000000..3a95e80 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-simp.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SIMP_H +#define LW_INTERNAL_SIMP_H + +#include "internal-util.h" + +/** + * \file internal-simp.h + * \brief SimP permutation family. + * + * SimP-256 and SimP-192 are used by the Oribatida submission to + * round 2 of the NIST Lightweight Cryptography Competition. + * The permutations are built around reduced-round variants of the + * Simon-128-128 and Simon-96-96 block ciphers. + * + * References: https://www.isical.ac.in/~lightweight/oribatida/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief State size of the SimP-256 permutation. + */ +#define SIMP_256_STATE_SIZE 32 + +/** + * \brief State size of the SimP-192 permutation. + */ +#define SIMP_192_STATE_SIZE 24 + +/** + * \brief Permutes a state with SimP-256. + * + * \param state State to be permuted. + * \param steps Number of steps to perform (usually 2 or 4). + */ +void simp_256_permute(unsigned char state[SIMP_256_STATE_SIZE], unsigned steps); + +/** + * \brief Permutes a state with SimP-192. + * + * \param state State to be permuted. + * \param steps Number of steps to perform (usually 2 or 4). + */ +void simp_192_permute(unsigned char state[SIMP_192_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-util.h b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.c b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.c new file mode 100644 index 0000000..55a3914 --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.c @@ -0,0 +1,480 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "oribatida.h" +#include "internal-simp.h" +#include + +/** + * \brief Rate for processing data for the Oribatida-256-64 state. + */ +#define ORIBATIDA_256_RATE 16 + +/** + * \brief Size of the masking value for Oribatida-256-64. + */ +#define ORIBATIDA_256_MASK_SIZE 8 + +/** + * \brief Rate for processing data for the Oribatida-192-96 state. + */ +#define ORIBATIDA_192_RATE 12 + +/** + * \brief Size of the masking value for Oribatida-192-96. + */ +#define ORIBATIDA_192_MASK_SIZE 12 + +aead_cipher_t const oribatida_256_cipher = { + "Oribatida-256-64", + ORIBATIDA_256_KEY_SIZE, + ORIBATIDA_256_NONCE_SIZE, + ORIBATIDA_256_TAG_SIZE, + AEAD_FLAG_NONE, + oribatida_256_aead_encrypt, + oribatida_256_aead_decrypt +}; + +aead_cipher_t const oribatida_192_cipher = { + "Oribatida-192-96", + ORIBATIDA_192_KEY_SIZE, + ORIBATIDA_192_NONCE_SIZE, + ORIBATIDA_192_TAG_SIZE, + AEAD_FLAG_NONE, + oribatida_192_aead_encrypt, + oribatida_192_aead_decrypt +}; + +/* Definitions for domain separation values */ +#define ORIBATIDA_NUM_DOMAINS 3 +#define ORIBATIDA_DOMAIN_NONCE 0 +#define ORIBATIDA_DOMAIN_AD 1 +#define ORIBATIDA_DOMAIN_MSG 2 + +/** + * \brief Gets the domain separation values to use for different phases + * of the Oribatida encryption process. + * + * \param domains Returns the domain separation values to use. + * \param adlen Length of the associated data. + * \param mlen Length of the plaintext message. + * \param rate Rate of processing message blocks, 12 or 16. + */ +static void oribatida_get_domains + (unsigned char domains[ORIBATIDA_NUM_DOMAINS], + unsigned long long adlen, unsigned long long mlen, unsigned rate) +{ + /* Domain separation value for the nonce */ + if (adlen == 0 && mlen == 0) { + domains[ORIBATIDA_DOMAIN_NONCE] = 9; + } else { + domains[ORIBATIDA_DOMAIN_NONCE] = 5; + } + + /* Domain separation value for associated data processing */ + if (mlen == 0) { + if ((adlen % rate) == 0) + domains[ORIBATIDA_DOMAIN_AD] = 12; + else + domains[ORIBATIDA_DOMAIN_AD] = 14; + } else { + if ((adlen % rate) == 0) + domains[ORIBATIDA_DOMAIN_AD] = 4; + else + domains[ORIBATIDA_DOMAIN_AD] = 6; + } + + /* Domain separation value for message processing */ + if ((mlen % rate) == 0) { + domains[ORIBATIDA_DOMAIN_MSG] = 13; + } else { + domains[ORIBATIDA_DOMAIN_MSG] = 15; + } +} + +/** + * \brief Initializes the Oribatida-256-64 state. + * + * \param state Oribatida-256-64 permutation state. + * \param mask Oribatida-256-64 masking state. + * \param domains Precomputed domain separation values. + * \param k Points to the key. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void oribatida_256_init + (unsigned char state[SIMP_256_STATE_SIZE], + unsigned char mask[ORIBATIDA_256_MASK_SIZE], + const unsigned char domains[ORIBATIDA_NUM_DOMAINS], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state with the key and nonce */ + memcpy(state, npub, ORIBATIDA_256_NONCE_SIZE); + memcpy(state + ORIBATIDA_256_NONCE_SIZE, k, ORIBATIDA_256_KEY_SIZE); + + /* Use the current state as the mask for zero-length associated data */ + if (adlen == 0) { + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + } + + /* Add the domain separation value for the nonce */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_NONCE]; + + /* Run the permutation for the first time */ + simp_256_permute(state, 4); + + /* If there is no associated data, then we are done */ + if (adlen == 0) + return; + + /* Use the current state as the mask for non-zero length associated data */ + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + + /* Process all associated data blocks except the last */ + while (adlen > ORIBATIDA_256_RATE) { + lw_xor_block(state, ad, ORIBATIDA_256_RATE); + simp_256_permute(state, 2); + ad += ORIBATIDA_256_RATE; + adlen -= ORIBATIDA_256_RATE; + } + + /* Process the final associated data block */ + temp = (unsigned)adlen; + if (temp == ORIBATIDA_256_RATE) { + lw_xor_block(state, ad, ORIBATIDA_256_RATE); + } else { + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + } + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_AD]; + simp_256_permute(state, 4); +} + +/** + * \brief Initializes the Oribatida-192-96 state. + * + * \param state Oribatida-192-96 permutation state. + * \param mask Oribatida-192-96 masking state. + * \param domains Precomputed domain separation values. + * \param k Points to the key. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void oribatida_192_init + (unsigned char state[SIMP_192_STATE_SIZE], + unsigned char mask[ORIBATIDA_192_MASK_SIZE], + const unsigned char domains[ORIBATIDA_NUM_DOMAINS], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state with the key and nonce */ + memcpy(state, npub, ORIBATIDA_192_NONCE_SIZE); + memcpy(state + ORIBATIDA_192_NONCE_SIZE, k, ORIBATIDA_256_KEY_SIZE); + + /* Use the current state as the mask for zero-length associated data */ + if (adlen == 0) { + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + } + + /* Add the domain separation value for the nonce */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_NONCE]; + + /* Run the permutation for the first time */ + simp_192_permute(state, 4); + + /* If there is no associated data, then we are done */ + if (adlen == 0) + return; + + /* Use the current state as the mask for non-zero length associated data */ + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + + /* Process all associated data blocks except the last */ + while (adlen > ORIBATIDA_192_RATE) { + lw_xor_block(state, ad, ORIBATIDA_192_RATE); + simp_192_permute(state, 2); + ad += ORIBATIDA_192_RATE; + adlen -= ORIBATIDA_192_RATE; + } + + /* Process the final associated data block */ + temp = (unsigned)adlen; + if (temp == ORIBATIDA_192_RATE) { + lw_xor_block(state, ad, ORIBATIDA_192_RATE); + } else { + lw_xor_block(state, ad, temp); + state[temp] ^= 0x80; /* padding */ + } + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_AD]; + simp_192_permute(state, 4); +} + +int oribatida_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_256_STATE_SIZE]; + unsigned char mask[ORIBATIDA_256_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORIBATIDA_256_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + oribatida_get_domains(domains, adlen, mlen, ORIBATIDA_256_RATE); + oribatida_256_init(state, mask, domains, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen > ORIBATIDA_256_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_256_RATE); + lw_xor_block(c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + simp_256_permute(state, 4); + c += ORIBATIDA_256_RATE; + m += ORIBATIDA_256_RATE; + mlen -= ORIBATIDA_256_RATE; + } + if (mlen == ORIBATIDA_256_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_256_RATE); + lw_xor_block(c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } else if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + if (temp > (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)) { + lw_xor_block + (c + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, mask, + temp - (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)); + } + state[temp] ^= 0x80; /* padding */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } + + /* Generate the authentication tag */ + memcpy(c + mlen, state, ORIBATIDA_256_TAG_SIZE); + return 0; +} + +int oribatida_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_256_STATE_SIZE]; + unsigned char mask[ORIBATIDA_256_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + unsigned char block[ORIBATIDA_256_RATE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORIBATIDA_256_TAG_SIZE) + return -1; + *mlen = clen - ORIBATIDA_256_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + clen -= ORIBATIDA_256_TAG_SIZE; + oribatida_get_domains(domains, adlen, clen, ORIBATIDA_256_RATE); + oribatida_256_init(state, mask, domains, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + while (clen > ORIBATIDA_256_RATE) { + memcpy(block, c, ORIBATIDA_256_RATE); + lw_xor_block(block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_256_RATE); + memcpy(mask, state + SIMP_256_STATE_SIZE - ORIBATIDA_256_MASK_SIZE, + ORIBATIDA_256_MASK_SIZE); + simp_256_permute(state, 4); + c += ORIBATIDA_256_RATE; + m += ORIBATIDA_256_RATE; + clen -= ORIBATIDA_256_RATE; + } + if (clen == ORIBATIDA_256_RATE) { + memcpy(block, c, ORIBATIDA_256_RATE); + lw_xor_block(block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, + mask, ORIBATIDA_256_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_256_RATE); + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } else if (clen > 0) { + unsigned temp = (unsigned)clen; + memcpy(block, c, temp); + if (temp > (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)) { + lw_xor_block + (block + ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE, mask, + temp - (ORIBATIDA_256_RATE - ORIBATIDA_256_MASK_SIZE)); + } + lw_xor_block_swap(m, state, block, temp); + state[temp] ^= 0x80; /* padding */ + state[SIMP_256_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_256_permute(state, 4); + } + c += clen; + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state, c, ORIBATIDA_256_TAG_SIZE); +} + +int oribatida_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_192_STATE_SIZE]; + unsigned char mask[ORIBATIDA_192_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ORIBATIDA_192_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + oribatida_get_domains(domains, adlen, mlen, ORIBATIDA_192_RATE); + oribatida_192_init(state, mask, domains, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen > ORIBATIDA_192_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_192_RATE); + lw_xor_block(c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + simp_192_permute(state, 4); + c += ORIBATIDA_192_RATE; + m += ORIBATIDA_192_RATE; + mlen -= ORIBATIDA_192_RATE; + } + if (mlen == ORIBATIDA_192_RATE) { + lw_xor_block_2_dest(c, state, m, ORIBATIDA_192_RATE); + lw_xor_block(c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } else if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state, m, temp); + if (temp > (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)) { + lw_xor_block + (c + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, mask, + temp - (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)); + } + state[temp] ^= 0x80; /* padding */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } + + /* Generate the authentication tag */ + memcpy(c + mlen, state, ORIBATIDA_192_TAG_SIZE); + return 0; +} + +int oribatida_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SIMP_192_STATE_SIZE]; + unsigned char mask[ORIBATIDA_192_MASK_SIZE]; + unsigned char domains[ORIBATIDA_NUM_DOMAINS]; + unsigned char block[ORIBATIDA_192_RATE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ORIBATIDA_192_TAG_SIZE) + return -1; + *mlen = clen - ORIBATIDA_192_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + clen -= ORIBATIDA_192_TAG_SIZE; + oribatida_get_domains(domains, adlen, clen, ORIBATIDA_192_RATE); + oribatida_192_init(state, mask, domains, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + while (clen > ORIBATIDA_192_RATE) { + memcpy(block, c, ORIBATIDA_192_RATE); + lw_xor_block(block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_192_RATE); + memcpy(mask, state + SIMP_192_STATE_SIZE - ORIBATIDA_192_MASK_SIZE, + ORIBATIDA_192_MASK_SIZE); + simp_192_permute(state, 4); + c += ORIBATIDA_192_RATE; + m += ORIBATIDA_192_RATE; + clen -= ORIBATIDA_192_RATE; + } + if (clen == ORIBATIDA_192_RATE) { + memcpy(block, c, ORIBATIDA_192_RATE); + lw_xor_block(block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, + mask, ORIBATIDA_192_MASK_SIZE); + lw_xor_block_swap(m, state, block, ORIBATIDA_192_RATE); + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } else if (clen > 0) { + unsigned temp = (unsigned)clen; + memcpy(block, c, temp); + if (temp > (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)) { + lw_xor_block + (block + ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE, mask, + temp - (ORIBATIDA_192_RATE - ORIBATIDA_192_MASK_SIZE)); + } + lw_xor_block_swap(m, state, block, temp); + state[temp] ^= 0x80; /* padding */ + state[SIMP_192_STATE_SIZE - 1] ^= domains[ORIBATIDA_DOMAIN_MSG]; + simp_192_permute(state, 4); + } + c += clen; + + /* Check the authentication tag */ + return aead_check_tag(mtemp, *mlen, state, c, ORIBATIDA_192_TAG_SIZE); +} diff --git a/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.h b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.h new file mode 100644 index 0000000..dbc374b --- /dev/null +++ b/oribatida/Implementations/crypto_aead/oribatida256v12/rhys-avr/oribatida.h @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ORIBATIDA_H +#define LWCRYPTO_ORIBATIDA_H + +#include "aead-common.h" + +/** + * \file oribatida.h + * \brief Oribatida authenticated encryption algorithm. + * + * Oribatida is a family of authenticated encryption algorithms based on the + * SimP-256 and SimP-192 permutations which are built around reduced-round + * variants of the Simon-128-128 and Simon-96-96 block ciphers. + * There are two algorithms in the family: + * + * \li Oribatida-256-64 with a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * built around the SimP-256 permutation. This is the primary member of + * the family. + * \li Oribatida-192-96 with a 128-bit key, a 64-bit nonce, and a 96-bit tag, + * built around the SimP-192 permutation. + * + * References: https://www.isical.ac.in/~lightweight/oribatida/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Oribatida-256-64. + */ +#define ORIBATIDA_256_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Oribatida-256-64. + */ +#define ORIBATIDA_256_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Oribatida-256-64. + */ +#define ORIBATIDA_256_NONCE_SIZE 16 + +/** + * \brief Size of the key for Oribatida-192-96. + */ +#define ORIBATIDA_192_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Oribatida-192-96. + */ +#define ORIBATIDA_192_TAG_SIZE 12 + +/** + * \brief Size of the nonce for Oribatida-192-96. + */ +#define ORIBATIDA_192_NONCE_SIZE 8 + +/** + * \brief Meta-information block for the Oribatida-256-64 cipher. + */ +extern aead_cipher_t const oribatida_256_cipher; + +/** + * \brief Meta-information block for the Oribatida-192-96 cipher. + */ +extern aead_cipher_t const oribatida_192_cipher; + +/** + * \brief Encrypts and authenticates a packet with Oribatida-256-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa oribatida_256_aead_decrypt() + */ +int oribatida_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Oribatida-256-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa oribatida_256_aead_encrypt() + */ +int oribatida_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Oribatida-192-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa oribatida_192_aead_decrypt() + */ +int oribatida_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Oribatida-192-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa oribatida_192_aead_encrypt() + */ +int oribatida_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/api.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/encrypt.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..a36c2ea --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "photon-beetle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return photon_beetle_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return photon_beetle_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.c new file mode 100644 index 0000000..b8743fe --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.c @@ -0,0 +1,479 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-photon256.h" +#include "internal-util.h" + +/** + * \brief Number of rounds in the PHOTON-256 permutation in bit-sliced form. + */ +#define PHOTON256_ROUNDS 12 + +/* Round constants for PHOTON-256 */ +static uint32_t const photon256_rc[PHOTON256_ROUNDS] = { + 0x96d2f0e1, 0xb4f0d2c3, 0xf0b49687, 0x692d0f1e, + 0x5a1e3c2d, 0x3c785a4b, 0xe1a58796, 0x4b0f2d3c, + 0x1e5a7869, 0xa5e1c3d2, 0xd296b4a5, 0x2d694b5a +}; + +/** + * \brief Evaluates the PHOTON-256 S-box in bit-sliced form. + * + * \param x0 Slice with bit 0 of all nibbles. + * \param x1 Slice with bit 1 of all nibbles. + * \param x2 Slice with bit 2 of all nibbles. + * \param x3 Slice with bit 3 of all nibbles. + * + * This bit-sliced S-box implementation is based on the AVR version + * "add_avr8_bitslice_asm" from the PHOTON-Beetle reference code. + */ +#define photon256_sbox(x0, x1, x2, x3) \ + do { \ + x1 ^= x2; \ + x3 ^= (x2 & x1); \ + t1 = x3; \ + x3 = (x3 & x1) ^ x2; \ + t2 = x3; \ + x3 ^= x0; \ + x3 = ~(x3); \ + x2 = x3; \ + t2 |= x0; \ + x0 ^= t1; \ + x1 ^= x0; \ + x2 |= x1; \ + x2 ^= t1; \ + x1 ^= t2; \ + x3 ^= x1; \ + } while (0) + +/** + * \brief Performs a field multiplication on the 8 nibbles in a row. + * + * \param a Field constant to multiply by. + * \param x Bit-sliced form of the row, with bits 0..3 of each nibble + * in bytes 0..3 of the word. + * + * \return a * x packed into the bytes of a word. + */ +static uint32_t photon256_field_multiply(uint8_t a, uint32_t x) +{ + /* For each 4-bit nibble we need to do this: + * + * result = 0; + * for (bit = 0; bit < 4; ++ bit) { + * if ((a & (1 << bit)) != 0) + * result ^= x; + * if ((x & 0x08) != 0) { + * x = (x << 1) ^ 3; + * } else { + * x = (x << 1); + * } + * } + * + * We don't need to worry about constant time for "a" because it is a + * known constant that isn't data-dependent. But we do need to worry + * about constant time for "x" as it is data. + */ + uint32_t result = 0; + uint32_t t; + #define PARALLEL_CONDITIONAL_ADD(bit) \ + do { \ + if ((a) & (1 << (bit))) \ + result ^= x; \ + } while (0) + #define PARALELL_ROTATE() \ + do { \ + t = x >> 24; \ + x = (x << 8) ^ t ^ (t << 8); \ + } while (0) + PARALLEL_CONDITIONAL_ADD(0); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(1); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(2); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(3); + return result; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts a PHOTON-256 state into bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_to_sliced + (uint32_t out[PHOTON256_STATE_SIZE / 4], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* We first scatter bits 0..3 of the nibbles to bytes 0..3 of the words. + * Then we rearrange the bytes to group all bits N into word N. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 + * 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31] + */ + uint32_t t0, t1, t2, t3; + #define TO_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + #define FROM_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + t0 = le_load_word32(in); + t1 = le_load_word32(in + 4); + t2 = le_load_word32(in + 8); + t3 = le_load_word32(in + 12); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[0] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[1] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[2] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[3] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); + t0 = le_load_word32(in + 16); + t1 = le_load_word32(in + 20); + t2 = le_load_word32(in + 24); + t3 = le_load_word32(in + 28); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[4] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[5] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[6] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[7] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); +} + +/** + * \brief Converts a PHOTON-256 state from bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_from_sliced + (unsigned char out[PHOTON256_STATE_SIZE], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* Do the reverse of photon256_to_sliced() */ + uint32_t x0, x1, x2, x3; + x0 = ((uint32_t)(in[0])) | + (((uint32_t)(in[4])) << 8) | + (((uint32_t)(in[8])) << 16) | + (((uint32_t)(in[12])) << 24); + x1 = ((uint32_t)(in[1])) | + (((uint32_t)(in[5])) << 8) | + (((uint32_t)(in[9])) << 16) | + (((uint32_t)(in[13])) << 24); + x2 = ((uint32_t)(in[2])) | + (((uint32_t)(in[6])) << 8) | + (((uint32_t)(in[10])) << 16) | + (((uint32_t)(in[14])) << 24); + x3 = ((uint32_t)(in[3])) | + (((uint32_t)(in[7])) << 8) | + (((uint32_t)(in[11])) << 16) | + (((uint32_t)(in[15])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out, x0); + le_store_word32(out + 4, x1); + le_store_word32(out + 8, x2); + le_store_word32(out + 12, x3); + x0 = ((uint32_t)(in[16])) | + (((uint32_t)(in[20])) << 8) | + (((uint32_t)(in[24])) << 16) | + (((uint32_t)(in[28])) << 24); + x1 = ((uint32_t)(in[17])) | + (((uint32_t)(in[21])) << 8) | + (((uint32_t)(in[25])) << 16) | + (((uint32_t)(in[29])) << 24); + x2 = ((uint32_t)(in[18])) | + (((uint32_t)(in[22])) << 8) | + (((uint32_t)(in[26])) << 16) | + (((uint32_t)(in[30])) << 24); + x3 = ((uint32_t)(in[19])) | + (((uint32_t)(in[23])) << 8) | + (((uint32_t)(in[27])) << 16) | + (((uint32_t)(in[31])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out + 16, x0); + le_store_word32(out + 20, x1); + le_store_word32(out + 24, x2); + le_store_word32(out + 28, x3); +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +/* Index the bit-sliced state bytes in little-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[(row)] = (uint8_t)(value); \ + S.bytes[(row) + 4] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 8] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 12] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[(row) + 12] = (uint8_t)(value); \ + S.bytes[(row) + 16] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 20] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 24] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#else +/* Index the bit-sliced state bytes in big-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[3 - (row)] = (uint8_t)(value); \ + S.bytes[7 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[11 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[15 - (row)] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[20 - (row)] = (uint8_t)(value); \ + S.bytes[24 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[28 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[32 - (row)] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#endif + +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]) +{ + union { + uint32_t words[PHOTON256_STATE_SIZE / 4]; + uint8_t bytes[PHOTON256_STATE_SIZE]; + } S; + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + uint8_t round; + + /* Convert the state into bit-sliced form */ + photon256_to_sliced(S.words, state); + + /* Perform all 12 permutation rounds */ + for (round = 0; round < PHOTON256_ROUNDS; ++round) { + /* Add the constants for this round */ + t0 = photon256_rc[round]; + S.words[0] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[1] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[2] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[3] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[4] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[5] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[6] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[7] ^= t0 & 0x01010101U; + + /* Apply the sbox to all nibbles in the state */ + photon256_sbox(S.words[0], S.words[1], S.words[2], S.words[3]); + photon256_sbox(S.words[4], S.words[5], S.words[6], S.words[7]); + + /* Rotate all rows left by the row number. + * + * We do this by applying permutations to the top and bottom words + * to rearrange the bits into the rotated form. Permutations + * generated with "http://programming.sirrida.de/calcperm.php". + * + * P_top = [0 1 2 3 4 5 6 7 15 8 9 10 11 12 13 14 22 23 + * 16 17 18 19 20 21 29 30 31 24 25 26 27 28] + * P_bot = [4 5 6 7 0 1 2 3 11 12 13 14 15 8 9 10 18 19 + * 20 21 22 23 16 17 25 26 27 28 29 30 31 24 + */ + #define TOP_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x07030100, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + #define BOTTOM_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x080c0e0f, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + TOP_ROTATE_PERM(S.words[0]); + TOP_ROTATE_PERM(S.words[1]); + TOP_ROTATE_PERM(S.words[2]); + TOP_ROTATE_PERM(S.words[3]); + BOTTOM_ROTATE_PERM(S.words[4]); + BOTTOM_ROTATE_PERM(S.words[5]); + BOTTOM_ROTATE_PERM(S.words[6]); + BOTTOM_ROTATE_PERM(S.words[7]); + + /* Mix the columns */ + #define MUL(a, x) (photon256_field_multiply((a), (x))) + t0 = READ_ROW0(); + t1 = READ_ROW1(); + t2 = READ_ROW2(); + t3 = READ_ROW3(); + t4 = READ_ROW4(); + t5 = READ_ROW5(); + t6 = READ_ROW6(); + t7 = READ_ROW7(); + t8 = MUL(0x02, t0) ^ MUL(0x04, t1) ^ MUL(0x02, t2) ^ MUL(0x0b, t3) ^ + MUL(0x02, t4) ^ MUL(0x08, t5) ^ MUL(0x05, t6) ^ MUL(0x06, t7); + WRITE_ROW(0, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x09, t1) ^ MUL(0x08, t2) ^ MUL(0x0d, t3) ^ + MUL(0x07, t4) ^ MUL(0x07, t5) ^ MUL(0x05, t6) ^ MUL(0x02, t7); + WRITE_ROW(1, t8); + t8 = MUL(0x04, t0) ^ MUL(0x04, t1) ^ MUL(0x0d, t2) ^ MUL(0x0d, t3) ^ + MUL(0x09, t4) ^ MUL(0x04, t5) ^ MUL(0x0d, t6) ^ MUL(0x09, t7); + WRITE_ROW(2, t8); + t8 = MUL(0x01, t0) ^ MUL(0x06, t1) ^ MUL(0x05, t2) ^ MUL(0x01, t3) ^ + MUL(0x0c, t4) ^ MUL(0x0d, t5) ^ MUL(0x0f, t6) ^ MUL(0x0e, t7); + WRITE_ROW(3, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x0c, t1) ^ MUL(0x09, t2) ^ MUL(0x0d, t3) ^ + MUL(0x0e, t4) ^ MUL(0x05, t5) ^ MUL(0x0e, t6) ^ MUL(0x0d, t7); + WRITE_ROW(4, t8); + t8 = MUL(0x09, t0) ^ MUL(0x0e, t1) ^ MUL(0x05, t2) ^ MUL(0x0f, t3) ^ + MUL(0x04, t4) ^ MUL(0x0c, t5) ^ MUL(0x09, t6) ^ MUL(0x06, t7); + WRITE_ROW(5, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x02, t1) ^ MUL(0x02, t2) ^ MUL(0x0a, t3) ^ + MUL(0x03, t4) ^ MUL(0x01, t5) ^ MUL(0x01, t6) ^ MUL(0x0e, t7); + WRITE_ROW(6, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x01, t1) ^ MUL(0x0d, t2) ^ MUL(0x0a, t3) ^ + MUL(0x05, t4) ^ MUL(0x0a, t5) ^ MUL(0x02, t6) ^ MUL(0x03, t7); + WRITE_ROW(7, t8); + } + + /* Convert back from bit-sliced form to regular form */ + photon256_from_sliced(state, S.bytes); +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.h new file mode 100644 index 0000000..ce8729a --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-photon256.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PHOTON256_H +#define LW_INTERNAL_PHOTON256_H + +/** + * \file internal-photon256.h + * \brief Internal implementation of the PHOTON-256 permutation. + * + * Warning: The current implementation of PHOTON-256 is constant-time + * but not constant-cache. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the PHOTON-256 permutation state in bytes. + */ +#define PHOTON256_STATE_SIZE 32 + +/** + * \brief Permutes the PHOTON-256 state. + * + * \param state The state to be permuted. + */ +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-util.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.c new file mode 100644 index 0000000..f44bdad --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.c @@ -0,0 +1,451 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "photon-beetle.h" +#include "internal-photon256.h" +#include "internal-util.h" +#include + +aead_cipher_t const photon_beetle_128_cipher = { + "PHOTON-Beetle-AEAD-ENC-128", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_128_aead_encrypt, + photon_beetle_128_aead_decrypt +}; + +aead_cipher_t const photon_beetle_32_cipher = { + "PHOTON-Beetle-AEAD-ENC-32", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_32_aead_encrypt, + photon_beetle_32_aead_decrypt +}; + +aead_hash_algorithm_t const photon_beetle_hash_algorithm = { + "PHOTON-Beetle-HASH", + sizeof(int), + PHOTON_BEETLE_HASH_SIZE, + AEAD_FLAG_NONE, + photon_beetle_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-128. + */ +#define PHOTON_BEETLE_128_RATE 16 + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-32. + */ +#define PHOTON_BEETLE_32_RATE 4 + +/* Shifts a domain constant from the spec to the correct bit position */ +#define DOMAIN(c) ((c) << 5) + +/** + * \brief Processes the associated data for PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be non-zero. + * \param rate Rate of absorption for the data. + * \param mempty Non-zero if the message is empty. + */ +static void photon_beetle_process_ad + (unsigned char state[PHOTON256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen, + unsigned rate, int mempty) +{ + unsigned temp; + + /* Absorb as many full rate blocks as possible */ + while (adlen > rate) { + photon256_permute(state); + lw_xor_block(state, ad, rate); + ad += rate; + adlen -= rate; + } + + /* Pad and absorb the last block */ + temp = (unsigned)adlen; + photon256_permute(state); + lw_xor_block(state, ad, temp); + if (temp < rate) + state[temp] ^= 0x01; /* padding */ + + /* Add the domain constant to finalize associated data processing */ + if (mempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(3); + else if (mempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(4); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Rotates part of the PHOTON-256 state right by one bit. + * + * \param out Output state buffer. + * \param in Input state buffer, must not overlap with \a out. + * \param len Length of the state buffer. + */ +static void photon_beetle_rotate1 + (unsigned char *out, const unsigned char *in, unsigned len) +{ + unsigned posn; + for (posn = 0; posn < (len - 1); ++posn) + out[posn] = (in[posn] >> 1) | (in[posn + 1] << 7); + out[len - 1] = (in[len - 1] >> 1) | (in[0] << 7); +} + +/** + * \brief Encrypts a plaintext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_encrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *c, const unsigned char *m, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + } else { + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + lw_xor_block_2_src(c, m, shuffle, temp); + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Decrypts a ciphertext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_decrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *m, const unsigned char *c, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + } else { + lw_xor_block_2_src(m, c, shuffle, temp); + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + unsigned temp; + + /* Absorb the input data */ + if (inlen == 0) { + /* No input data at all */ + memset(state, 0, sizeof(state) - 1); + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else if (inlen <= PHOTON_BEETLE_128_RATE) { + /* Only one block of input data, which may require padding */ + temp = (unsigned)inlen; + memcpy(state, in, temp); + memset(state + temp, 0, sizeof(state) - temp - 1); + if (temp < PHOTON_BEETLE_128_RATE) { + state[temp] = 0x01; + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else { + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(2); + } + } else { + /* Initialize the state with the first block, then absorb the rest */ + memcpy(state, in, PHOTON_BEETLE_128_RATE); + memset(state + PHOTON_BEETLE_128_RATE, 0, + sizeof(state) - PHOTON_BEETLE_128_RATE); + in += PHOTON_BEETLE_128_RATE; + inlen -= PHOTON_BEETLE_128_RATE; + while (inlen > PHOTON_BEETLE_32_RATE) { + photon256_permute(state); + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + in += PHOTON_BEETLE_32_RATE; + inlen -= PHOTON_BEETLE_32_RATE; + } + photon256_permute(state); + temp = (unsigned)inlen; + if (temp == PHOTON_BEETLE_32_RATE) { + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } else { + lw_xor_block(state, in, temp); + state[temp] ^= 0x01; + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); + } + } + + /* Generate the output hash */ + photon256_permute(state); + memcpy(out, state, 16); + photon256_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.h new file mode 100644 index 0000000..2d94a7e --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate128v1/rhys-avr/photon-beetle.h @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_PHOTON_BEETLE_H +#define LWCRYPTO_PHOTON_BEETLE_H + +#include "aead-common.h" + +/** + * \file photon-beetle.h + * \brief PHOTON-Beetle authenticated encryption algorithm. + * + * PHOTON-Beetle is a family of authenticated encryption algorithms based + * on the PHOTON-256 permutation and using the Beetle sponge mode. + * There are three algorithms in the family: + * + * \li PHOTON-Beetle-AEAD-ENC-128 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 16 byte blocks. This is the primary + * member of the family for encryption. + * \li PHOTON-Beetle-AEAD-ENC-32 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 4 byte blocks. + * \li PHOTON-Beetle-Hash with a 256-bit hash output. The initial data is + * handled as a 16 byte block, and then the remaining bytes are processed + * in 4 byte blocks. + * + * References: https://www.isical.ac.in/~lightweight/beetle/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for PHOTON-Beetle-HASH. + */ +#define PHOTON_BEETLE_HASH_SIZE 32 + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-128 cipher. + */ +extern aead_cipher_t const photon_beetle_128_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-32 cipher. + */ +extern aead_cipher_t const photon_beetle_32_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-HASH algorithm. + */ +extern aead_hash_algorithm_t const photon_beetle_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_128_aead_decrypt() + */ +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_128_aead_encrypt() + */ +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_32_aead_decrypt() + */ +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_32_aead_encrypt() + */ +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with PHOTON-Beetle-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * PHOTON_BEETLE_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/api.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/encrypt.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..17af9cd --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "photon-beetle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return photon_beetle_32_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return photon_beetle_32_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.c new file mode 100644 index 0000000..b8743fe --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.c @@ -0,0 +1,479 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-photon256.h" +#include "internal-util.h" + +/** + * \brief Number of rounds in the PHOTON-256 permutation in bit-sliced form. + */ +#define PHOTON256_ROUNDS 12 + +/* Round constants for PHOTON-256 */ +static uint32_t const photon256_rc[PHOTON256_ROUNDS] = { + 0x96d2f0e1, 0xb4f0d2c3, 0xf0b49687, 0x692d0f1e, + 0x5a1e3c2d, 0x3c785a4b, 0xe1a58796, 0x4b0f2d3c, + 0x1e5a7869, 0xa5e1c3d2, 0xd296b4a5, 0x2d694b5a +}; + +/** + * \brief Evaluates the PHOTON-256 S-box in bit-sliced form. + * + * \param x0 Slice with bit 0 of all nibbles. + * \param x1 Slice with bit 1 of all nibbles. + * \param x2 Slice with bit 2 of all nibbles. + * \param x3 Slice with bit 3 of all nibbles. + * + * This bit-sliced S-box implementation is based on the AVR version + * "add_avr8_bitslice_asm" from the PHOTON-Beetle reference code. + */ +#define photon256_sbox(x0, x1, x2, x3) \ + do { \ + x1 ^= x2; \ + x3 ^= (x2 & x1); \ + t1 = x3; \ + x3 = (x3 & x1) ^ x2; \ + t2 = x3; \ + x3 ^= x0; \ + x3 = ~(x3); \ + x2 = x3; \ + t2 |= x0; \ + x0 ^= t1; \ + x1 ^= x0; \ + x2 |= x1; \ + x2 ^= t1; \ + x1 ^= t2; \ + x3 ^= x1; \ + } while (0) + +/** + * \brief Performs a field multiplication on the 8 nibbles in a row. + * + * \param a Field constant to multiply by. + * \param x Bit-sliced form of the row, with bits 0..3 of each nibble + * in bytes 0..3 of the word. + * + * \return a * x packed into the bytes of a word. + */ +static uint32_t photon256_field_multiply(uint8_t a, uint32_t x) +{ + /* For each 4-bit nibble we need to do this: + * + * result = 0; + * for (bit = 0; bit < 4; ++ bit) { + * if ((a & (1 << bit)) != 0) + * result ^= x; + * if ((x & 0x08) != 0) { + * x = (x << 1) ^ 3; + * } else { + * x = (x << 1); + * } + * } + * + * We don't need to worry about constant time for "a" because it is a + * known constant that isn't data-dependent. But we do need to worry + * about constant time for "x" as it is data. + */ + uint32_t result = 0; + uint32_t t; + #define PARALLEL_CONDITIONAL_ADD(bit) \ + do { \ + if ((a) & (1 << (bit))) \ + result ^= x; \ + } while (0) + #define PARALELL_ROTATE() \ + do { \ + t = x >> 24; \ + x = (x << 8) ^ t ^ (t << 8); \ + } while (0) + PARALLEL_CONDITIONAL_ADD(0); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(1); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(2); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(3); + return result; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts a PHOTON-256 state into bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_to_sliced + (uint32_t out[PHOTON256_STATE_SIZE / 4], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* We first scatter bits 0..3 of the nibbles to bytes 0..3 of the words. + * Then we rearrange the bytes to group all bits N into word N. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 + * 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31] + */ + uint32_t t0, t1, t2, t3; + #define TO_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + #define FROM_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + t0 = le_load_word32(in); + t1 = le_load_word32(in + 4); + t2 = le_load_word32(in + 8); + t3 = le_load_word32(in + 12); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[0] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[1] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[2] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[3] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); + t0 = le_load_word32(in + 16); + t1 = le_load_word32(in + 20); + t2 = le_load_word32(in + 24); + t3 = le_load_word32(in + 28); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[4] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[5] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[6] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[7] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); +} + +/** + * \brief Converts a PHOTON-256 state from bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_from_sliced + (unsigned char out[PHOTON256_STATE_SIZE], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* Do the reverse of photon256_to_sliced() */ + uint32_t x0, x1, x2, x3; + x0 = ((uint32_t)(in[0])) | + (((uint32_t)(in[4])) << 8) | + (((uint32_t)(in[8])) << 16) | + (((uint32_t)(in[12])) << 24); + x1 = ((uint32_t)(in[1])) | + (((uint32_t)(in[5])) << 8) | + (((uint32_t)(in[9])) << 16) | + (((uint32_t)(in[13])) << 24); + x2 = ((uint32_t)(in[2])) | + (((uint32_t)(in[6])) << 8) | + (((uint32_t)(in[10])) << 16) | + (((uint32_t)(in[14])) << 24); + x3 = ((uint32_t)(in[3])) | + (((uint32_t)(in[7])) << 8) | + (((uint32_t)(in[11])) << 16) | + (((uint32_t)(in[15])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out, x0); + le_store_word32(out + 4, x1); + le_store_word32(out + 8, x2); + le_store_word32(out + 12, x3); + x0 = ((uint32_t)(in[16])) | + (((uint32_t)(in[20])) << 8) | + (((uint32_t)(in[24])) << 16) | + (((uint32_t)(in[28])) << 24); + x1 = ((uint32_t)(in[17])) | + (((uint32_t)(in[21])) << 8) | + (((uint32_t)(in[25])) << 16) | + (((uint32_t)(in[29])) << 24); + x2 = ((uint32_t)(in[18])) | + (((uint32_t)(in[22])) << 8) | + (((uint32_t)(in[26])) << 16) | + (((uint32_t)(in[30])) << 24); + x3 = ((uint32_t)(in[19])) | + (((uint32_t)(in[23])) << 8) | + (((uint32_t)(in[27])) << 16) | + (((uint32_t)(in[31])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out + 16, x0); + le_store_word32(out + 20, x1); + le_store_word32(out + 24, x2); + le_store_word32(out + 28, x3); +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +/* Index the bit-sliced state bytes in little-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[(row)] = (uint8_t)(value); \ + S.bytes[(row) + 4] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 8] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 12] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[(row) + 12] = (uint8_t)(value); \ + S.bytes[(row) + 16] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 20] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 24] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#else +/* Index the bit-sliced state bytes in big-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[3 - (row)] = (uint8_t)(value); \ + S.bytes[7 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[11 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[15 - (row)] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[20 - (row)] = (uint8_t)(value); \ + S.bytes[24 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[28 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[32 - (row)] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#endif + +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]) +{ + union { + uint32_t words[PHOTON256_STATE_SIZE / 4]; + uint8_t bytes[PHOTON256_STATE_SIZE]; + } S; + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + uint8_t round; + + /* Convert the state into bit-sliced form */ + photon256_to_sliced(S.words, state); + + /* Perform all 12 permutation rounds */ + for (round = 0; round < PHOTON256_ROUNDS; ++round) { + /* Add the constants for this round */ + t0 = photon256_rc[round]; + S.words[0] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[1] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[2] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[3] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[4] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[5] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[6] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[7] ^= t0 & 0x01010101U; + + /* Apply the sbox to all nibbles in the state */ + photon256_sbox(S.words[0], S.words[1], S.words[2], S.words[3]); + photon256_sbox(S.words[4], S.words[5], S.words[6], S.words[7]); + + /* Rotate all rows left by the row number. + * + * We do this by applying permutations to the top and bottom words + * to rearrange the bits into the rotated form. Permutations + * generated with "http://programming.sirrida.de/calcperm.php". + * + * P_top = [0 1 2 3 4 5 6 7 15 8 9 10 11 12 13 14 22 23 + * 16 17 18 19 20 21 29 30 31 24 25 26 27 28] + * P_bot = [4 5 6 7 0 1 2 3 11 12 13 14 15 8 9 10 18 19 + * 20 21 22 23 16 17 25 26 27 28 29 30 31 24 + */ + #define TOP_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x07030100, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + #define BOTTOM_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x080c0e0f, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + TOP_ROTATE_PERM(S.words[0]); + TOP_ROTATE_PERM(S.words[1]); + TOP_ROTATE_PERM(S.words[2]); + TOP_ROTATE_PERM(S.words[3]); + BOTTOM_ROTATE_PERM(S.words[4]); + BOTTOM_ROTATE_PERM(S.words[5]); + BOTTOM_ROTATE_PERM(S.words[6]); + BOTTOM_ROTATE_PERM(S.words[7]); + + /* Mix the columns */ + #define MUL(a, x) (photon256_field_multiply((a), (x))) + t0 = READ_ROW0(); + t1 = READ_ROW1(); + t2 = READ_ROW2(); + t3 = READ_ROW3(); + t4 = READ_ROW4(); + t5 = READ_ROW5(); + t6 = READ_ROW6(); + t7 = READ_ROW7(); + t8 = MUL(0x02, t0) ^ MUL(0x04, t1) ^ MUL(0x02, t2) ^ MUL(0x0b, t3) ^ + MUL(0x02, t4) ^ MUL(0x08, t5) ^ MUL(0x05, t6) ^ MUL(0x06, t7); + WRITE_ROW(0, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x09, t1) ^ MUL(0x08, t2) ^ MUL(0x0d, t3) ^ + MUL(0x07, t4) ^ MUL(0x07, t5) ^ MUL(0x05, t6) ^ MUL(0x02, t7); + WRITE_ROW(1, t8); + t8 = MUL(0x04, t0) ^ MUL(0x04, t1) ^ MUL(0x0d, t2) ^ MUL(0x0d, t3) ^ + MUL(0x09, t4) ^ MUL(0x04, t5) ^ MUL(0x0d, t6) ^ MUL(0x09, t7); + WRITE_ROW(2, t8); + t8 = MUL(0x01, t0) ^ MUL(0x06, t1) ^ MUL(0x05, t2) ^ MUL(0x01, t3) ^ + MUL(0x0c, t4) ^ MUL(0x0d, t5) ^ MUL(0x0f, t6) ^ MUL(0x0e, t7); + WRITE_ROW(3, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x0c, t1) ^ MUL(0x09, t2) ^ MUL(0x0d, t3) ^ + MUL(0x0e, t4) ^ MUL(0x05, t5) ^ MUL(0x0e, t6) ^ MUL(0x0d, t7); + WRITE_ROW(4, t8); + t8 = MUL(0x09, t0) ^ MUL(0x0e, t1) ^ MUL(0x05, t2) ^ MUL(0x0f, t3) ^ + MUL(0x04, t4) ^ MUL(0x0c, t5) ^ MUL(0x09, t6) ^ MUL(0x06, t7); + WRITE_ROW(5, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x02, t1) ^ MUL(0x02, t2) ^ MUL(0x0a, t3) ^ + MUL(0x03, t4) ^ MUL(0x01, t5) ^ MUL(0x01, t6) ^ MUL(0x0e, t7); + WRITE_ROW(6, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x01, t1) ^ MUL(0x0d, t2) ^ MUL(0x0a, t3) ^ + MUL(0x05, t4) ^ MUL(0x0a, t5) ^ MUL(0x02, t6) ^ MUL(0x03, t7); + WRITE_ROW(7, t8); + } + + /* Convert back from bit-sliced form to regular form */ + photon256_from_sliced(state, S.bytes); +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.h new file mode 100644 index 0000000..ce8729a --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-photon256.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PHOTON256_H +#define LW_INTERNAL_PHOTON256_H + +/** + * \file internal-photon256.h + * \brief Internal implementation of the PHOTON-256 permutation. + * + * Warning: The current implementation of PHOTON-256 is constant-time + * but not constant-cache. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the PHOTON-256 permutation state in bytes. + */ +#define PHOTON256_STATE_SIZE 32 + +/** + * \brief Permutes the PHOTON-256 state. + * + * \param state The state to be permuted. + */ +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-util.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.c b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.c new file mode 100644 index 0000000..f44bdad --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.c @@ -0,0 +1,451 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "photon-beetle.h" +#include "internal-photon256.h" +#include "internal-util.h" +#include + +aead_cipher_t const photon_beetle_128_cipher = { + "PHOTON-Beetle-AEAD-ENC-128", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_128_aead_encrypt, + photon_beetle_128_aead_decrypt +}; + +aead_cipher_t const photon_beetle_32_cipher = { + "PHOTON-Beetle-AEAD-ENC-32", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_32_aead_encrypt, + photon_beetle_32_aead_decrypt +}; + +aead_hash_algorithm_t const photon_beetle_hash_algorithm = { + "PHOTON-Beetle-HASH", + sizeof(int), + PHOTON_BEETLE_HASH_SIZE, + AEAD_FLAG_NONE, + photon_beetle_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-128. + */ +#define PHOTON_BEETLE_128_RATE 16 + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-32. + */ +#define PHOTON_BEETLE_32_RATE 4 + +/* Shifts a domain constant from the spec to the correct bit position */ +#define DOMAIN(c) ((c) << 5) + +/** + * \brief Processes the associated data for PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be non-zero. + * \param rate Rate of absorption for the data. + * \param mempty Non-zero if the message is empty. + */ +static void photon_beetle_process_ad + (unsigned char state[PHOTON256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen, + unsigned rate, int mempty) +{ + unsigned temp; + + /* Absorb as many full rate blocks as possible */ + while (adlen > rate) { + photon256_permute(state); + lw_xor_block(state, ad, rate); + ad += rate; + adlen -= rate; + } + + /* Pad and absorb the last block */ + temp = (unsigned)adlen; + photon256_permute(state); + lw_xor_block(state, ad, temp); + if (temp < rate) + state[temp] ^= 0x01; /* padding */ + + /* Add the domain constant to finalize associated data processing */ + if (mempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(3); + else if (mempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(4); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Rotates part of the PHOTON-256 state right by one bit. + * + * \param out Output state buffer. + * \param in Input state buffer, must not overlap with \a out. + * \param len Length of the state buffer. + */ +static void photon_beetle_rotate1 + (unsigned char *out, const unsigned char *in, unsigned len) +{ + unsigned posn; + for (posn = 0; posn < (len - 1); ++posn) + out[posn] = (in[posn] >> 1) | (in[posn + 1] << 7); + out[len - 1] = (in[len - 1] >> 1) | (in[0] << 7); +} + +/** + * \brief Encrypts a plaintext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_encrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *c, const unsigned char *m, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + } else { + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + lw_xor_block_2_src(c, m, shuffle, temp); + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Decrypts a ciphertext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_decrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *m, const unsigned char *c, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + } else { + lw_xor_block_2_src(m, c, shuffle, temp); + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + unsigned temp; + + /* Absorb the input data */ + if (inlen == 0) { + /* No input data at all */ + memset(state, 0, sizeof(state) - 1); + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else if (inlen <= PHOTON_BEETLE_128_RATE) { + /* Only one block of input data, which may require padding */ + temp = (unsigned)inlen; + memcpy(state, in, temp); + memset(state + temp, 0, sizeof(state) - temp - 1); + if (temp < PHOTON_BEETLE_128_RATE) { + state[temp] = 0x01; + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else { + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(2); + } + } else { + /* Initialize the state with the first block, then absorb the rest */ + memcpy(state, in, PHOTON_BEETLE_128_RATE); + memset(state + PHOTON_BEETLE_128_RATE, 0, + sizeof(state) - PHOTON_BEETLE_128_RATE); + in += PHOTON_BEETLE_128_RATE; + inlen -= PHOTON_BEETLE_128_RATE; + while (inlen > PHOTON_BEETLE_32_RATE) { + photon256_permute(state); + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + in += PHOTON_BEETLE_32_RATE; + inlen -= PHOTON_BEETLE_32_RATE; + } + photon256_permute(state); + temp = (unsigned)inlen; + if (temp == PHOTON_BEETLE_32_RATE) { + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } else { + lw_xor_block(state, in, temp); + state[temp] ^= 0x01; + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); + } + } + + /* Generate the output hash */ + photon256_permute(state); + memcpy(out, state, 16); + photon256_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.h b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.h new file mode 100644 index 0000000..2d94a7e --- /dev/null +++ b/photon-beetle/Implementations/crypto_aead/photonbeetleaead128rate32v1/rhys-avr/photon-beetle.h @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_PHOTON_BEETLE_H +#define LWCRYPTO_PHOTON_BEETLE_H + +#include "aead-common.h" + +/** + * \file photon-beetle.h + * \brief PHOTON-Beetle authenticated encryption algorithm. + * + * PHOTON-Beetle is a family of authenticated encryption algorithms based + * on the PHOTON-256 permutation and using the Beetle sponge mode. + * There are three algorithms in the family: + * + * \li PHOTON-Beetle-AEAD-ENC-128 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 16 byte blocks. This is the primary + * member of the family for encryption. + * \li PHOTON-Beetle-AEAD-ENC-32 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 4 byte blocks. + * \li PHOTON-Beetle-Hash with a 256-bit hash output. The initial data is + * handled as a 16 byte block, and then the remaining bytes are processed + * in 4 byte blocks. + * + * References: https://www.isical.ac.in/~lightweight/beetle/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for PHOTON-Beetle-HASH. + */ +#define PHOTON_BEETLE_HASH_SIZE 32 + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-128 cipher. + */ +extern aead_cipher_t const photon_beetle_128_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-32 cipher. + */ +extern aead_cipher_t const photon_beetle_32_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-HASH algorithm. + */ +extern aead_hash_algorithm_t const photon_beetle_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_128_aead_decrypt() + */ +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_128_aead_encrypt() + */ +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_32_aead_decrypt() + */ +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_32_aead_encrypt() + */ +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with PHOTON-Beetle-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * PHOTON_BEETLE_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.c b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.h b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/api.h b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/hash.c b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/hash.c new file mode 100644 index 0000000..c75624a --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "photon-beetle.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return photon_beetle_hash(out, in, inlen); +} diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.c b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.c new file mode 100644 index 0000000..b8743fe --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.c @@ -0,0 +1,479 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-photon256.h" +#include "internal-util.h" + +/** + * \brief Number of rounds in the PHOTON-256 permutation in bit-sliced form. + */ +#define PHOTON256_ROUNDS 12 + +/* Round constants for PHOTON-256 */ +static uint32_t const photon256_rc[PHOTON256_ROUNDS] = { + 0x96d2f0e1, 0xb4f0d2c3, 0xf0b49687, 0x692d0f1e, + 0x5a1e3c2d, 0x3c785a4b, 0xe1a58796, 0x4b0f2d3c, + 0x1e5a7869, 0xa5e1c3d2, 0xd296b4a5, 0x2d694b5a +}; + +/** + * \brief Evaluates the PHOTON-256 S-box in bit-sliced form. + * + * \param x0 Slice with bit 0 of all nibbles. + * \param x1 Slice with bit 1 of all nibbles. + * \param x2 Slice with bit 2 of all nibbles. + * \param x3 Slice with bit 3 of all nibbles. + * + * This bit-sliced S-box implementation is based on the AVR version + * "add_avr8_bitslice_asm" from the PHOTON-Beetle reference code. + */ +#define photon256_sbox(x0, x1, x2, x3) \ + do { \ + x1 ^= x2; \ + x3 ^= (x2 & x1); \ + t1 = x3; \ + x3 = (x3 & x1) ^ x2; \ + t2 = x3; \ + x3 ^= x0; \ + x3 = ~(x3); \ + x2 = x3; \ + t2 |= x0; \ + x0 ^= t1; \ + x1 ^= x0; \ + x2 |= x1; \ + x2 ^= t1; \ + x1 ^= t2; \ + x3 ^= x1; \ + } while (0) + +/** + * \brief Performs a field multiplication on the 8 nibbles in a row. + * + * \param a Field constant to multiply by. + * \param x Bit-sliced form of the row, with bits 0..3 of each nibble + * in bytes 0..3 of the word. + * + * \return a * x packed into the bytes of a word. + */ +static uint32_t photon256_field_multiply(uint8_t a, uint32_t x) +{ + /* For each 4-bit nibble we need to do this: + * + * result = 0; + * for (bit = 0; bit < 4; ++ bit) { + * if ((a & (1 << bit)) != 0) + * result ^= x; + * if ((x & 0x08) != 0) { + * x = (x << 1) ^ 3; + * } else { + * x = (x << 1); + * } + * } + * + * We don't need to worry about constant time for "a" because it is a + * known constant that isn't data-dependent. But we do need to worry + * about constant time for "x" as it is data. + */ + uint32_t result = 0; + uint32_t t; + #define PARALLEL_CONDITIONAL_ADD(bit) \ + do { \ + if ((a) & (1 << (bit))) \ + result ^= x; \ + } while (0) + #define PARALELL_ROTATE() \ + do { \ + t = x >> 24; \ + x = (x << 8) ^ t ^ (t << 8); \ + } while (0) + PARALLEL_CONDITIONAL_ADD(0); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(1); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(2); + PARALELL_ROTATE(); + PARALLEL_CONDITIONAL_ADD(3); + return result; +} + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/** + * \brief Converts a PHOTON-256 state into bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_to_sliced + (uint32_t out[PHOTON256_STATE_SIZE / 4], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* We first scatter bits 0..3 of the nibbles to bytes 0..3 of the words. + * Then we rearrange the bytes to group all bits N into word N. + * + * Permutation generated with "http://programming.sirrida.de/calcperm.php". + * + * P = [0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 + * 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31] + */ + uint32_t t0, t1, t2, t3; + #define TO_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + #define FROM_BITSLICED_PERM(x) \ + do { \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + } while (0) + t0 = le_load_word32(in); + t1 = le_load_word32(in + 4); + t2 = le_load_word32(in + 8); + t3 = le_load_word32(in + 12); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[0] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[1] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[2] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[3] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); + t0 = le_load_word32(in + 16); + t1 = le_load_word32(in + 20); + t2 = le_load_word32(in + 24); + t3 = le_load_word32(in + 28); + TO_BITSLICED_PERM(t0); + TO_BITSLICED_PERM(t1); + TO_BITSLICED_PERM(t2); + TO_BITSLICED_PERM(t3); + out[4] = (t0 & 0x000000FFU) | ((t1 << 8) & 0x0000FF00U) | + ((t2 << 16) & 0x00FF0000U) | ((t3 << 24) & 0xFF000000U); + out[5] = ((t0 >> 8) & 0x000000FFU) | (t1 & 0x0000FF00U) | + ((t2 << 8) & 0x00FF0000U) | ((t3 << 16) & 0xFF000000U); + out[6] = ((t0 >> 16) & 0x000000FFU) | ((t1 >> 8) & 0x0000FF00U) | + (t2 & 0x00FF0000U) | ((t3 << 8) & 0xFF000000U); + out[7] = ((t0 >> 24) & 0x000000FFU) | ((t1 >> 16) & 0x0000FF00U) | + ((t2 >> 8) & 0x00FF0000U) | (t3 & 0xFF000000U); +} + +/** + * \brief Converts a PHOTON-256 state from bit-sliced form. + * + * \param out Points to the converted output. + * \param in Points to the PHOTON-256 state to convert. + */ +static void photon256_from_sliced + (unsigned char out[PHOTON256_STATE_SIZE], + const unsigned char in[PHOTON256_STATE_SIZE]) +{ + /* Do the reverse of photon256_to_sliced() */ + uint32_t x0, x1, x2, x3; + x0 = ((uint32_t)(in[0])) | + (((uint32_t)(in[4])) << 8) | + (((uint32_t)(in[8])) << 16) | + (((uint32_t)(in[12])) << 24); + x1 = ((uint32_t)(in[1])) | + (((uint32_t)(in[5])) << 8) | + (((uint32_t)(in[9])) << 16) | + (((uint32_t)(in[13])) << 24); + x2 = ((uint32_t)(in[2])) | + (((uint32_t)(in[6])) << 8) | + (((uint32_t)(in[10])) << 16) | + (((uint32_t)(in[14])) << 24); + x3 = ((uint32_t)(in[3])) | + (((uint32_t)(in[7])) << 8) | + (((uint32_t)(in[11])) << 16) | + (((uint32_t)(in[15])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out, x0); + le_store_word32(out + 4, x1); + le_store_word32(out + 8, x2); + le_store_word32(out + 12, x3); + x0 = ((uint32_t)(in[16])) | + (((uint32_t)(in[20])) << 8) | + (((uint32_t)(in[24])) << 16) | + (((uint32_t)(in[28])) << 24); + x1 = ((uint32_t)(in[17])) | + (((uint32_t)(in[21])) << 8) | + (((uint32_t)(in[25])) << 16) | + (((uint32_t)(in[29])) << 24); + x2 = ((uint32_t)(in[18])) | + (((uint32_t)(in[22])) << 8) | + (((uint32_t)(in[26])) << 16) | + (((uint32_t)(in[30])) << 24); + x3 = ((uint32_t)(in[19])) | + (((uint32_t)(in[23])) << 8) | + (((uint32_t)(in[27])) << 16) | + (((uint32_t)(in[31])) << 24); + FROM_BITSLICED_PERM(x0); + FROM_BITSLICED_PERM(x1); + FROM_BITSLICED_PERM(x2); + FROM_BITSLICED_PERM(x3); + le_store_word32(out + 16, x0); + le_store_word32(out + 20, x1); + le_store_word32(out + 24, x2); + le_store_word32(out + 28, x3); +} + +#if defined(LW_UTIL_LITTLE_ENDIAN) +/* Index the bit-sliced state bytes in little-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[(row)] = (uint8_t)(value); \ + S.bytes[(row) + 4] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 8] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 12] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[(row) + 12] = (uint8_t)(value); \ + S.bytes[(row) + 16] = (uint8_t)((value) >> 8); \ + S.bytes[(row) + 20] = (uint8_t)((value) >> 16); \ + S.bytes[(row) + 24] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#else +/* Index the bit-sliced state bytes in big-endian byte order */ +#define READ_ROW0() \ + (((uint32_t)(S.bytes[3])) | \ + (((uint32_t)(S.bytes[7])) << 8) | \ + (((uint32_t)(S.bytes[11])) << 16) | \ + (((uint32_t)(S.bytes[15])) << 24)) +#define READ_ROW1() \ + (((uint32_t)(S.bytes[2])) | \ + (((uint32_t)(S.bytes[6])) << 8) | \ + (((uint32_t)(S.bytes[10])) << 16) | \ + (((uint32_t)(S.bytes[14])) << 24)) +#define READ_ROW2() \ + (((uint32_t)(S.bytes[1])) | \ + (((uint32_t)(S.bytes[5])) << 8) | \ + (((uint32_t)(S.bytes[9])) << 16) | \ + (((uint32_t)(S.bytes[13])) << 24)) +#define READ_ROW3() \ + (((uint32_t)(S.bytes[0])) | \ + (((uint32_t)(S.bytes[4])) << 8) | \ + (((uint32_t)(S.bytes[8])) << 16) | \ + (((uint32_t)(S.bytes[12])) << 24)) +#define READ_ROW4() \ + (((uint32_t)(S.bytes[19])) | \ + (((uint32_t)(S.bytes[23])) << 8) | \ + (((uint32_t)(S.bytes[27])) << 16) | \ + (((uint32_t)(S.bytes[31])) << 24)) +#define READ_ROW5() \ + (((uint32_t)(S.bytes[18])) | \ + (((uint32_t)(S.bytes[22])) << 8) | \ + (((uint32_t)(S.bytes[26])) << 16) | \ + (((uint32_t)(S.bytes[30])) << 24)) +#define READ_ROW6() \ + (((uint32_t)(S.bytes[17])) | \ + (((uint32_t)(S.bytes[21])) << 8) | \ + (((uint32_t)(S.bytes[25])) << 16) | \ + (((uint32_t)(S.bytes[29])) << 24)) +#define READ_ROW7() \ + (((uint32_t)(S.bytes[16])) | \ + (((uint32_t)(S.bytes[20])) << 8) | \ + (((uint32_t)(S.bytes[24])) << 16) | \ + (((uint32_t)(S.bytes[28])) << 24)) +#define WRITE_ROW(row, value) \ + do { \ + if ((row) < 4) { \ + S.bytes[3 - (row)] = (uint8_t)(value); \ + S.bytes[7 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[11 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[15 - (row)] = (uint8_t)((value) >> 24); \ + } else { \ + S.bytes[20 - (row)] = (uint8_t)(value); \ + S.bytes[24 - (row)] = (uint8_t)((value) >> 8); \ + S.bytes[28 - (row)] = (uint8_t)((value) >> 16); \ + S.bytes[32 - (row)] = (uint8_t)((value) >> 24); \ + } \ + } while (0) +#endif + +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]) +{ + union { + uint32_t words[PHOTON256_STATE_SIZE / 4]; + uint8_t bytes[PHOTON256_STATE_SIZE]; + } S; + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8; + uint8_t round; + + /* Convert the state into bit-sliced form */ + photon256_to_sliced(S.words, state); + + /* Perform all 12 permutation rounds */ + for (round = 0; round < PHOTON256_ROUNDS; ++round) { + /* Add the constants for this round */ + t0 = photon256_rc[round]; + S.words[0] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[1] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[2] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[3] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[4] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[5] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[6] ^= t0 & 0x01010101U; + t0 >>= 1; + S.words[7] ^= t0 & 0x01010101U; + + /* Apply the sbox to all nibbles in the state */ + photon256_sbox(S.words[0], S.words[1], S.words[2], S.words[3]); + photon256_sbox(S.words[4], S.words[5], S.words[6], S.words[7]); + + /* Rotate all rows left by the row number. + * + * We do this by applying permutations to the top and bottom words + * to rearrange the bits into the rotated form. Permutations + * generated with "http://programming.sirrida.de/calcperm.php". + * + * P_top = [0 1 2 3 4 5 6 7 15 8 9 10 11 12 13 14 22 23 + * 16 17 18 19 20 21 29 30 31 24 25 26 27 28] + * P_bot = [4 5 6 7 0 1 2 3 11 12 13 14 15 8 9 10 18 19 + * 20 21 22 23 16 17 25 26 27 28 29 30 31 24 + */ + #define TOP_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x07030100, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + #define BOTTOM_ROTATE_PERM(x) \ + do { \ + t1 = (x); \ + bit_permute_step(t1, 0x080c0e0f, 4); \ + bit_permute_step(t1, 0x22331100, 2); \ + bit_permute_step(t1, 0x55005500, 1); \ + (x) = t1; \ + } while (0) + TOP_ROTATE_PERM(S.words[0]); + TOP_ROTATE_PERM(S.words[1]); + TOP_ROTATE_PERM(S.words[2]); + TOP_ROTATE_PERM(S.words[3]); + BOTTOM_ROTATE_PERM(S.words[4]); + BOTTOM_ROTATE_PERM(S.words[5]); + BOTTOM_ROTATE_PERM(S.words[6]); + BOTTOM_ROTATE_PERM(S.words[7]); + + /* Mix the columns */ + #define MUL(a, x) (photon256_field_multiply((a), (x))) + t0 = READ_ROW0(); + t1 = READ_ROW1(); + t2 = READ_ROW2(); + t3 = READ_ROW3(); + t4 = READ_ROW4(); + t5 = READ_ROW5(); + t6 = READ_ROW6(); + t7 = READ_ROW7(); + t8 = MUL(0x02, t0) ^ MUL(0x04, t1) ^ MUL(0x02, t2) ^ MUL(0x0b, t3) ^ + MUL(0x02, t4) ^ MUL(0x08, t5) ^ MUL(0x05, t6) ^ MUL(0x06, t7); + WRITE_ROW(0, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x09, t1) ^ MUL(0x08, t2) ^ MUL(0x0d, t3) ^ + MUL(0x07, t4) ^ MUL(0x07, t5) ^ MUL(0x05, t6) ^ MUL(0x02, t7); + WRITE_ROW(1, t8); + t8 = MUL(0x04, t0) ^ MUL(0x04, t1) ^ MUL(0x0d, t2) ^ MUL(0x0d, t3) ^ + MUL(0x09, t4) ^ MUL(0x04, t5) ^ MUL(0x0d, t6) ^ MUL(0x09, t7); + WRITE_ROW(2, t8); + t8 = MUL(0x01, t0) ^ MUL(0x06, t1) ^ MUL(0x05, t2) ^ MUL(0x01, t3) ^ + MUL(0x0c, t4) ^ MUL(0x0d, t5) ^ MUL(0x0f, t6) ^ MUL(0x0e, t7); + WRITE_ROW(3, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x0c, t1) ^ MUL(0x09, t2) ^ MUL(0x0d, t3) ^ + MUL(0x0e, t4) ^ MUL(0x05, t5) ^ MUL(0x0e, t6) ^ MUL(0x0d, t7); + WRITE_ROW(4, t8); + t8 = MUL(0x09, t0) ^ MUL(0x0e, t1) ^ MUL(0x05, t2) ^ MUL(0x0f, t3) ^ + MUL(0x04, t4) ^ MUL(0x0c, t5) ^ MUL(0x09, t6) ^ MUL(0x06, t7); + WRITE_ROW(5, t8); + t8 = MUL(0x0c, t0) ^ MUL(0x02, t1) ^ MUL(0x02, t2) ^ MUL(0x0a, t3) ^ + MUL(0x03, t4) ^ MUL(0x01, t5) ^ MUL(0x01, t6) ^ MUL(0x0e, t7); + WRITE_ROW(6, t8); + t8 = MUL(0x0f, t0) ^ MUL(0x01, t1) ^ MUL(0x0d, t2) ^ MUL(0x0a, t3) ^ + MUL(0x05, t4) ^ MUL(0x0a, t5) ^ MUL(0x02, t6) ^ MUL(0x03, t7); + WRITE_ROW(7, t8); + } + + /* Convert back from bit-sliced form to regular form */ + photon256_from_sliced(state, S.bytes); +} diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.h b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.h new file mode 100644 index 0000000..ce8729a --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-photon256.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PHOTON256_H +#define LW_INTERNAL_PHOTON256_H + +/** + * \file internal-photon256.h + * \brief Internal implementation of the PHOTON-256 permutation. + * + * Warning: The current implementation of PHOTON-256 is constant-time + * but not constant-cache. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the PHOTON-256 permutation state in bytes. + */ +#define PHOTON256_STATE_SIZE 32 + +/** + * \brief Permutes the PHOTON-256 state. + * + * \param state The state to be permuted. + */ +void photon256_permute(unsigned char state[PHOTON256_STATE_SIZE]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-util.h b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.c b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.c new file mode 100644 index 0000000..f44bdad --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.c @@ -0,0 +1,451 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "photon-beetle.h" +#include "internal-photon256.h" +#include "internal-util.h" +#include + +aead_cipher_t const photon_beetle_128_cipher = { + "PHOTON-Beetle-AEAD-ENC-128", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_128_aead_encrypt, + photon_beetle_128_aead_decrypt +}; + +aead_cipher_t const photon_beetle_32_cipher = { + "PHOTON-Beetle-AEAD-ENC-32", + PHOTON_BEETLE_KEY_SIZE, + PHOTON_BEETLE_NONCE_SIZE, + PHOTON_BEETLE_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + photon_beetle_32_aead_encrypt, + photon_beetle_32_aead_decrypt +}; + +aead_hash_algorithm_t const photon_beetle_hash_algorithm = { + "PHOTON-Beetle-HASH", + sizeof(int), + PHOTON_BEETLE_HASH_SIZE, + AEAD_FLAG_NONE, + photon_beetle_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-128. + */ +#define PHOTON_BEETLE_128_RATE 16 + +/** + * \brief Rate of operation for PHOTON-Beetle-AEAD-ENC-32. + */ +#define PHOTON_BEETLE_32_RATE 4 + +/* Shifts a domain constant from the spec to the correct bit position */ +#define DOMAIN(c) ((c) << 5) + +/** + * \brief Processes the associated data for PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data, must be non-zero. + * \param rate Rate of absorption for the data. + * \param mempty Non-zero if the message is empty. + */ +static void photon_beetle_process_ad + (unsigned char state[PHOTON256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen, + unsigned rate, int mempty) +{ + unsigned temp; + + /* Absorb as many full rate blocks as possible */ + while (adlen > rate) { + photon256_permute(state); + lw_xor_block(state, ad, rate); + ad += rate; + adlen -= rate; + } + + /* Pad and absorb the last block */ + temp = (unsigned)adlen; + photon256_permute(state); + lw_xor_block(state, ad, temp); + if (temp < rate) + state[temp] ^= 0x01; /* padding */ + + /* Add the domain constant to finalize associated data processing */ + if (mempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(3); + else if (mempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(4); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Rotates part of the PHOTON-256 state right by one bit. + * + * \param out Output state buffer. + * \param in Input state buffer, must not overlap with \a out. + * \param len Length of the state buffer. + */ +static void photon_beetle_rotate1 + (unsigned char *out, const unsigned char *in, unsigned len) +{ + unsigned posn; + for (posn = 0; posn < (len - 1); ++posn) + out[posn] = (in[posn] >> 1) | (in[posn + 1] << 7); + out[len - 1] = (in[len - 1] >> 1) | (in[0] << 7); +} + +/** + * \brief Encrypts a plaintext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_encrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *c, const unsigned char *m, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block(state, m, rate); + lw_xor_block_2_src(c, m, shuffle, rate); + } else { + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + lw_xor_block_2_src(c, m, shuffle, temp); + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +/** + * \brief Decrypts a ciphertext block with PHOTON-Beetle. + * + * \param state PHOTON-256 permutation state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the message, must be non-zero. + * \param rate Rate of absorption for the data. + * \param adempty Non-zero if the associated data is empty. + */ +static void photon_beetle_decrypt + (unsigned char state[PHOTON256_STATE_SIZE], + unsigned char *m, const unsigned char *c, unsigned long long mlen, + unsigned rate, int adempty) +{ + unsigned char shuffle[PHOTON_BEETLE_128_RATE]; /* Block of max rate size */ + unsigned temp; + + /* Process all plaintext blocks except the last */ + while (mlen > rate) { + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + c += rate; + m += rate; + mlen -= rate; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + photon256_permute(state); + memcpy(shuffle, state + rate / 2, rate / 2); + photon_beetle_rotate1(shuffle + rate / 2, state, rate / 2); + if (temp == rate) { + lw_xor_block_2_src(m, c, shuffle, rate); + lw_xor_block(state, m, rate); + } else { + lw_xor_block_2_src(m, c, shuffle, temp); + lw_xor_block(state, m, temp); + state[temp] ^= 0x01; /* padding */ + } + + /* Add the domain constant to finalize message processing */ + if (adempty && temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(5); + else if (adempty) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(6); + else if (temp == rate) + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + else + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); +} + +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_128_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_128_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, mlen == 0); + } else if (mlen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + photon_beetle_encrypt + (state, c, m, mlen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Generate the authentication tag */ + photon256_permute(state); + memcpy(c + mlen, state, PHOTON_BEETLE_TAG_SIZE); + return 0; +} + +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < PHOTON_BEETLE_TAG_SIZE) + return -1; + *mlen = clen - PHOTON_BEETLE_TAG_SIZE; + + /* Initialize the state by concatenating the nonce and the key */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Process the associated data */ + clen -= PHOTON_BEETLE_TAG_SIZE; + if (adlen > 0) { + photon_beetle_process_ad + (state, ad, adlen, PHOTON_BEETLE_32_RATE, clen == 0); + } else if (clen == 0) { + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } + + /* Decrypt the ciphertext to produce the plaintext */ + if (clen > 0) { + photon_beetle_decrypt + (state, m, c, clen, PHOTON_BEETLE_32_RATE, adlen == 0); + } + + /* Check the authentication tag */ + photon256_permute(state); + return aead_check_tag(m, clen, state, c + clen, PHOTON_BEETLE_TAG_SIZE); +} + +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[PHOTON256_STATE_SIZE]; + unsigned temp; + + /* Absorb the input data */ + if (inlen == 0) { + /* No input data at all */ + memset(state, 0, sizeof(state) - 1); + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else if (inlen <= PHOTON_BEETLE_128_RATE) { + /* Only one block of input data, which may require padding */ + temp = (unsigned)inlen; + memcpy(state, in, temp); + memset(state + temp, 0, sizeof(state) - temp - 1); + if (temp < PHOTON_BEETLE_128_RATE) { + state[temp] = 0x01; + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(1); + } else { + state[PHOTON256_STATE_SIZE - 1] = DOMAIN(2); + } + } else { + /* Initialize the state with the first block, then absorb the rest */ + memcpy(state, in, PHOTON_BEETLE_128_RATE); + memset(state + PHOTON_BEETLE_128_RATE, 0, + sizeof(state) - PHOTON_BEETLE_128_RATE); + in += PHOTON_BEETLE_128_RATE; + inlen -= PHOTON_BEETLE_128_RATE; + while (inlen > PHOTON_BEETLE_32_RATE) { + photon256_permute(state); + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + in += PHOTON_BEETLE_32_RATE; + inlen -= PHOTON_BEETLE_32_RATE; + } + photon256_permute(state); + temp = (unsigned)inlen; + if (temp == PHOTON_BEETLE_32_RATE) { + lw_xor_block(state, in, PHOTON_BEETLE_32_RATE); + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(1); + } else { + lw_xor_block(state, in, temp); + state[temp] ^= 0x01; + state[PHOTON256_STATE_SIZE - 1] ^= DOMAIN(2); + } + } + + /* Generate the output hash */ + photon256_permute(state); + memcpy(out, state, 16); + photon256_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.h b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.h new file mode 100644 index 0000000..2d94a7e --- /dev/null +++ b/photon-beetle/Implementations/crypto_hash/photonbeetlehash256rate32v1/rhys-avr/photon-beetle.h @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_PHOTON_BEETLE_H +#define LWCRYPTO_PHOTON_BEETLE_H + +#include "aead-common.h" + +/** + * \file photon-beetle.h + * \brief PHOTON-Beetle authenticated encryption algorithm. + * + * PHOTON-Beetle is a family of authenticated encryption algorithms based + * on the PHOTON-256 permutation and using the Beetle sponge mode. + * There are three algorithms in the family: + * + * \li PHOTON-Beetle-AEAD-ENC-128 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 16 byte blocks. This is the primary + * member of the family for encryption. + * \li PHOTON-Beetle-AEAD-ENC-32 with a 128-bit key, a 128-bit nonce, and a + * 128-bit tag. Data is handled in 4 byte blocks. + * \li PHOTON-Beetle-Hash with a 256-bit hash output. The initial data is + * handled as a 16 byte block, and then the remaining bytes are processed + * in 4 byte blocks. + * + * References: https://www.isical.ac.in/~lightweight/beetle/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for PHOTON-Beetle. + */ +#define PHOTON_BEETLE_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for PHOTON-Beetle-HASH. + */ +#define PHOTON_BEETLE_HASH_SIZE 32 + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-128 cipher. + */ +extern aead_cipher_t const photon_beetle_128_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-AEAD-ENC-32 cipher. + */ +extern aead_cipher_t const photon_beetle_32_cipher; + +/** + * \brief Meta-information block for the PHOTON-Beetle-HASH algorithm. + */ +extern aead_hash_algorithm_t const photon_beetle_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_128_aead_decrypt() + */ +int photon_beetle_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_128_aead_encrypt() + */ +int photon_beetle_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa photon_beetle_32_aead_decrypt() + */ +int photon_beetle_32_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with PHOTON-Beetle-AEAD-ENC-32. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa photon_beetle_32_aead_encrypt() + */ +int photon_beetle_32_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with PHOTON-Beetle-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * PHOTON_BEETLE_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int photon_beetle_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.c b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/api.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/encrypt.c b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..a63877d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "pyjamask.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return pyjamask_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return pyjamask_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-ocb.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-ocb.h new file mode 100644 index 0000000..98f2a31 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-ocb.h @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_OCB_H +#define LW_INTERNAL_OCB_H + +#include "internal-util.h" +#include + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying block cipher: + * + * OCB_ALG_NAME Name of the algorithm that is using OCB mode. + * OCB_BLOCK_SIZE Size of the block for the underlying cipher in bytes. + * OCB_NONCE_SIZE Size of the nonce which must be < OCB_BLOCK_SIZE. + * OCB_TAG_SIZE Size of the authentication tag. + * OCB_KEY_SCHEDULE Type for the key schedule. + * OCB_SETUP_KEY Name of the key schedule setup function. + * OCB_ENCRYPT_BLOCK Name of the block cipher ECB encrypt function. + * OCB_DECRYPT_BLOCK Name of the block cipher ECB decrypt function. + * OCB_DOUBLE_L Name of the function to double L (optional). + */ +#if defined(OCB_ENCRYPT_BLOCK) + +/** + * \file internal-ocb.h + * \brief Internal implementation of the OCB block cipher mode. + * + * Note that OCB is covered by patents so it may not be usable in all + * applications. Open source applications should be covered, but for + * others you will need to contact the patent authors to find out + * if you can use it or if a paid license is required. + * + * License information: https://web.cs.ucdavis.edu/~rogaway/ocb/license.htm + * + * References: https://tools.ietf.org/html/rfc7253 + */ + +#define OCB_CONCAT_INNER(name,suffix) name##suffix +#define OCB_CONCAT(name,suffix) OCB_CONCAT_INNER(name,suffix) + +#if !defined(OCB_DOUBLE_L) + +#define OCB_DOUBLE_L OCB_CONCAT(OCB_ALG_NAME,_double_l) + +#if OCB_BLOCK_SIZE == 16 + +/* Double a value in GF(128) */ +static void OCB_DOUBLE_L(unsigned char out[16], const unsigned char in[16]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)in[0]) >> 7); + for (index = 0; index < 15; ++index) + out[index] = (in[index] << 1) | (in[index + 1] >> 7); + out[15] = (in[15] << 1) ^ (mask & 0x87); +} + +#elif OCB_BLOCK_SIZE == 12 + +/* Double a value in GF(96) */ +static void OCB_DOUBLE_L + (unsigned char out[12], const unsigned char in[12]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)in[0]) >> 7); + for (index = 0; index < 11; ++index) + out[index] = (in[index] << 1) | (in[index + 1] >> 7); + out[11] = (in[11] << 1) ^ (mask & 0x41); + out[10] ^= (mask & 0x06); +} + +#else +#error "Unknown block size for OCB" +#endif + +#endif + +/* State information for OCB functions */ +#define OCB_STATE OCB_CONCAT(OCB_ALG_NAME,_state_t) +typedef struct +{ + OCB_KEY_SCHEDULE ks; + unsigned char Lstar[OCB_BLOCK_SIZE]; + unsigned char Ldollar[OCB_BLOCK_SIZE]; + unsigned char L0[OCB_BLOCK_SIZE]; + unsigned char L1[OCB_BLOCK_SIZE]; + +} OCB_STATE; + +/* Initializes the OCB state from the key and nonce */ +static void OCB_CONCAT(OCB_ALG_NAME,_init) + (OCB_STATE *state, const unsigned char *k, const unsigned char *nonce, + unsigned char offset[OCB_BLOCK_SIZE]) +{ + unsigned bottom; + + /* Set up the key schedule */ + OCB_SETUP_KEY(&(state->ks), k); + + /* Derive the values of L*, L$, L0, and L1 */ + memset(state->Lstar, 0, sizeof(state->Lstar)); + OCB_ENCRYPT_BLOCK(&(state->ks), state->Lstar, state->Lstar); + OCB_DOUBLE_L(state->Ldollar, state->Lstar); + OCB_DOUBLE_L(state->L0, state->Ldollar); + OCB_DOUBLE_L(state->L1, state->L0); + + /* Derive the initial offset from the nonce */ + memset(offset, 0, OCB_BLOCK_SIZE); + memcpy(offset + OCB_BLOCK_SIZE - OCB_NONCE_SIZE, nonce, OCB_NONCE_SIZE); + offset[0] = ((OCB_TAG_SIZE * 8) & 0x7F) << 1; + offset[OCB_BLOCK_SIZE - OCB_NONCE_SIZE - 1] |= 0x01; + bottom = offset[OCB_BLOCK_SIZE - 1] & 0x3F; + offset[OCB_BLOCK_SIZE - 1] &= 0xC0; + { + unsigned index; + unsigned byte_posn = bottom / 8; +#if OCB_BLOCK_SIZE == 16 + /* Standard OCB with a 128-bit block */ + unsigned char stretch[24]; + OCB_ENCRYPT_BLOCK(&(state->ks), stretch, offset); + memcpy(stretch + 16, stretch + 1, 8); + lw_xor_block(stretch + 16, stretch, 8); +#elif OCB_BLOCK_SIZE == 12 + /* 96-bit block handling from the Pyjamask specification */ + unsigned char stretch[20]; + OCB_ENCRYPT_BLOCK(&(state->ks), stretch, offset); + for (index = 0; index < 8; ++index) { + stretch[index + 12] = + (stretch[index + 1] << 1) | (stretch[index + 2] >> 7); + } + lw_xor_block(stretch + 12, stretch, 8); +#else + unsigned char stretch[OCB_BLOCK_SIZE + 8] = {0}; + #error "unsupported block size for OCB mode" +#endif + bottom %= 8; + if (bottom != 0) { + for (index = 0; index < OCB_BLOCK_SIZE; ++index) { + offset[index] = + (stretch[index + byte_posn] << bottom) | + (stretch[index + byte_posn + 1] >> (8 - bottom)); + } + } else { + memcpy(offset, stretch + byte_posn, OCB_BLOCK_SIZE); + } + } +} + +/* Calculate L_{ntz(i)} when the last two bits of i are zero */ +static void OCB_CONCAT(OCB_ALG_NAME,_calculate_L) + (OCB_STATE *state, unsigned char L[OCB_BLOCK_SIZE], unsigned long long i) +{ + OCB_DOUBLE_L(L, state->L1); + i >>= 2; + while ((i & 1) == 0) { + OCB_DOUBLE_L(L, L); + i >>= 1; + } +} + +/* Process associated data with OCB */ +static void OCB_CONCAT(OCB_ALG_NAME,_process_ad) + (OCB_STATE *state, unsigned char tag[OCB_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + + /* Process all full blocks */ + memset(offset, 0, sizeof(offset)); + block_number = 1; + while (adlen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state->L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state->L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block_2_src(block, offset, ad, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state->ks), block, block); + lw_xor_block(tag, block, OCB_BLOCK_SIZE); + ad += OCB_BLOCK_SIZE; + adlen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last partial block */ + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(offset, state->Lstar, OCB_BLOCK_SIZE); + lw_xor_block(offset, ad, temp); + offset[temp] ^= 0x80; + OCB_ENCRYPT_BLOCK(&(state->ks), block, offset); + lw_xor_block(tag, block, OCB_BLOCK_SIZE); + } +} + +int OCB_CONCAT(OCB_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + OCB_STATE state; + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char sum[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + OCB_TAG_SIZE; + + /* Initialize the OCB state */ + OCB_CONCAT(OCB_ALG_NAME,_init)(&state, k, npub, offset); + + /* Process all plaintext blocks except the last */ + memset(sum, 0, sizeof(sum)); + block_number = 1; + while (mlen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state.L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state.L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(&state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block(sum, m, OCB_BLOCK_SIZE); + lw_xor_block_2_src(block, offset, m, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, block); + lw_xor_block_2_src(c, block, offset, OCB_BLOCK_SIZE); + c += OCB_BLOCK_SIZE; + m += OCB_BLOCK_SIZE; + mlen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last plaintext block */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + lw_xor_block(offset, state.Lstar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, offset); + lw_xor_block_2_src(c, block, m, temp); + c += temp; + } + + /* Finalize the encryption phase */ + lw_xor_block(sum, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, state.Ldollar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), sum, sum); + + /* Process the associated data and compute the final authentication tag */ + OCB_CONCAT(OCB_ALG_NAME,_process_ad)(&state, sum, ad, adlen); + memcpy(c, sum, OCB_TAG_SIZE); + return 0; +} + +int OCB_CONCAT(OCB_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + OCB_STATE state; + unsigned char *mtemp = m; + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char sum[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < OCB_TAG_SIZE) + return -1; + *mlen = clen - OCB_TAG_SIZE; + + /* Initialize the OCB state */ + OCB_CONCAT(OCB_ALG_NAME,_init)(&state, k, npub, offset); + + /* Process all ciphertext blocks except the last */ + memset(sum, 0, sizeof(sum)); + block_number = 1; + clen -= OCB_TAG_SIZE; + while (clen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state.L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state.L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(&state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block_2_src(block, offset, c, OCB_BLOCK_SIZE); + OCB_DECRYPT_BLOCK(&(state.ks), block, block); + lw_xor_block_2_src(m, block, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, m, OCB_BLOCK_SIZE); + c += OCB_BLOCK_SIZE; + m += OCB_BLOCK_SIZE; + clen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last ciphertext block */ + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block(offset, state.Lstar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, offset); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + c += temp; + } + + /* Finalize the decryption phase */ + lw_xor_block(sum, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, state.Ldollar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), sum, sum); + + /* Process the associated data and check the final authentication tag */ + OCB_CONCAT(OCB_ALG_NAME,_process_ad)(&state, sum, ad, adlen); + return aead_check_tag(mtemp, *mlen, sum, c, OCB_TAG_SIZE); +} + +#endif /* OCB_ENCRYPT_BLOCK */ + +#endif /* LW_INTERNAL_OCB_H */ diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask-avr.S b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask-avr.S new file mode 100644 index 0000000..b7cc631 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask-avr.S @@ -0,0 +1,8883 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global pyjamask_96_setup_key + .type pyjamask_96_setup_key, @function +pyjamask_96_setup_key: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + mov r26,r1 +29: + movw r12,r18 + movw r14,r20 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,202 + mov r12,r27 + ldi r27,185 + mov r13,r27 + ldi r27,129 + mov r14,r27 + ldi r27,184 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,229 + ldi r25,220 + ldi r16,64 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,114 + ldi r25,110 + ldi r16,32 + ldi r17,174 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,57 + ldi r25,55 + ldi r16,16 + ldi r17,87 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,156 + ldi r25,27 + ldi r16,136 + ldi r17,171 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,206 + ldi r25,13 + ldi r16,196 + ldi r17,85 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,231 + ldi r25,6 + ldi r16,226 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,115 + ldi r25,3 + ldi r16,113 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,185 + ldi r25,129 + ldi r16,184 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,220 + ldi r25,64 + ldi r16,92 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,110 + ldi r25,32 + ldi r16,174 + ldi r17,114 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,55 + ldi r25,16 + ldi r16,87 + ldi r17,57 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,27 + ldi r25,136 + ldi r16,171 + ldi r17,156 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,13 + ldi r25,196 + ldi r16,85 + ldi r17,206 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,6 + ldi r25,226 + ldi r16,42 + ldi r17,231 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,3 + ldi r25,113 + ldi r16,149 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,129 + ldi r25,184 + ldi r16,202 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,92 + ldi r16,229 + ldi r17,220 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,32 + ldi r25,174 + ldi r16,114 + ldi r17,110 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,16 + ldi r25,87 + ldi r16,57 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,136 + ldi r25,171 + ldi r16,156 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,196 + ldi r25,85 + ldi r16,206 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,226 + ldi r25,42 + ldi r16,231 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,113 + ldi r25,149 + ldi r16,115 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,184 + ldi r25,202 + ldi r16,185 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,92 + ldi r25,229 + ldi r16,220 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,174 + ldi r25,114 + ldi r16,110 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,87 + ldi r25,57 + ldi r16,55 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,171 + ldi r25,156 + ldi r16,27 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,85 + ldi r25,206 + ldi r16,13 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,42 + ldi r25,231 + ldi r16,6 + ldi r17,226 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,149 + ldi r25,115 + ldi r16,3 + ldi r17,113 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + ldi r25,128 + eor r18,r25 + eor r18,r26 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + ldi r24,106 + eor r23,r24 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + lsl r4 + rol r5 + rol r6 + rol r7 + adc r4,r1 + ldi r17,63 + eor r6,r17 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + ldi r16,36 + eor r11,r16 + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + inc r26 + ldi r27,14 + cpse r26,r27 + rjmp 29b + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size pyjamask_96_setup_key, .-pyjamask_96_setup_key + + .text +.global pyjamask_96_encrypt + .type pyjamask_96_encrypt, @function +pyjamask_96_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 16 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ldi r26,14 +13: + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r18 + and r0,r22 + eor r4,r0 + mov r0,r19 + and r0,r23 + eor r5,r0 + mov r0,r20 + and r0,r2 + eor r6,r0 + mov r0,r21 + and r0,r3 + eor r7,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r4 + eor r22,r0 + mov r0,r19 + and r0,r5 + eor r23,r0 + mov r0,r20 + and r0,r6 + eor r2,r0 + mov r0,r21 + and r0,r7 + eor r3,r0 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + com r4 + com r5 + com r6 + com r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,133 + mov r8,r27 + ldi r27,16 + mov r9,r27 + ldi r27,134 + mov r10,r27 + ldi r27,163 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,8 + ldi r16,195 + ldi r17,209 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,132 + ldi r16,225 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,16 + ldi r25,194 + ldi r16,112 + ldi r17,180 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,8 + ldi r25,97 + ldi r16,56 + ldi r17,90 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,48 + ldi r16,28 + ldi r17,45 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,24 + ldi r16,142 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,12 + ldi r16,71 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,16 + ldi r25,134 + ldi r16,163 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,8 + ldi r25,195 + ldi r16,209 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,132 + ldi r25,225 + ldi r16,104 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,194 + ldi r25,112 + ldi r16,180 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,97 + ldi r25,56 + ldi r16,90 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,48 + ldi r25,28 + ldi r16,45 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,24 + ldi r25,142 + ldi r16,22 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,12 + ldi r25,71 + ldi r16,11 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,134 + ldi r25,163 + ldi r16,133 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,195 + ldi r25,209 + ldi r16,66 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,225 + ldi r25,104 + ldi r16,33 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,112 + ldi r25,180 + ldi r16,16 + ldi r17,194 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,56 + ldi r25,90 + ldi r16,8 + ldi r17,97 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,28 + ldi r25,45 + ldi r16,132 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,142 + ldi r25,22 + ldi r16,66 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,71 + ldi r25,11 + ldi r16,33 + ldi r17,12 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,163 + ldi r25,133 + ldi r16,16 + ldi r17,134 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,209 + ldi r25,66 + ldi r16,8 + ldi r17,195 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,104 + ldi r25,33 + ldi r16,132 + ldi r17,225 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,180 + ldi r25,16 + ldi r16,194 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,90 + ldi r25,8 + ldi r16,97 + ldi r17,56 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,45 + ldi r25,132 + ldi r16,48 + ldi r17,28 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,22 + ldi r25,66 + ldi r16,24 + ldi r17,142 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,11 + ldi r25,33 + ldi r16,12 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r18,r8 + movw r20,r10 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,33 + mov r8,r27 + ldi r27,112 + mov r9,r27 + ldi r27,65 + mov r10,r27 + ldi r27,99 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,16 + ldi r25,184 + ldi r16,160 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,8 + ldi r25,92 + ldi r16,208 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,4 + ldi r25,46 + ldi r16,104 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,2 + ldi r25,23 + ldi r16,52 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,129 + ldi r25,11 + ldi r16,26 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,192 + ldi r25,5 + ldi r16,141 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,224 + ldi r25,130 + ldi r16,198 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,112 + ldi r25,65 + ldi r16,99 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,184 + ldi r25,160 + ldi r16,177 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,92 + ldi r25,208 + ldi r16,88 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,46 + ldi r25,104 + ldi r16,44 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,23 + ldi r25,52 + ldi r16,22 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,11 + ldi r25,26 + ldi r16,11 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,5 + ldi r25,141 + ldi r16,133 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,130 + ldi r25,198 + ldi r16,66 + ldi r17,224 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,65 + ldi r25,99 + ldi r16,33 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,160 + ldi r25,177 + ldi r16,16 + ldi r17,184 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,208 + ldi r25,88 + ldi r16,8 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,104 + ldi r25,44 + ldi r16,4 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,52 + ldi r25,22 + ldi r16,2 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,26 + ldi r25,11 + ldi r16,129 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,141 + ldi r25,133 + ldi r16,192 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,198 + ldi r25,66 + ldi r16,224 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,99 + ldi r25,33 + ldi r16,112 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,177 + ldi r25,16 + ldi r16,184 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,88 + ldi r25,8 + ldi r16,92 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,44 + ldi r25,4 + ldi r16,46 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,22 + ldi r25,2 + ldi r16,23 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,11 + ldi r25,129 + ldi r16,11 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,133 + ldi r25,192 + ldi r16,5 + ldi r17,141 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,66 + ldi r25,224 + ldi r16,130 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r22,r8 + movw r2,r10 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,128 + mov r8,r27 + ldi r27,242 + mov r9,r27 + ldi r27,44 + mov r10,r27 + ldi r27,105 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,64 + ldi r25,121 + ldi r16,150 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,160 + ldi r25,60 + ldi r16,75 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,80 + ldi r25,158 + ldi r16,37 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,40 + ldi r25,207 + ldi r16,146 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,148 + ldi r25,103 + ldi r16,73 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,202 + ldi r25,179 + ldi r16,164 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,229 + ldi r25,89 + ldi r16,210 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,242 + ldi r25,44 + ldi r16,105 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,121 + ldi r25,150 + ldi r16,52 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,60 + ldi r25,75 + ldi r16,26 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,158 + ldi r25,37 + ldi r16,13 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,207 + ldi r25,146 + ldi r16,6 + ldi r17,40 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,103 + ldi r25,73 + ldi r16,3 + ldi r17,148 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,179 + ldi r25,164 + ldi r16,1 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,89 + ldi r25,210 + mov r16,r1 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,44 + ldi r25,105 + ldi r16,128 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,150 + ldi r25,52 + ldi r16,64 + ldi r17,121 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,75 + ldi r25,26 + ldi r16,160 + ldi r17,60 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,37 + ldi r25,13 + ldi r16,80 + ldi r17,158 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,146 + ldi r25,6 + ldi r16,40 + ldi r17,207 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,73 + ldi r25,3 + ldi r16,148 + ldi r17,103 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,164 + ldi r25,1 + ldi r16,202 + ldi r17,179 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,210 + mov r25,r1 + ldi r16,229 + ldi r17,89 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,105 + ldi r25,128 + ldi r16,242 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,52 + ldi r25,64 + ldi r16,121 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,26 + ldi r25,160 + ldi r16,60 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,13 + ldi r25,80 + ldi r16,158 + ldi r17,37 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,6 + ldi r25,40 + ldi r16,207 + ldi r17,146 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,3 + ldi r25,148 + ldi r16,103 + ldi r17,73 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,1 + ldi r25,202 + ldi r16,179 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + mov r24,r1 + ldi r25,229 + ldi r16,89 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r4,r8 + movw r6,r10 + dec r26 + breq 6545f + rjmp 13b +6545: + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + pop r0 + pop r0 + pop r17 + pop r16 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_96_encrypt, .-pyjamask_96_encrypt + + .text +.global pyjamask_96_decrypt + .type pyjamask_96_decrypt, @function +pyjamask_96_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 16 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + subi r30,76 + sbci r31,255 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r4,r26 + eor r5,r27 + eor r6,r8 + eor r7,r9 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r22,r26 + eor r23,r27 + eor r2,r8 + eor r3,r9 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r18,r26 + eor r19,r27 + eor r20,r8 + eor r21,r9 + ldi r26,14 +39: + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,33 + mov r8,r27 + ldi r27,161 + mov r9,r27 + ldi r27,55 + mov r10,r27 + ldi r27,32 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,144 + ldi r25,208 + ldi r16,27 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,72 + ldi r25,232 + ldi r16,13 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,36 + ldi r25,244 + ldi r16,6 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,18 + ldi r25,122 + ldi r16,3 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,9 + ldi r25,189 + ldi r16,1 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,222 + ldi r16,128 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,111 + ldi r16,64 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,161 + ldi r25,55 + ldi r16,32 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,208 + ldi r25,27 + ldi r16,144 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,232 + ldi r25,13 + ldi r16,72 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,244 + ldi r25,6 + ldi r16,36 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,122 + ldi r25,3 + ldi r16,18 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,189 + ldi r25,1 + ldi r16,9 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,222 + ldi r25,128 + ldi r16,132 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,111 + ldi r25,64 + ldi r16,66 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,55 + ldi r25,32 + ldi r16,33 + ldi r17,161 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,27 + ldi r25,144 + ldi r16,144 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,13 + ldi r25,72 + ldi r16,72 + ldi r17,232 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,6 + ldi r25,36 + ldi r16,36 + ldi r17,244 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,3 + ldi r25,18 + ldi r16,18 + ldi r17,122 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,1 + ldi r25,9 + ldi r16,9 + ldi r17,189 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,128 + ldi r25,132 + ldi r16,132 + ldi r17,222 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,66 + ldi r16,66 + ldi r17,111 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,32 + ldi r25,33 + ldi r16,161 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,144 + ldi r25,144 + ldi r16,208 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,72 + ldi r25,72 + ldi r16,232 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,36 + ldi r25,36 + ldi r16,244 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,18 + ldi r25,18 + ldi r16,122 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,9 + ldi r25,9 + ldi r16,189 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,132 + ldi r25,132 + ldi r16,222 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,66 + ldi r25,66 + ldi r16,111 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r18,r8 + movw r20,r10 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,160 + mov r8,r27 + ldi r27,242 + mov r9,r27 + ldi r27,143 + mov r10,r27 + ldi r27,16 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,80 + ldi r25,249 + ldi r16,71 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,168 + ldi r25,252 + ldi r16,35 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,84 + ldi r25,254 + ldi r16,17 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,42 + ldi r25,255 + ldi r16,8 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,149 + ldi r25,127 + ldi r16,132 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,202 + ldi r25,63 + ldi r16,66 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,229 + ldi r25,31 + ldi r16,33 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,242 + ldi r25,143 + ldi r16,16 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,249 + ldi r25,71 + ldi r16,8 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,252 + ldi r25,35 + ldi r16,4 + ldi r17,168 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,254 + ldi r25,17 + ldi r16,2 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,255 + ldi r25,8 + ldi r16,1 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,127 + ldi r25,132 + mov r16,r1 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,63 + ldi r25,66 + ldi r16,128 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,31 + ldi r25,33 + ldi r16,64 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,143 + ldi r25,16 + ldi r16,160 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,71 + ldi r25,8 + ldi r16,80 + ldi r17,249 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,35 + ldi r25,4 + ldi r16,168 + ldi r17,252 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,17 + ldi r25,2 + ldi r16,84 + ldi r17,254 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,8 + ldi r25,1 + ldi r16,42 + ldi r17,255 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,132 + mov r25,r1 + ldi r16,149 + ldi r17,127 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,66 + ldi r25,128 + ldi r16,202 + ldi r17,63 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,33 + ldi r25,64 + ldi r16,229 + ldi r17,31 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,16 + ldi r25,160 + ldi r16,242 + ldi r17,143 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,8 + ldi r25,80 + ldi r16,249 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,4 + ldi r25,168 + ldi r16,252 + ldi r17,35 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,2 + ldi r25,84 + ldi r16,254 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,1 + ldi r25,42 + ldi r16,255 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + mov r24,r1 + ldi r25,149 + ldi r16,127 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,128 + ldi r25,202 + ldi r16,63 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,64 + ldi r25,229 + ldi r16,31 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r22,r8 + movw r2,r10 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,192 + mov r8,r27 + ldi r27,216 + mov r9,r27 + ldi r27,84 + mov r10,r27 + ldi r27,144 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,96 + ldi r25,108 + ldi r16,42 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,48 + ldi r25,54 + ldi r16,21 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,24 + ldi r25,155 + ldi r16,10 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,140 + ldi r25,77 + ldi r16,5 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,198 + ldi r25,166 + ldi r16,130 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,99 + ldi r25,83 + ldi r16,65 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,177 + ldi r25,169 + ldi r16,32 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,216 + ldi r25,84 + ldi r16,144 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,108 + ldi r25,42 + ldi r16,72 + ldi r17,96 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,54 + ldi r25,21 + ldi r16,36 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,155 + ldi r25,10 + ldi r16,18 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,77 + ldi r25,5 + ldi r16,9 + ldi r17,140 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,166 + ldi r25,130 + ldi r16,4 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,83 + ldi r25,65 + ldi r16,2 + ldi r17,99 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,169 + ldi r25,32 + ldi r16,129 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,84 + ldi r25,144 + ldi r16,192 + ldi r17,216 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,42 + ldi r25,72 + ldi r16,96 + ldi r17,108 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,21 + ldi r25,36 + ldi r16,48 + ldi r17,54 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,10 + ldi r25,18 + ldi r16,24 + ldi r17,155 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,5 + ldi r25,9 + ldi r16,140 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,130 + ldi r25,4 + ldi r16,198 + ldi r17,166 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,65 + ldi r25,2 + ldi r16,99 + ldi r17,83 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,32 + ldi r25,129 + ldi r16,177 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,144 + ldi r25,192 + ldi r16,216 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,72 + ldi r25,96 + ldi r16,108 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,36 + ldi r25,48 + ldi r16,54 + ldi r17,21 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,18 + ldi r25,24 + ldi r16,155 + ldi r17,10 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,9 + ldi r25,140 + ldi r16,77 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,4 + ldi r25,198 + ldi r16,166 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,2 + ldi r25,99 + ldi r16,83 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,129 + ldi r25,177 + ldi r16,169 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r4,r8 + movw r6,r10 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + com r4 + com r5 + com r6 + com r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r18 + and r0,r4 + eor r22,r0 + mov r0,r19 + and r0,r5 + eor r23,r0 + mov r0,r20 + and r0,r6 + eor r2,r0 + mov r0,r21 + and r0,r7 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r22 + eor r4,r0 + mov r0,r19 + and r0,r23 + eor r5,r0 + mov r0,r20 + and r0,r2 + eor r6,r0 + mov r0,r21 + and r0,r3 + eor r7,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + dec r26 + breq 6571f + rjmp 39b +6571: + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + pop r0 + pop r0 + pop r17 + pop r16 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_96_decrypt, .-pyjamask_96_decrypt + + .text +.global pyjamask_128_setup_key + .type pyjamask_128_setup_key, @function +pyjamask_128_setup_key: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r26,r1 +33: + movw r12,r18 + movw r14,r20 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,202 + mov r12,r27 + ldi r27,185 + mov r13,r27 + ldi r27,129 + mov r14,r27 + ldi r27,184 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,229 + ldi r25,220 + ldi r16,64 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,114 + ldi r25,110 + ldi r16,32 + ldi r17,174 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,57 + ldi r25,55 + ldi r16,16 + ldi r17,87 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,156 + ldi r25,27 + ldi r16,136 + ldi r17,171 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,206 + ldi r25,13 + ldi r16,196 + ldi r17,85 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,231 + ldi r25,6 + ldi r16,226 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,115 + ldi r25,3 + ldi r16,113 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,185 + ldi r25,129 + ldi r16,184 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,220 + ldi r25,64 + ldi r16,92 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,110 + ldi r25,32 + ldi r16,174 + ldi r17,114 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,55 + ldi r25,16 + ldi r16,87 + ldi r17,57 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,27 + ldi r25,136 + ldi r16,171 + ldi r17,156 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,13 + ldi r25,196 + ldi r16,85 + ldi r17,206 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,6 + ldi r25,226 + ldi r16,42 + ldi r17,231 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,3 + ldi r25,113 + ldi r16,149 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,129 + ldi r25,184 + ldi r16,202 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,92 + ldi r16,229 + ldi r17,220 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,32 + ldi r25,174 + ldi r16,114 + ldi r17,110 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,16 + ldi r25,87 + ldi r16,57 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,136 + ldi r25,171 + ldi r16,156 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,196 + ldi r25,85 + ldi r16,206 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,226 + ldi r25,42 + ldi r16,231 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,113 + ldi r25,149 + ldi r16,115 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,184 + ldi r25,202 + ldi r16,185 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,92 + ldi r25,229 + ldi r16,220 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,174 + ldi r25,114 + ldi r16,110 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,87 + ldi r25,57 + ldi r16,55 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,171 + ldi r25,156 + ldi r16,27 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,85 + ldi r25,206 + ldi r16,13 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,42 + ldi r25,231 + ldi r16,6 + ldi r17,226 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,149 + ldi r25,115 + ldi r16,3 + ldi r17,113 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + ldi r25,128 + eor r18,r25 + eor r18,r26 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + ldi r24,106 + eor r23,r24 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + lsl r4 + rol r5 + rol r6 + rol r7 + adc r4,r1 + ldi r17,63 + eor r6,r17 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + ldi r16,36 + eor r11,r16 + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + inc r26 + ldi r27,14 + cpse r26,r27 + rjmp 33b + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size pyjamask_128_setup_key, .-pyjamask_128_setup_key + + .text +.global pyjamask_128_encrypt + .type pyjamask_128_encrypt, @function +pyjamask_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ldi r26,14 +17: + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + mov r0,r18 + and r0,r22 + eor r8,r0 + mov r0,r19 + and r0,r23 + eor r9,r0 + mov r0,r20 + and r0,r2 + eor r10,r0 + mov r0,r21 + and r0,r3 + eor r11,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r4 + and r0,r8 + eor r22,r0 + mov r0,r5 + and r0,r9 + eor r23,r0 + mov r0,r6 + and r0,r10 + eor r2,r0 + mov r0,r7 + and r0,r11 + eor r3,r0 + mov r0,r18 + and r0,r8 + eor r4,r0 + mov r0,r19 + and r0,r9 + eor r5,r0 + mov r0,r20 + and r0,r10 + eor r6,r0 + mov r0,r21 + and r0,r11 + eor r7,r0 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + com r8 + com r9 + com r10 + com r11 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,133 + mov r12,r27 + ldi r27,16 + mov r13,r27 + ldi r27,134 + mov r14,r27 + ldi r27,163 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,8 + ldi r16,195 + ldi r17,209 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,132 + ldi r16,225 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,16 + ldi r25,194 + ldi r16,112 + ldi r17,180 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,8 + ldi r25,97 + ldi r16,56 + ldi r17,90 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,48 + ldi r16,28 + ldi r17,45 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,24 + ldi r16,142 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,12 + ldi r16,71 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,16 + ldi r25,134 + ldi r16,163 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,8 + ldi r25,195 + ldi r16,209 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,132 + ldi r25,225 + ldi r16,104 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,194 + ldi r25,112 + ldi r16,180 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,97 + ldi r25,56 + ldi r16,90 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,48 + ldi r25,28 + ldi r16,45 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,24 + ldi r25,142 + ldi r16,22 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,12 + ldi r25,71 + ldi r16,11 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,134 + ldi r25,163 + ldi r16,133 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,195 + ldi r25,209 + ldi r16,66 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,225 + ldi r25,104 + ldi r16,33 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,112 + ldi r25,180 + ldi r16,16 + ldi r17,194 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,56 + ldi r25,90 + ldi r16,8 + ldi r17,97 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,28 + ldi r25,45 + ldi r16,132 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,142 + ldi r25,22 + ldi r16,66 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,71 + ldi r25,11 + ldi r16,33 + ldi r17,12 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,163 + ldi r25,133 + ldi r16,16 + ldi r17,134 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,209 + ldi r25,66 + ldi r16,8 + ldi r17,195 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,104 + ldi r25,33 + ldi r16,132 + ldi r17,225 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,180 + ldi r25,16 + ldi r16,194 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,90 + ldi r25,8 + ldi r16,97 + ldi r17,56 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,45 + ldi r25,132 + ldi r16,48 + ldi r17,28 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,22 + ldi r25,66 + ldi r16,24 + ldi r17,142 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,11 + ldi r25,33 + ldi r16,12 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,33 + mov r12,r27 + ldi r27,112 + mov r13,r27 + ldi r27,65 + mov r14,r27 + ldi r27,99 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,16 + ldi r25,184 + ldi r16,160 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,8 + ldi r25,92 + ldi r16,208 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,4 + ldi r25,46 + ldi r16,104 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,2 + ldi r25,23 + ldi r16,52 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,129 + ldi r25,11 + ldi r16,26 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,192 + ldi r25,5 + ldi r16,141 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,224 + ldi r25,130 + ldi r16,198 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,112 + ldi r25,65 + ldi r16,99 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,184 + ldi r25,160 + ldi r16,177 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,92 + ldi r25,208 + ldi r16,88 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,46 + ldi r25,104 + ldi r16,44 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,23 + ldi r25,52 + ldi r16,22 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,11 + ldi r25,26 + ldi r16,11 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,5 + ldi r25,141 + ldi r16,133 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,130 + ldi r25,198 + ldi r16,66 + ldi r17,224 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,65 + ldi r25,99 + ldi r16,33 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,160 + ldi r25,177 + ldi r16,16 + ldi r17,184 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,208 + ldi r25,88 + ldi r16,8 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,104 + ldi r25,44 + ldi r16,4 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,52 + ldi r25,22 + ldi r16,2 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,26 + ldi r25,11 + ldi r16,129 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,141 + ldi r25,133 + ldi r16,192 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,198 + ldi r25,66 + ldi r16,224 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,99 + ldi r25,33 + ldi r16,112 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,177 + ldi r25,16 + ldi r16,184 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,88 + ldi r25,8 + ldi r16,92 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,44 + ldi r25,4 + ldi r16,46 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,22 + ldi r25,2 + ldi r16,23 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,11 + ldi r25,129 + ldi r16,11 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,133 + ldi r25,192 + ldi r16,5 + ldi r17,141 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,66 + ldi r25,224 + ldi r16,130 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r22,r12 + movw r2,r14 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,128 + mov r12,r27 + ldi r27,242 + mov r13,r27 + ldi r27,44 + mov r14,r27 + ldi r27,105 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,64 + ldi r25,121 + ldi r16,150 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,160 + ldi r25,60 + ldi r16,75 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,80 + ldi r25,158 + ldi r16,37 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,40 + ldi r25,207 + ldi r16,146 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,148 + ldi r25,103 + ldi r16,73 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,202 + ldi r25,179 + ldi r16,164 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,229 + ldi r25,89 + ldi r16,210 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,242 + ldi r25,44 + ldi r16,105 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,121 + ldi r25,150 + ldi r16,52 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,60 + ldi r25,75 + ldi r16,26 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,158 + ldi r25,37 + ldi r16,13 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,207 + ldi r25,146 + ldi r16,6 + ldi r17,40 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,103 + ldi r25,73 + ldi r16,3 + ldi r17,148 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,179 + ldi r25,164 + ldi r16,1 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,89 + ldi r25,210 + mov r16,r1 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,44 + ldi r25,105 + ldi r16,128 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,150 + ldi r25,52 + ldi r16,64 + ldi r17,121 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,75 + ldi r25,26 + ldi r16,160 + ldi r17,60 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,37 + ldi r25,13 + ldi r16,80 + ldi r17,158 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,146 + ldi r25,6 + ldi r16,40 + ldi r17,207 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,73 + ldi r25,3 + ldi r16,148 + ldi r17,103 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,164 + ldi r25,1 + ldi r16,202 + ldi r17,179 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,210 + mov r25,r1 + ldi r16,229 + ldi r17,89 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,105 + ldi r25,128 + ldi r16,242 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,52 + ldi r25,64 + ldi r16,121 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,26 + ldi r25,160 + ldi r16,60 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,13 + ldi r25,80 + ldi r16,158 + ldi r17,37 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,6 + ldi r25,40 + ldi r16,207 + ldi r17,146 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,3 + ldi r25,148 + ldi r16,103 + ldi r17,73 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,1 + ldi r25,202 + ldi r16,179 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + mov r24,r1 + ldi r25,229 + ldi r16,89 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r4,r12 + movw r6,r14 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r27,19 + mov r12,r27 + ldi r27,72 + mov r13,r27 + ldi r27,165 + mov r14,r27 + ldi r27,72 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,9 + ldi r25,164 + ldi r16,82 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,4 + ldi r25,82 + ldi r16,41 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,2 + ldi r25,169 + ldi r16,20 + ldi r17,105 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,129 + ldi r25,84 + ldi r16,138 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,64 + ldi r25,42 + ldi r16,69 + ldi r17,154 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,32 + ldi r25,149 + ldi r16,34 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,144 + ldi r25,74 + ldi r16,145 + ldi r17,38 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,72 + ldi r25,165 + ldi r16,72 + ldi r17,19 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,164 + ldi r25,82 + ldi r16,164 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,82 + ldi r25,41 + ldi r16,210 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,169 + ldi r25,20 + ldi r16,105 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,84 + ldi r25,138 + ldi r16,52 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,42 + ldi r25,69 + ldi r16,154 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,149 + ldi r25,34 + ldi r16,77 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,74 + ldi r25,145 + ldi r16,38 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,165 + ldi r25,72 + ldi r16,19 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,82 + ldi r25,164 + ldi r16,9 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,41 + ldi r25,210 + ldi r16,4 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,20 + ldi r25,105 + ldi r16,2 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,138 + ldi r25,52 + ldi r16,129 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,69 + ldi r25,154 + ldi r16,64 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,34 + ldi r25,77 + ldi r16,32 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,145 + ldi r25,38 + ldi r16,144 + ldi r17,74 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,72 + ldi r25,19 + ldi r16,72 + ldi r17,165 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,164 + ldi r25,9 + ldi r16,164 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,210 + ldi r25,4 + ldi r16,82 + ldi r17,41 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,105 + ldi r25,2 + ldi r16,169 + ldi r17,20 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,52 + ldi r25,129 + ldi r16,84 + ldi r17,138 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,154 + ldi r25,64 + ldi r16,42 + ldi r17,69 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,77 + ldi r25,32 + ldi r16,149 + ldi r17,34 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,38 + ldi r25,144 + ldi r16,74 + ldi r17,145 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r8,r12 + movw r10,r14 + dec r26 + breq 7055f + rjmp 17b +7055: + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_128_encrypt, .-pyjamask_128_encrypt + + .text +.global pyjamask_128_decrypt + .type pyjamask_128_decrypt, @function +pyjamask_128_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + subi r30,16 + sbci r31,255 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r8,r26 + eor r9,r27 + eor r10,r12 + eor r11,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r4,r26 + eor r5,r27 + eor r6,r12 + eor r7,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r22,r26 + eor r23,r27 + eor r2,r12 + eor r3,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r18,r26 + eor r19,r27 + eor r20,r12 + eor r21,r13 + ldi r26,14 +51: + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,33 + mov r12,r27 + ldi r27,161 + mov r13,r27 + ldi r27,55 + mov r14,r27 + ldi r27,32 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,144 + ldi r25,208 + ldi r16,27 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,72 + ldi r25,232 + ldi r16,13 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,36 + ldi r25,244 + ldi r16,6 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,18 + ldi r25,122 + ldi r16,3 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,9 + ldi r25,189 + ldi r16,1 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,222 + ldi r16,128 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,111 + ldi r16,64 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,161 + ldi r25,55 + ldi r16,32 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,208 + ldi r25,27 + ldi r16,144 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,232 + ldi r25,13 + ldi r16,72 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,244 + ldi r25,6 + ldi r16,36 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,122 + ldi r25,3 + ldi r16,18 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,189 + ldi r25,1 + ldi r16,9 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,222 + ldi r25,128 + ldi r16,132 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,111 + ldi r25,64 + ldi r16,66 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,55 + ldi r25,32 + ldi r16,33 + ldi r17,161 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,27 + ldi r25,144 + ldi r16,144 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,13 + ldi r25,72 + ldi r16,72 + ldi r17,232 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,6 + ldi r25,36 + ldi r16,36 + ldi r17,244 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,3 + ldi r25,18 + ldi r16,18 + ldi r17,122 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,1 + ldi r25,9 + ldi r16,9 + ldi r17,189 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,128 + ldi r25,132 + ldi r16,132 + ldi r17,222 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,66 + ldi r16,66 + ldi r17,111 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,32 + ldi r25,33 + ldi r16,161 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,144 + ldi r25,144 + ldi r16,208 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,72 + ldi r25,72 + ldi r16,232 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,36 + ldi r25,36 + ldi r16,244 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,18 + ldi r25,18 + ldi r16,122 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,9 + ldi r25,9 + ldi r16,189 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,132 + ldi r25,132 + ldi r16,222 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,66 + ldi r25,66 + ldi r16,111 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,160 + mov r12,r27 + ldi r27,242 + mov r13,r27 + ldi r27,143 + mov r14,r27 + ldi r27,16 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,80 + ldi r25,249 + ldi r16,71 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,168 + ldi r25,252 + ldi r16,35 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,84 + ldi r25,254 + ldi r16,17 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,42 + ldi r25,255 + ldi r16,8 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,149 + ldi r25,127 + ldi r16,132 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,202 + ldi r25,63 + ldi r16,66 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,229 + ldi r25,31 + ldi r16,33 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,242 + ldi r25,143 + ldi r16,16 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,249 + ldi r25,71 + ldi r16,8 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,252 + ldi r25,35 + ldi r16,4 + ldi r17,168 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,254 + ldi r25,17 + ldi r16,2 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,255 + ldi r25,8 + ldi r16,1 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,127 + ldi r25,132 + mov r16,r1 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,63 + ldi r25,66 + ldi r16,128 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,31 + ldi r25,33 + ldi r16,64 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,143 + ldi r25,16 + ldi r16,160 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,71 + ldi r25,8 + ldi r16,80 + ldi r17,249 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,35 + ldi r25,4 + ldi r16,168 + ldi r17,252 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,17 + ldi r25,2 + ldi r16,84 + ldi r17,254 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,8 + ldi r25,1 + ldi r16,42 + ldi r17,255 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,132 + mov r25,r1 + ldi r16,149 + ldi r17,127 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,66 + ldi r25,128 + ldi r16,202 + ldi r17,63 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,33 + ldi r25,64 + ldi r16,229 + ldi r17,31 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,16 + ldi r25,160 + ldi r16,242 + ldi r17,143 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,8 + ldi r25,80 + ldi r16,249 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,4 + ldi r25,168 + ldi r16,252 + ldi r17,35 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,2 + ldi r25,84 + ldi r16,254 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,1 + ldi r25,42 + ldi r16,255 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + mov r24,r1 + ldi r25,149 + ldi r16,127 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,128 + ldi r25,202 + ldi r16,63 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,64 + ldi r25,229 + ldi r16,31 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r22,r12 + movw r2,r14 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,192 + mov r12,r27 + ldi r27,216 + mov r13,r27 + ldi r27,84 + mov r14,r27 + ldi r27,144 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,96 + ldi r25,108 + ldi r16,42 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,48 + ldi r25,54 + ldi r16,21 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,24 + ldi r25,155 + ldi r16,10 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,140 + ldi r25,77 + ldi r16,5 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,198 + ldi r25,166 + ldi r16,130 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,99 + ldi r25,83 + ldi r16,65 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,177 + ldi r25,169 + ldi r16,32 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,216 + ldi r25,84 + ldi r16,144 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,108 + ldi r25,42 + ldi r16,72 + ldi r17,96 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,54 + ldi r25,21 + ldi r16,36 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,155 + ldi r25,10 + ldi r16,18 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,77 + ldi r25,5 + ldi r16,9 + ldi r17,140 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,166 + ldi r25,130 + ldi r16,4 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,83 + ldi r25,65 + ldi r16,2 + ldi r17,99 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,169 + ldi r25,32 + ldi r16,129 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,84 + ldi r25,144 + ldi r16,192 + ldi r17,216 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,42 + ldi r25,72 + ldi r16,96 + ldi r17,108 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,21 + ldi r25,36 + ldi r16,48 + ldi r17,54 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,10 + ldi r25,18 + ldi r16,24 + ldi r17,155 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,5 + ldi r25,9 + ldi r16,140 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,130 + ldi r25,4 + ldi r16,198 + ldi r17,166 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,65 + ldi r25,2 + ldi r16,99 + ldi r17,83 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,32 + ldi r25,129 + ldi r16,177 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,144 + ldi r25,192 + ldi r16,216 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,72 + ldi r25,96 + ldi r16,108 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,36 + ldi r25,48 + ldi r16,54 + ldi r17,21 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,18 + ldi r25,24 + ldi r16,155 + ldi r17,10 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,9 + ldi r25,140 + ldi r16,77 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,4 + ldi r25,198 + ldi r16,166 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,2 + ldi r25,99 + ldi r16,83 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,129 + ldi r25,177 + ldi r16,169 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r4,r12 + movw r6,r14 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r27,23 + mov r12,r27 + ldi r27,177 + mov r13,r27 + ldi r27,84 + mov r14,r27 + ldi r27,51 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,139 + ldi r25,88 + ldi r16,170 + ldi r17,153 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,69 + ldi r25,44 + ldi r16,213 + ldi r17,204 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,34 + ldi r25,150 + ldi r16,106 + ldi r17,230 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,17 + ldi r25,75 + ldi r16,53 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,136 + ldi r25,165 + ldi r16,154 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,196 + ldi r25,82 + ldi r16,205 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,98 + ldi r25,169 + ldi r16,102 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,177 + ldi r25,84 + ldi r16,51 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,88 + ldi r25,170 + ldi r16,153 + ldi r17,139 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,44 + ldi r25,213 + ldi r16,204 + ldi r17,69 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,150 + ldi r25,106 + ldi r16,230 + ldi r17,34 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,75 + ldi r25,53 + ldi r16,115 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,165 + ldi r25,154 + ldi r16,185 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,82 + ldi r25,205 + ldi r16,92 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,169 + ldi r25,102 + ldi r16,46 + ldi r17,98 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,84 + ldi r25,51 + ldi r16,23 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,170 + ldi r25,153 + ldi r16,139 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,213 + ldi r25,204 + ldi r16,69 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,106 + ldi r25,230 + ldi r16,34 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,53 + ldi r25,115 + ldi r16,17 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,154 + ldi r25,185 + ldi r16,136 + ldi r17,165 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,205 + ldi r25,92 + ldi r16,196 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,102 + ldi r25,46 + ldi r16,98 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,51 + ldi r25,23 + ldi r16,177 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,153 + ldi r25,139 + ldi r16,88 + ldi r17,170 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,204 + ldi r25,69 + ldi r16,44 + ldi r17,213 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,230 + ldi r25,34 + ldi r16,150 + ldi r17,106 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,115 + ldi r25,17 + ldi r16,75 + ldi r17,53 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,185 + ldi r25,136 + ldi r16,165 + ldi r17,154 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,92 + ldi r25,196 + ldi r16,82 + ldi r17,205 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,46 + ldi r25,98 + ldi r16,169 + ldi r17,102 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r8,r12 + movw r10,r14 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + com r8 + com r9 + com r10 + com r11 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + mov r0,r18 + and r0,r8 + eor r4,r0 + mov r0,r19 + and r0,r9 + eor r5,r0 + mov r0,r20 + and r0,r10 + eor r6,r0 + mov r0,r21 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r8 + eor r22,r0 + mov r0,r5 + and r0,r9 + eor r23,r0 + mov r0,r6 + and r0,r10 + eor r2,r0 + mov r0,r7 + and r0,r11 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r22 + eor r8,r0 + mov r0,r19 + and r0,r23 + eor r9,r0 + mov r0,r20 + and r0,r2 + eor r10,r0 + mov r0,r21 + and r0,r3 + eor r11,r0 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + dec r26 + breq 7089f + rjmp 51b +7089: + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_128_decrypt, .-pyjamask_128_decrypt + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.c b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.c new file mode 100644 index 0000000..3c40d2d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-pyjamask.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +/** + * \brief Performs a circulant binary matrix multiplication. + * + * \param x The matrix. + * \param y The vector to multiply with the matrix. + * + * \return The vector result of multiplying x by y. + */ +STATIC_INLINE uint32_t pyjamask_matrix_multiply(uint32_t x, uint32_t y) +{ + uint32_t result = 0; + int bit; + for (bit = 31; bit >= 0; --bit) { +#if defined(ESP32) + /* This version has slightly better performance on ESP32 */ + y = leftRotate1(y); + result ^= x & -(y & 1); + x = rightRotate1(x); +#else + result ^= x & -((y >> bit) & 1); + x = rightRotate1(x); +#endif + } + return result; +} + +void pyjamask_128_setup_key + (pyjamask_128_key_schedule_t *ks, const unsigned char *key) +{ + uint32_t *rk = ks->k; + uint32_t k0, k1, k2, k3; + uint32_t temp; + uint8_t round; + + /* Load the words of the key */ + k0 = be_load_word32(key); + k1 = be_load_word32(key + 4); + k2 = be_load_word32(key + 8); + k3 = be_load_word32(key + 12); + + /* The first round key is the same as the key itself */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk[3] = k3; + rk += 4; + + /* Derive the round keys for all of the other rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 4) { + /* Mix the columns */ + temp = k0 ^ k1 ^ k2 ^ k3; + k0 ^= temp; + k1 ^= temp; + k2 ^= temp; + k3 ^= temp; + + /* Mix the rows and add the round constants. Note that the Pyjamask + * specification says that k1/k2/k3 should be rotated left by 8, 15, + * and 18 bits. But the reference code actually rotates the words + * right. And the test vectors in the specification match up with + * right rotations, not left. We match the reference code here */ + k0 = pyjamask_matrix_multiply(0xb881b9caU, k0) ^ 0x00000080U ^ round; + k1 = rightRotate8(k1) ^ 0x00006a00U; + k2 = rightRotate15(k2) ^ 0x003f0000U; + k3 = rightRotate18(k3) ^ 0x24000000U; + + /* Write the round key to the schedule */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk[3] = k3; + } +} + +void pyjamask_96_setup_key + (pyjamask_96_key_schedule_t *ks, const unsigned char *key) +{ + uint32_t *rk = ks->k; + uint32_t k0, k1, k2, k3; + uint32_t temp; + uint8_t round; + + /* Load the words of the key */ + k0 = be_load_word32(key); + k1 = be_load_word32(key + 4); + k2 = be_load_word32(key + 8); + k3 = be_load_word32(key + 12); + + /* The first round key is the same as the key itself */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk += 3; + + /* Derive the round keys for all of the other rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 3) { + /* Mix the columns */ + temp = k0 ^ k1 ^ k2 ^ k3; + k0 ^= temp; + k1 ^= temp; + k2 ^= temp; + k3 ^= temp; + + /* Mix the rows and add the round constants. Note that the Pyjamask + * specification says that k1/k2/k3 should be rotated left by 8, 15, + * and 18 bits. But the reference code actually rotates the words + * right. And the test vectors in the specification match up with + * right rotations, not left. We match the reference code here */ + k0 = pyjamask_matrix_multiply(0xb881b9caU, k0) ^ 0x00000080U ^ round; + k1 = rightRotate8(k1) ^ 0x00006a00U; + k2 = rightRotate15(k2) ^ 0x003f0000U; + k3 = rightRotate18(k3) ^ 0x24000000U; + + /* Write the round key to the schedule */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + } +} + +void pyjamask_128_encrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k; + uint32_t s0, s1, s2, s3; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 4) { + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + + /* Apply the 128-bit Pyjamask sbox */ + s0 ^= s3; + s3 ^= s0 & s1; + s0 ^= s1 & s2; + s1 ^= s2 & s3; + s2 ^= s0 & s3; + s2 ^= s1; + s1 ^= s0; + s3 = ~s3; + s2 ^= s3; + s3 ^= s2; + s2 ^= s3; + + /* Mix the rows of the state */ + s0 = pyjamask_matrix_multiply(0xa3861085U, s0); + s1 = pyjamask_matrix_multiply(0x63417021U, s1); + s2 = pyjamask_matrix_multiply(0x692cf280U, s2); + s3 = pyjamask_matrix_multiply(0x48a54813U, s3); + } + + /* Mix in the key one last time */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void pyjamask_128_decrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k + 4 * PYJAMASK_ROUNDS; + uint32_t s0, s1, s2, s3; + uint8_t round; + + /* Load the ciphertext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Mix in the last round key */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + rk -= 4; + + /* Perform all decryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk -= 4) { + /* Inverse mix of the rows in the state */ + s0 = pyjamask_matrix_multiply(0x2037a121U, s0); + s1 = pyjamask_matrix_multiply(0x108ff2a0U, s1); + s2 = pyjamask_matrix_multiply(0x9054d8c0U, s2); + s3 = pyjamask_matrix_multiply(0x3354b117U, s3); + + /* Apply the inverse of the 128-bit Pyjamask sbox */ + s2 ^= s3; + s3 ^= s2; + s2 ^= s3; + s3 = ~s3; + s1 ^= s0; + s2 ^= s1; + s2 ^= s0 & s3; + s1 ^= s2 & s3; + s0 ^= s1 & s2; + s3 ^= s0 & s1; + s0 ^= s3; + + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + } + + /* Write the plaintext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void pyjamask_96_encrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k; + uint32_t s0, s1, s2; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 3) { + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + + /* Apply the 96-bit Pyjamask sbox */ + s0 ^= s1; + s1 ^= s2; + s2 ^= s0 & s1; + s0 ^= s1 & s2; + s1 ^= s0 & s2; + s2 ^= s0; + s2 = ~s2; + s1 ^= s0; + s0 ^= s1; + + /* Mix the rows of the state */ + s0 = pyjamask_matrix_multiply(0xa3861085U, s0); + s1 = pyjamask_matrix_multiply(0x63417021U, s1); + s2 = pyjamask_matrix_multiply(0x692cf280U, s2); + } + + /* Mix in the key one last time */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); +} + +void pyjamask_96_decrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k + 3 * PYJAMASK_ROUNDS; + uint32_t s0, s1, s2; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + + /* Mix in the last round key */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + rk -= 3; + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk -= 3) { + /* Inverse mix of the rows in the state */ + s0 = pyjamask_matrix_multiply(0x2037a121U, s0); + s1 = pyjamask_matrix_multiply(0x108ff2a0U, s1); + s2 = pyjamask_matrix_multiply(0x9054d8c0U, s2); + + /* Apply the inverse of the 96-bit Pyjamask sbox */ + s0 ^= s1; + s1 ^= s0; + s2 = ~s2; + s2 ^= s0; + s1 ^= s0 & s2; + s0 ^= s1 & s2; + s2 ^= s0 & s1; + s1 ^= s2; + s0 ^= s1; + + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + } + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); +} + +#endif /* !__AVR__ */ diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.h new file mode 100644 index 0000000..3ead7fb --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-pyjamask.h @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PYJAMASK_H +#define LW_INTERNAL_PYJAMASK_H + +#include "internal-util.h" + +/** + * \file internal-pyjamask.h + * \brief Pyjamask block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Number of rounds in the Pyjamask block cipher. + */ +#define PYJAMASK_ROUNDS 14 + +/** + * \brief Number of parallel states for masked operation. + */ +#define PYJAMASK_MASKING_ORDER 4 + +/** + * \brief Structure of the key schedule for the Pyjamask-128 block cipher. + */ +typedef struct +{ + uint32_t k[(PYJAMASK_ROUNDS + 1) * 4]; /**< Words of the key schedule */ + +} pyjamask_128_key_schedule_t; + +/** + * \brief Structure of the key schedule for the Pyjamask-96 block cipher. + */ +typedef struct +{ + uint32_t k[(PYJAMASK_ROUNDS + 1) * 3]; /**< Words of the key schedule */ + +} pyjamask_96_key_schedule_t; + +/** + * \brief Structure of the key schedule for masked Pyjamask-128. + */ +typedef struct +{ + /** Words of the key schedule */ + uint32_t k[PYJAMASK_MASKING_ORDER * (PYJAMASK_ROUNDS + 1) * 4]; + +} pyjamask_masked_128_key_schedule_t; + +/** + * \brief Structure of the key schedule for masked Pyjamask-96. + */ +typedef struct +{ + /** Words of the key schedule */ + uint32_t k[PYJAMASK_MASKING_ORDER * (PYJAMASK_ROUNDS + 1) * 3]; + +} pyjamask_masked_96_key_schedule_t; + +/** + * \brief Sets up the key schedule for the Pyjamask-128 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_128_setup_key + (pyjamask_128_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Sets up the key schedule for the Pyjamask-96 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_96_setup_key + (pyjamask_96_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with Pyjamask-128. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_128_decrypt() + */ +void pyjamask_128_encrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with Pyjamask-128. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_128_encrypt() + */ +void pyjamask_128_decrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 96-bit block with Pyjamask-96. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_96_decrypt() + */ +void pyjamask_96_encrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 96-bit block with Pyjamask-96. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_96_encrypt() + */ +void pyjamask_96_decrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Sets up the key schedule for the masked Pyjamask-128 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_masked_128_setup_key + (pyjamask_masked_128_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Sets up the key schedule for the masked Pyjamask-96 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_masked_96_setup_key + (pyjamask_masked_96_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with Pyjamask-128 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_masked_128_decrypt() + */ +void pyjamask_masked_128_encrypt + (const pyjamask_masked_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with Pyjamask-128 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_masked_128_encrypt() + */ +void pyjamask_masked_128_decrypt + (const pyjamask_masked_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 96-bit block with Pyjamask-96 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_masked_96_decrypt() + */ +void pyjamask_masked_96_encrypt + (const pyjamask_masked_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 96-bit block with Pyjamask-96 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_masked_96_encrypt() + */ +void pyjamask_masked_96_decrypt + (const pyjamask_masked_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-util.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask-128.c b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask-128.c new file mode 100644 index 0000000..da0fac6 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask-128.c @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "pyjamask.h" +#include "internal-pyjamask.h" + +aead_cipher_t const pyjamask_128_cipher = { + "Pyjamask-128-AEAD", + PYJAMASK_128_KEY_SIZE, + PYJAMASK_128_NONCE_SIZE, + PYJAMASK_128_TAG_SIZE, + AEAD_FLAG_NONE, + pyjamask_128_aead_encrypt, + pyjamask_128_aead_decrypt +}; + +#define OCB_ALG_NAME pyjamask_128 +#define OCB_BLOCK_SIZE 16 +#define OCB_NONCE_SIZE PYJAMASK_128_NONCE_SIZE +#define OCB_TAG_SIZE PYJAMASK_128_TAG_SIZE +#define OCB_KEY_SCHEDULE pyjamask_128_key_schedule_t +#define OCB_SETUP_KEY pyjamask_128_setup_key +#define OCB_ENCRYPT_BLOCK pyjamask_128_encrypt +#define OCB_DECRYPT_BLOCK pyjamask_128_decrypt +#include "internal-ocb.h" diff --git a/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask.h b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask.h new file mode 100644 index 0000000..23ec744 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask128aeadv1/rhys-avr/pyjamask.h @@ -0,0 +1,335 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_PYJAMASK_H +#define LWCRYPTO_PYJAMASK_H + +#include "aead-common.h" + +/** + * \file pyjamask.h + * \brief Pyjamask authenticated encryption algorithm. + * + * Pyjamask AEAD is a family of authenticated encryption algorithms that are + * built around the Pyjamask-128 and Pyjamask-96 block ciphers in OCB mode. + * Pyjamask-128-AEAD has a 128-bit key, a 96-bit nonce, and a 128-bit + * authentication tag. Pyjamask-96-AEAD has a 128-bit key, a 64-bit nonce, + * and a 96-bit authentication tag. + * + * References: https://pyjamask-cipher.github.io/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_NONCE_SIZE 12 + +/** + * \brief Size of the key for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_TAG_SIZE 12 + +/** + * \brief Size of the nonce for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_NONCE_SIZE 8 + +/** + * \brief Meta-information block for the Pyjamask-128-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_128_cipher; + +/** + * \brief Meta-information block for the Pyjamask-96-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_96_cipher; + +/** + * \brief Meta-information block for the masked Pyjamask-128-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_masked_128_cipher; + +/** + * \brief Meta-information block for the masked Pyjamask-96-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_masked_96_cipher; + +/** + * \brief Encrypts and authenticates a packet with Pyjamask-128-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_128_aead_decrypt() + */ +int pyjamask_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Pyjamask-128-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_128_aead_encrypt() + */ +int pyjamask_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Pyjamask-96-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_96_aead_decrypt() + */ +int pyjamask_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Pyjamask-96-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_96_aead_encrypt() + */ +int pyjamask_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with masked Pyjamask-128-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_masked_128_aead_decrypt() + */ +int pyjamask_masked_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with masked Pyjamask-128-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_masked_128_aead_encrypt() + */ +int pyjamask_masked_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with masked Pyjamask-96-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_masked_96_aead_decrypt() + */ +int pyjamask_masked_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with masked Pyjamask-96-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_masked_96_aead_encrypt() + */ +int pyjamask_masked_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.c b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/api.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/api.h new file mode 100644 index 0000000..bd8cdcb --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 8 +#define CRYPTO_ABYTES 12 +#define CRYPTO_NOOVERLAP 1 diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/encrypt.c b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..f09b0ed --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "pyjamask.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return pyjamask_96_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return pyjamask_96_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-ocb.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-ocb.h new file mode 100644 index 0000000..98f2a31 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-ocb.h @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_OCB_H +#define LW_INTERNAL_OCB_H + +#include "internal-util.h" +#include + +/* We expect a number of macros to be defined before this file + * is included to configure the underlying block cipher: + * + * OCB_ALG_NAME Name of the algorithm that is using OCB mode. + * OCB_BLOCK_SIZE Size of the block for the underlying cipher in bytes. + * OCB_NONCE_SIZE Size of the nonce which must be < OCB_BLOCK_SIZE. + * OCB_TAG_SIZE Size of the authentication tag. + * OCB_KEY_SCHEDULE Type for the key schedule. + * OCB_SETUP_KEY Name of the key schedule setup function. + * OCB_ENCRYPT_BLOCK Name of the block cipher ECB encrypt function. + * OCB_DECRYPT_BLOCK Name of the block cipher ECB decrypt function. + * OCB_DOUBLE_L Name of the function to double L (optional). + */ +#if defined(OCB_ENCRYPT_BLOCK) + +/** + * \file internal-ocb.h + * \brief Internal implementation of the OCB block cipher mode. + * + * Note that OCB is covered by patents so it may not be usable in all + * applications. Open source applications should be covered, but for + * others you will need to contact the patent authors to find out + * if you can use it or if a paid license is required. + * + * License information: https://web.cs.ucdavis.edu/~rogaway/ocb/license.htm + * + * References: https://tools.ietf.org/html/rfc7253 + */ + +#define OCB_CONCAT_INNER(name,suffix) name##suffix +#define OCB_CONCAT(name,suffix) OCB_CONCAT_INNER(name,suffix) + +#if !defined(OCB_DOUBLE_L) + +#define OCB_DOUBLE_L OCB_CONCAT(OCB_ALG_NAME,_double_l) + +#if OCB_BLOCK_SIZE == 16 + +/* Double a value in GF(128) */ +static void OCB_DOUBLE_L(unsigned char out[16], const unsigned char in[16]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)in[0]) >> 7); + for (index = 0; index < 15; ++index) + out[index] = (in[index] << 1) | (in[index + 1] >> 7); + out[15] = (in[15] << 1) ^ (mask & 0x87); +} + +#elif OCB_BLOCK_SIZE == 12 + +/* Double a value in GF(96) */ +static void OCB_DOUBLE_L + (unsigned char out[12], const unsigned char in[12]) +{ + unsigned index; + unsigned char mask = (unsigned char)(((signed char)in[0]) >> 7); + for (index = 0; index < 11; ++index) + out[index] = (in[index] << 1) | (in[index + 1] >> 7); + out[11] = (in[11] << 1) ^ (mask & 0x41); + out[10] ^= (mask & 0x06); +} + +#else +#error "Unknown block size for OCB" +#endif + +#endif + +/* State information for OCB functions */ +#define OCB_STATE OCB_CONCAT(OCB_ALG_NAME,_state_t) +typedef struct +{ + OCB_KEY_SCHEDULE ks; + unsigned char Lstar[OCB_BLOCK_SIZE]; + unsigned char Ldollar[OCB_BLOCK_SIZE]; + unsigned char L0[OCB_BLOCK_SIZE]; + unsigned char L1[OCB_BLOCK_SIZE]; + +} OCB_STATE; + +/* Initializes the OCB state from the key and nonce */ +static void OCB_CONCAT(OCB_ALG_NAME,_init) + (OCB_STATE *state, const unsigned char *k, const unsigned char *nonce, + unsigned char offset[OCB_BLOCK_SIZE]) +{ + unsigned bottom; + + /* Set up the key schedule */ + OCB_SETUP_KEY(&(state->ks), k); + + /* Derive the values of L*, L$, L0, and L1 */ + memset(state->Lstar, 0, sizeof(state->Lstar)); + OCB_ENCRYPT_BLOCK(&(state->ks), state->Lstar, state->Lstar); + OCB_DOUBLE_L(state->Ldollar, state->Lstar); + OCB_DOUBLE_L(state->L0, state->Ldollar); + OCB_DOUBLE_L(state->L1, state->L0); + + /* Derive the initial offset from the nonce */ + memset(offset, 0, OCB_BLOCK_SIZE); + memcpy(offset + OCB_BLOCK_SIZE - OCB_NONCE_SIZE, nonce, OCB_NONCE_SIZE); + offset[0] = ((OCB_TAG_SIZE * 8) & 0x7F) << 1; + offset[OCB_BLOCK_SIZE - OCB_NONCE_SIZE - 1] |= 0x01; + bottom = offset[OCB_BLOCK_SIZE - 1] & 0x3F; + offset[OCB_BLOCK_SIZE - 1] &= 0xC0; + { + unsigned index; + unsigned byte_posn = bottom / 8; +#if OCB_BLOCK_SIZE == 16 + /* Standard OCB with a 128-bit block */ + unsigned char stretch[24]; + OCB_ENCRYPT_BLOCK(&(state->ks), stretch, offset); + memcpy(stretch + 16, stretch + 1, 8); + lw_xor_block(stretch + 16, stretch, 8); +#elif OCB_BLOCK_SIZE == 12 + /* 96-bit block handling from the Pyjamask specification */ + unsigned char stretch[20]; + OCB_ENCRYPT_BLOCK(&(state->ks), stretch, offset); + for (index = 0; index < 8; ++index) { + stretch[index + 12] = + (stretch[index + 1] << 1) | (stretch[index + 2] >> 7); + } + lw_xor_block(stretch + 12, stretch, 8); +#else + unsigned char stretch[OCB_BLOCK_SIZE + 8] = {0}; + #error "unsupported block size for OCB mode" +#endif + bottom %= 8; + if (bottom != 0) { + for (index = 0; index < OCB_BLOCK_SIZE; ++index) { + offset[index] = + (stretch[index + byte_posn] << bottom) | + (stretch[index + byte_posn + 1] >> (8 - bottom)); + } + } else { + memcpy(offset, stretch + byte_posn, OCB_BLOCK_SIZE); + } + } +} + +/* Calculate L_{ntz(i)} when the last two bits of i are zero */ +static void OCB_CONCAT(OCB_ALG_NAME,_calculate_L) + (OCB_STATE *state, unsigned char L[OCB_BLOCK_SIZE], unsigned long long i) +{ + OCB_DOUBLE_L(L, state->L1); + i >>= 2; + while ((i & 1) == 0) { + OCB_DOUBLE_L(L, L); + i >>= 1; + } +} + +/* Process associated data with OCB */ +static void OCB_CONCAT(OCB_ALG_NAME,_process_ad) + (OCB_STATE *state, unsigned char tag[OCB_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + + /* Process all full blocks */ + memset(offset, 0, sizeof(offset)); + block_number = 1; + while (adlen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state->L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state->L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block_2_src(block, offset, ad, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state->ks), block, block); + lw_xor_block(tag, block, OCB_BLOCK_SIZE); + ad += OCB_BLOCK_SIZE; + adlen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last partial block */ + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(offset, state->Lstar, OCB_BLOCK_SIZE); + lw_xor_block(offset, ad, temp); + offset[temp] ^= 0x80; + OCB_ENCRYPT_BLOCK(&(state->ks), block, offset); + lw_xor_block(tag, block, OCB_BLOCK_SIZE); + } +} + +int OCB_CONCAT(OCB_ALG_NAME,_aead_encrypt) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + OCB_STATE state; + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char sum[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + OCB_TAG_SIZE; + + /* Initialize the OCB state */ + OCB_CONCAT(OCB_ALG_NAME,_init)(&state, k, npub, offset); + + /* Process all plaintext blocks except the last */ + memset(sum, 0, sizeof(sum)); + block_number = 1; + while (mlen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state.L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state.L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(&state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block(sum, m, OCB_BLOCK_SIZE); + lw_xor_block_2_src(block, offset, m, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, block); + lw_xor_block_2_src(c, block, offset, OCB_BLOCK_SIZE); + c += OCB_BLOCK_SIZE; + m += OCB_BLOCK_SIZE; + mlen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last plaintext block */ + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + lw_xor_block(offset, state.Lstar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, offset); + lw_xor_block_2_src(c, block, m, temp); + c += temp; + } + + /* Finalize the encryption phase */ + lw_xor_block(sum, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, state.Ldollar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), sum, sum); + + /* Process the associated data and compute the final authentication tag */ + OCB_CONCAT(OCB_ALG_NAME,_process_ad)(&state, sum, ad, adlen); + memcpy(c, sum, OCB_TAG_SIZE); + return 0; +} + +int OCB_CONCAT(OCB_ALG_NAME,_aead_decrypt) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + OCB_STATE state; + unsigned char *mtemp = m; + unsigned char offset[OCB_BLOCK_SIZE]; + unsigned char sum[OCB_BLOCK_SIZE]; + unsigned char block[OCB_BLOCK_SIZE]; + unsigned long long block_number; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < OCB_TAG_SIZE) + return -1; + *mlen = clen - OCB_TAG_SIZE; + + /* Initialize the OCB state */ + OCB_CONCAT(OCB_ALG_NAME,_init)(&state, k, npub, offset); + + /* Process all ciphertext blocks except the last */ + memset(sum, 0, sizeof(sum)); + block_number = 1; + clen -= OCB_TAG_SIZE; + while (clen >= OCB_BLOCK_SIZE) { + if (block_number & 1) { + lw_xor_block(offset, state.L0, OCB_BLOCK_SIZE); + } else if ((block_number & 3) == 2) { + lw_xor_block(offset, state.L1, OCB_BLOCK_SIZE); + } else { + OCB_CONCAT(OCB_ALG_NAME,_calculate_L)(&state, block, block_number); + lw_xor_block(offset, block, OCB_BLOCK_SIZE); + } + lw_xor_block_2_src(block, offset, c, OCB_BLOCK_SIZE); + OCB_DECRYPT_BLOCK(&(state.ks), block, block); + lw_xor_block_2_src(m, block, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, m, OCB_BLOCK_SIZE); + c += OCB_BLOCK_SIZE; + m += OCB_BLOCK_SIZE; + clen -= OCB_BLOCK_SIZE; + ++block_number; + } + + /* Pad and process the last ciphertext block */ + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block(offset, state.Lstar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), block, offset); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + c += temp; + } + + /* Finalize the decryption phase */ + lw_xor_block(sum, offset, OCB_BLOCK_SIZE); + lw_xor_block(sum, state.Ldollar, OCB_BLOCK_SIZE); + OCB_ENCRYPT_BLOCK(&(state.ks), sum, sum); + + /* Process the associated data and check the final authentication tag */ + OCB_CONCAT(OCB_ALG_NAME,_process_ad)(&state, sum, ad, adlen); + return aead_check_tag(mtemp, *mlen, sum, c, OCB_TAG_SIZE); +} + +#endif /* OCB_ENCRYPT_BLOCK */ + +#endif /* LW_INTERNAL_OCB_H */ diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask-avr.S b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask-avr.S new file mode 100644 index 0000000..b7cc631 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask-avr.S @@ -0,0 +1,8883 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global pyjamask_96_setup_key + .type pyjamask_96_setup_key, @function +pyjamask_96_setup_key: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + mov r26,r1 +29: + movw r12,r18 + movw r14,r20 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,202 + mov r12,r27 + ldi r27,185 + mov r13,r27 + ldi r27,129 + mov r14,r27 + ldi r27,184 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,229 + ldi r25,220 + ldi r16,64 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,114 + ldi r25,110 + ldi r16,32 + ldi r17,174 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,57 + ldi r25,55 + ldi r16,16 + ldi r17,87 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,156 + ldi r25,27 + ldi r16,136 + ldi r17,171 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,206 + ldi r25,13 + ldi r16,196 + ldi r17,85 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,231 + ldi r25,6 + ldi r16,226 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,115 + ldi r25,3 + ldi r16,113 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,185 + ldi r25,129 + ldi r16,184 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,220 + ldi r25,64 + ldi r16,92 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,110 + ldi r25,32 + ldi r16,174 + ldi r17,114 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,55 + ldi r25,16 + ldi r16,87 + ldi r17,57 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,27 + ldi r25,136 + ldi r16,171 + ldi r17,156 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,13 + ldi r25,196 + ldi r16,85 + ldi r17,206 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,6 + ldi r25,226 + ldi r16,42 + ldi r17,231 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,3 + ldi r25,113 + ldi r16,149 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,129 + ldi r25,184 + ldi r16,202 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,92 + ldi r16,229 + ldi r17,220 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,32 + ldi r25,174 + ldi r16,114 + ldi r17,110 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,16 + ldi r25,87 + ldi r16,57 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,136 + ldi r25,171 + ldi r16,156 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,196 + ldi r25,85 + ldi r16,206 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,226 + ldi r25,42 + ldi r16,231 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,113 + ldi r25,149 + ldi r16,115 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,184 + ldi r25,202 + ldi r16,185 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,92 + ldi r25,229 + ldi r16,220 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,174 + ldi r25,114 + ldi r16,110 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,87 + ldi r25,57 + ldi r16,55 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,171 + ldi r25,156 + ldi r16,27 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,85 + ldi r25,206 + ldi r16,13 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,42 + ldi r25,231 + ldi r16,6 + ldi r17,226 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,149 + ldi r25,115 + ldi r16,3 + ldi r17,113 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + ldi r25,128 + eor r18,r25 + eor r18,r26 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + ldi r24,106 + eor r23,r24 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + lsl r4 + rol r5 + rol r6 + rol r7 + adc r4,r1 + ldi r17,63 + eor r6,r17 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + ldi r16,36 + eor r11,r16 + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + inc r26 + ldi r27,14 + cpse r26,r27 + rjmp 29b + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size pyjamask_96_setup_key, .-pyjamask_96_setup_key + + .text +.global pyjamask_96_encrypt + .type pyjamask_96_encrypt, @function +pyjamask_96_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 16 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ldi r26,14 +13: + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r18 + and r0,r22 + eor r4,r0 + mov r0,r19 + and r0,r23 + eor r5,r0 + mov r0,r20 + and r0,r2 + eor r6,r0 + mov r0,r21 + and r0,r3 + eor r7,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r4 + eor r22,r0 + mov r0,r19 + and r0,r5 + eor r23,r0 + mov r0,r20 + and r0,r6 + eor r2,r0 + mov r0,r21 + and r0,r7 + eor r3,r0 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + com r4 + com r5 + com r6 + com r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,133 + mov r8,r27 + ldi r27,16 + mov r9,r27 + ldi r27,134 + mov r10,r27 + ldi r27,163 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,8 + ldi r16,195 + ldi r17,209 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,132 + ldi r16,225 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,16 + ldi r25,194 + ldi r16,112 + ldi r17,180 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,8 + ldi r25,97 + ldi r16,56 + ldi r17,90 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,48 + ldi r16,28 + ldi r17,45 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,24 + ldi r16,142 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,12 + ldi r16,71 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,16 + ldi r25,134 + ldi r16,163 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,8 + ldi r25,195 + ldi r16,209 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,132 + ldi r25,225 + ldi r16,104 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,194 + ldi r25,112 + ldi r16,180 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,97 + ldi r25,56 + ldi r16,90 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,48 + ldi r25,28 + ldi r16,45 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,24 + ldi r25,142 + ldi r16,22 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,12 + ldi r25,71 + ldi r16,11 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,134 + ldi r25,163 + ldi r16,133 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,195 + ldi r25,209 + ldi r16,66 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,225 + ldi r25,104 + ldi r16,33 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,112 + ldi r25,180 + ldi r16,16 + ldi r17,194 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,56 + ldi r25,90 + ldi r16,8 + ldi r17,97 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,28 + ldi r25,45 + ldi r16,132 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,142 + ldi r25,22 + ldi r16,66 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,71 + ldi r25,11 + ldi r16,33 + ldi r17,12 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,163 + ldi r25,133 + ldi r16,16 + ldi r17,134 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,209 + ldi r25,66 + ldi r16,8 + ldi r17,195 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,104 + ldi r25,33 + ldi r16,132 + ldi r17,225 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,180 + ldi r25,16 + ldi r16,194 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,90 + ldi r25,8 + ldi r16,97 + ldi r17,56 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,45 + ldi r25,132 + ldi r16,48 + ldi r17,28 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,22 + ldi r25,66 + ldi r16,24 + ldi r17,142 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,11 + ldi r25,33 + ldi r16,12 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r18,r8 + movw r20,r10 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,33 + mov r8,r27 + ldi r27,112 + mov r9,r27 + ldi r27,65 + mov r10,r27 + ldi r27,99 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,16 + ldi r25,184 + ldi r16,160 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,8 + ldi r25,92 + ldi r16,208 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,4 + ldi r25,46 + ldi r16,104 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,2 + ldi r25,23 + ldi r16,52 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,129 + ldi r25,11 + ldi r16,26 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,192 + ldi r25,5 + ldi r16,141 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,224 + ldi r25,130 + ldi r16,198 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,112 + ldi r25,65 + ldi r16,99 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,184 + ldi r25,160 + ldi r16,177 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,92 + ldi r25,208 + ldi r16,88 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,46 + ldi r25,104 + ldi r16,44 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,23 + ldi r25,52 + ldi r16,22 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,11 + ldi r25,26 + ldi r16,11 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,5 + ldi r25,141 + ldi r16,133 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,130 + ldi r25,198 + ldi r16,66 + ldi r17,224 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,65 + ldi r25,99 + ldi r16,33 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,160 + ldi r25,177 + ldi r16,16 + ldi r17,184 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,208 + ldi r25,88 + ldi r16,8 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,104 + ldi r25,44 + ldi r16,4 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,52 + ldi r25,22 + ldi r16,2 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,26 + ldi r25,11 + ldi r16,129 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,141 + ldi r25,133 + ldi r16,192 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,198 + ldi r25,66 + ldi r16,224 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,99 + ldi r25,33 + ldi r16,112 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,177 + ldi r25,16 + ldi r16,184 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,88 + ldi r25,8 + ldi r16,92 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,44 + ldi r25,4 + ldi r16,46 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,22 + ldi r25,2 + ldi r16,23 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,11 + ldi r25,129 + ldi r16,11 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,133 + ldi r25,192 + ldi r16,5 + ldi r17,141 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,66 + ldi r25,224 + ldi r16,130 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r22,r8 + movw r2,r10 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,128 + mov r8,r27 + ldi r27,242 + mov r9,r27 + ldi r27,44 + mov r10,r27 + ldi r27,105 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,64 + ldi r25,121 + ldi r16,150 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,160 + ldi r25,60 + ldi r16,75 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,80 + ldi r25,158 + ldi r16,37 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,40 + ldi r25,207 + ldi r16,146 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,148 + ldi r25,103 + ldi r16,73 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,202 + ldi r25,179 + ldi r16,164 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,229 + ldi r25,89 + ldi r16,210 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,242 + ldi r25,44 + ldi r16,105 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,121 + ldi r25,150 + ldi r16,52 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,60 + ldi r25,75 + ldi r16,26 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,158 + ldi r25,37 + ldi r16,13 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,207 + ldi r25,146 + ldi r16,6 + ldi r17,40 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,103 + ldi r25,73 + ldi r16,3 + ldi r17,148 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,179 + ldi r25,164 + ldi r16,1 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,89 + ldi r25,210 + mov r16,r1 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,44 + ldi r25,105 + ldi r16,128 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,150 + ldi r25,52 + ldi r16,64 + ldi r17,121 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,75 + ldi r25,26 + ldi r16,160 + ldi r17,60 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,37 + ldi r25,13 + ldi r16,80 + ldi r17,158 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,146 + ldi r25,6 + ldi r16,40 + ldi r17,207 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,73 + ldi r25,3 + ldi r16,148 + ldi r17,103 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,164 + ldi r25,1 + ldi r16,202 + ldi r17,179 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,210 + mov r25,r1 + ldi r16,229 + ldi r17,89 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,105 + ldi r25,128 + ldi r16,242 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,52 + ldi r25,64 + ldi r16,121 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,26 + ldi r25,160 + ldi r16,60 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,13 + ldi r25,80 + ldi r16,158 + ldi r17,37 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,6 + ldi r25,40 + ldi r16,207 + ldi r17,146 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,3 + ldi r25,148 + ldi r16,103 + ldi r17,73 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,1 + ldi r25,202 + ldi r16,179 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + mov r24,r1 + ldi r25,229 + ldi r16,89 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r4,r8 + movw r6,r10 + dec r26 + breq 6545f + rjmp 13b +6545: + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r8,Z+ + ld r9,Z+ + ld r10,Z+ + ld r11,Z+ + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + pop r0 + pop r0 + pop r17 + pop r16 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_96_encrypt, .-pyjamask_96_encrypt + + .text +.global pyjamask_96_decrypt + .type pyjamask_96_decrypt, @function +pyjamask_96_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 16 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + subi r30,76 + sbci r31,255 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r4,r26 + eor r5,r27 + eor r6,r8 + eor r7,r9 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r22,r26 + eor r23,r27 + eor r2,r8 + eor r3,r9 + ld r9,-Z + ld r8,-Z + ld r27,-Z + ld r26,-Z + eor r18,r26 + eor r19,r27 + eor r20,r8 + eor r21,r9 + ldi r26,14 +39: + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,33 + mov r8,r27 + ldi r27,161 + mov r9,r27 + ldi r27,55 + mov r10,r27 + ldi r27,32 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,144 + ldi r25,208 + ldi r16,27 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,72 + ldi r25,232 + ldi r16,13 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,36 + ldi r25,244 + ldi r16,6 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,18 + ldi r25,122 + ldi r16,3 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,9 + ldi r25,189 + ldi r16,1 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,222 + ldi r16,128 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,111 + ldi r16,64 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,161 + ldi r25,55 + ldi r16,32 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,208 + ldi r25,27 + ldi r16,144 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,232 + ldi r25,13 + ldi r16,72 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,244 + ldi r25,6 + ldi r16,36 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,122 + ldi r25,3 + ldi r16,18 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,189 + ldi r25,1 + ldi r16,9 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,222 + ldi r25,128 + ldi r16,132 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,111 + ldi r25,64 + ldi r16,66 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,55 + ldi r25,32 + ldi r16,33 + ldi r17,161 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,27 + ldi r25,144 + ldi r16,144 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,13 + ldi r25,72 + ldi r16,72 + ldi r17,232 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,6 + ldi r25,36 + ldi r16,36 + ldi r17,244 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,3 + ldi r25,18 + ldi r16,18 + ldi r17,122 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,1 + ldi r25,9 + ldi r16,9 + ldi r17,189 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,128 + ldi r25,132 + ldi r16,132 + ldi r17,222 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,66 + ldi r16,66 + ldi r17,111 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,32 + ldi r25,33 + ldi r16,161 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,144 + ldi r25,144 + ldi r16,208 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,72 + ldi r25,72 + ldi r16,232 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,36 + ldi r25,36 + ldi r16,244 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,18 + ldi r25,18 + ldi r16,122 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,9 + ldi r25,9 + ldi r16,189 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,132 + ldi r25,132 + ldi r16,222 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,66 + ldi r25,66 + ldi r16,111 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r18,r8 + movw r20,r10 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,160 + mov r8,r27 + ldi r27,242 + mov r9,r27 + ldi r27,143 + mov r10,r27 + ldi r27,16 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,80 + ldi r25,249 + ldi r16,71 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,168 + ldi r25,252 + ldi r16,35 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,84 + ldi r25,254 + ldi r16,17 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,42 + ldi r25,255 + ldi r16,8 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,149 + ldi r25,127 + ldi r16,132 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,202 + ldi r25,63 + ldi r16,66 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,229 + ldi r25,31 + ldi r16,33 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,242 + ldi r25,143 + ldi r16,16 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,249 + ldi r25,71 + ldi r16,8 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,252 + ldi r25,35 + ldi r16,4 + ldi r17,168 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,254 + ldi r25,17 + ldi r16,2 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,255 + ldi r25,8 + ldi r16,1 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,127 + ldi r25,132 + mov r16,r1 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,63 + ldi r25,66 + ldi r16,128 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,31 + ldi r25,33 + ldi r16,64 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,143 + ldi r25,16 + ldi r16,160 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,71 + ldi r25,8 + ldi r16,80 + ldi r17,249 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,35 + ldi r25,4 + ldi r16,168 + ldi r17,252 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,17 + ldi r25,2 + ldi r16,84 + ldi r17,254 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,8 + ldi r25,1 + ldi r16,42 + ldi r17,255 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,132 + mov r25,r1 + ldi r16,149 + ldi r17,127 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,66 + ldi r25,128 + ldi r16,202 + ldi r17,63 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,33 + ldi r25,64 + ldi r16,229 + ldi r17,31 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,16 + ldi r25,160 + ldi r16,242 + ldi r17,143 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,8 + ldi r25,80 + ldi r16,249 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,4 + ldi r25,168 + ldi r16,252 + ldi r17,35 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,2 + ldi r25,84 + ldi r16,254 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,1 + ldi r25,42 + ldi r16,255 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + mov r24,r1 + ldi r25,149 + ldi r16,127 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,128 + ldi r25,202 + ldi r16,63 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,64 + ldi r25,229 + ldi r16,31 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r22,r8 + movw r2,r10 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,192 + mov r8,r27 + ldi r27,216 + mov r9,r27 + ldi r27,84 + mov r10,r27 + ldi r27,144 + mov r11,r27 + and r8,r0 + and r9,r0 + and r10,r0 + and r11,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,96 + ldi r25,108 + ldi r16,42 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,48 + ldi r25,54 + ldi r16,21 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,24 + ldi r25,155 + ldi r16,10 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,140 + ldi r25,77 + ldi r16,5 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,198 + ldi r25,166 + ldi r16,130 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,99 + ldi r25,83 + ldi r16,65 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,177 + ldi r25,169 + ldi r16,32 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,216 + ldi r25,84 + ldi r16,144 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,108 + ldi r25,42 + ldi r16,72 + ldi r17,96 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,54 + ldi r25,21 + ldi r16,36 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,155 + ldi r25,10 + ldi r16,18 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,77 + ldi r25,5 + ldi r16,9 + ldi r17,140 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,166 + ldi r25,130 + ldi r16,4 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,83 + ldi r25,65 + ldi r16,2 + ldi r17,99 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,169 + ldi r25,32 + ldi r16,129 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,84 + ldi r25,144 + ldi r16,192 + ldi r17,216 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,42 + ldi r25,72 + ldi r16,96 + ldi r17,108 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,21 + ldi r25,36 + ldi r16,48 + ldi r17,54 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,10 + ldi r25,18 + ldi r16,24 + ldi r17,155 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,5 + ldi r25,9 + ldi r16,140 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,130 + ldi r25,4 + ldi r16,198 + ldi r17,166 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,65 + ldi r25,2 + ldi r16,99 + ldi r17,83 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,32 + ldi r25,129 + ldi r16,177 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,144 + ldi r25,192 + ldi r16,216 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,72 + ldi r25,96 + ldi r16,108 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,36 + ldi r25,48 + ldi r16,54 + ldi r17,21 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,18 + ldi r25,24 + ldi r16,155 + ldi r17,10 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,9 + ldi r25,140 + ldi r16,77 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,4 + ldi r25,198 + ldi r16,166 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,2 + ldi r25,99 + ldi r16,83 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,129 + ldi r25,177 + ldi r16,169 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r8,r24 + eor r9,r25 + eor r10,r16 + eor r11,r17 + movw r4,r8 + movw r6,r10 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + com r4 + com r5 + com r6 + com r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r18 + and r0,r4 + eor r22,r0 + mov r0,r19 + and r0,r5 + eor r23,r0 + mov r0,r20 + and r0,r6 + eor r2,r0 + mov r0,r21 + and r0,r7 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r22 + eor r4,r0 + mov r0,r19 + and r0,r23 + eor r5,r0 + mov r0,r20 + and r0,r2 + eor r6,r0 + mov r0,r21 + and r0,r3 + eor r7,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + ld r11,-Z + ld r10,-Z + ld r9,-Z + ld r8,-Z + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + dec r26 + breq 6571f + rjmp 39b +6571: + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + pop r0 + pop r0 + pop r17 + pop r16 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_96_decrypt, .-pyjamask_96_decrypt + + .text +.global pyjamask_128_setup_key + .type pyjamask_128_setup_key, @function +pyjamask_128_setup_key: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r26,r1 +33: + movw r12,r18 + movw r14,r20 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r12,r4 + eor r13,r5 + eor r14,r6 + eor r15,r7 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,202 + mov r12,r27 + ldi r27,185 + mov r13,r27 + ldi r27,129 + mov r14,r27 + ldi r27,184 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,229 + ldi r25,220 + ldi r16,64 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,114 + ldi r25,110 + ldi r16,32 + ldi r17,174 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,57 + ldi r25,55 + ldi r16,16 + ldi r17,87 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,156 + ldi r25,27 + ldi r16,136 + ldi r17,171 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,206 + ldi r25,13 + ldi r16,196 + ldi r17,85 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,231 + ldi r25,6 + ldi r16,226 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,115 + ldi r25,3 + ldi r16,113 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,185 + ldi r25,129 + ldi r16,184 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,220 + ldi r25,64 + ldi r16,92 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,110 + ldi r25,32 + ldi r16,174 + ldi r17,114 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,55 + ldi r25,16 + ldi r16,87 + ldi r17,57 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,27 + ldi r25,136 + ldi r16,171 + ldi r17,156 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,13 + ldi r25,196 + ldi r16,85 + ldi r17,206 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,6 + ldi r25,226 + ldi r16,42 + ldi r17,231 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,3 + ldi r25,113 + ldi r16,149 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,129 + ldi r25,184 + ldi r16,202 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,92 + ldi r16,229 + ldi r17,220 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,32 + ldi r25,174 + ldi r16,114 + ldi r17,110 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,16 + ldi r25,87 + ldi r16,57 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,136 + ldi r25,171 + ldi r16,156 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,196 + ldi r25,85 + ldi r16,206 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,226 + ldi r25,42 + ldi r16,231 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,113 + ldi r25,149 + ldi r16,115 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,184 + ldi r25,202 + ldi r16,185 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,92 + ldi r25,229 + ldi r16,220 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,174 + ldi r25,114 + ldi r16,110 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,87 + ldi r25,57 + ldi r16,55 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,171 + ldi r25,156 + ldi r16,27 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,85 + ldi r25,206 + ldi r16,13 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,42 + ldi r25,231 + ldi r16,6 + ldi r17,226 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,149 + ldi r25,115 + ldi r16,3 + ldi r17,113 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + ldi r25,128 + eor r18,r25 + eor r18,r26 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + ldi r24,106 + eor r23,r24 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + lsl r4 + rol r5 + rol r6 + rol r7 + adc r4,r1 + ldi r17,63 + eor r6,r17 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + lsr r11 + ror r10 + ror r9 + ror r8 + ror r0 + or r11,r0 + ldi r16,36 + eor r11,r16 + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + inc r26 + ldi r27,14 + cpse r26,r27 + rjmp 33b + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size pyjamask_128_setup_key, .-pyjamask_128_setup_key + + .text +.global pyjamask_128_encrypt + .type pyjamask_128_encrypt, @function +pyjamask_128_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ldi r26,14 +17: + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + mov r0,r18 + and r0,r22 + eor r8,r0 + mov r0,r19 + and r0,r23 + eor r9,r0 + mov r0,r20 + and r0,r2 + eor r10,r0 + mov r0,r21 + and r0,r3 + eor r11,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r4 + and r0,r8 + eor r22,r0 + mov r0,r5 + and r0,r9 + eor r23,r0 + mov r0,r6 + and r0,r10 + eor r2,r0 + mov r0,r7 + and r0,r11 + eor r3,r0 + mov r0,r18 + and r0,r8 + eor r4,r0 + mov r0,r19 + and r0,r9 + eor r5,r0 + mov r0,r20 + and r0,r10 + eor r6,r0 + mov r0,r21 + and r0,r11 + eor r7,r0 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + com r8 + com r9 + com r10 + com r11 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,133 + mov r12,r27 + ldi r27,16 + mov r13,r27 + ldi r27,134 + mov r14,r27 + ldi r27,163 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,8 + ldi r16,195 + ldi r17,209 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,132 + ldi r16,225 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,16 + ldi r25,194 + ldi r16,112 + ldi r17,180 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,8 + ldi r25,97 + ldi r16,56 + ldi r17,90 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,48 + ldi r16,28 + ldi r17,45 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,24 + ldi r16,142 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,33 + ldi r25,12 + ldi r16,71 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,16 + ldi r25,134 + ldi r16,163 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,8 + ldi r25,195 + ldi r16,209 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,132 + ldi r25,225 + ldi r16,104 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,194 + ldi r25,112 + ldi r16,180 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,97 + ldi r25,56 + ldi r16,90 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,48 + ldi r25,28 + ldi r16,45 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,24 + ldi r25,142 + ldi r16,22 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,12 + ldi r25,71 + ldi r16,11 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,134 + ldi r25,163 + ldi r16,133 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,195 + ldi r25,209 + ldi r16,66 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,225 + ldi r25,104 + ldi r16,33 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,112 + ldi r25,180 + ldi r16,16 + ldi r17,194 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,56 + ldi r25,90 + ldi r16,8 + ldi r17,97 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,28 + ldi r25,45 + ldi r16,132 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,142 + ldi r25,22 + ldi r16,66 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,71 + ldi r25,11 + ldi r16,33 + ldi r17,12 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,163 + ldi r25,133 + ldi r16,16 + ldi r17,134 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,209 + ldi r25,66 + ldi r16,8 + ldi r17,195 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,104 + ldi r25,33 + ldi r16,132 + ldi r17,225 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,180 + ldi r25,16 + ldi r16,194 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,90 + ldi r25,8 + ldi r16,97 + ldi r17,56 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,45 + ldi r25,132 + ldi r16,48 + ldi r17,28 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,22 + ldi r25,66 + ldi r16,24 + ldi r17,142 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,11 + ldi r25,33 + ldi r16,12 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,33 + mov r12,r27 + ldi r27,112 + mov r13,r27 + ldi r27,65 + mov r14,r27 + ldi r27,99 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,16 + ldi r25,184 + ldi r16,160 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,8 + ldi r25,92 + ldi r16,208 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,4 + ldi r25,46 + ldi r16,104 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,2 + ldi r25,23 + ldi r16,52 + ldi r17,22 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,129 + ldi r25,11 + ldi r16,26 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,192 + ldi r25,5 + ldi r16,141 + ldi r17,133 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,224 + ldi r25,130 + ldi r16,198 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,112 + ldi r25,65 + ldi r16,99 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,184 + ldi r25,160 + ldi r16,177 + ldi r17,16 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,92 + ldi r25,208 + ldi r16,88 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,46 + ldi r25,104 + ldi r16,44 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,23 + ldi r25,52 + ldi r16,22 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,11 + ldi r25,26 + ldi r16,11 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,5 + ldi r25,141 + ldi r16,133 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,130 + ldi r25,198 + ldi r16,66 + ldi r17,224 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,65 + ldi r25,99 + ldi r16,33 + ldi r17,112 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,160 + ldi r25,177 + ldi r16,16 + ldi r17,184 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,208 + ldi r25,88 + ldi r16,8 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,104 + ldi r25,44 + ldi r16,4 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,52 + ldi r25,22 + ldi r16,2 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,26 + ldi r25,11 + ldi r16,129 + ldi r17,11 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,141 + ldi r25,133 + ldi r16,192 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,198 + ldi r25,66 + ldi r16,224 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,99 + ldi r25,33 + ldi r16,112 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,177 + ldi r25,16 + ldi r16,184 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,88 + ldi r25,8 + ldi r16,92 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,44 + ldi r25,4 + ldi r16,46 + ldi r17,104 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,22 + ldi r25,2 + ldi r16,23 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,11 + ldi r25,129 + ldi r16,11 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,133 + ldi r25,192 + ldi r16,5 + ldi r17,141 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,66 + ldi r25,224 + ldi r16,130 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r22,r12 + movw r2,r14 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,128 + mov r12,r27 + ldi r27,242 + mov r13,r27 + ldi r27,44 + mov r14,r27 + ldi r27,105 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,64 + ldi r25,121 + ldi r16,150 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,160 + ldi r25,60 + ldi r16,75 + ldi r17,26 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,80 + ldi r25,158 + ldi r16,37 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,40 + ldi r25,207 + ldi r16,146 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,148 + ldi r25,103 + ldi r16,73 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,202 + ldi r25,179 + ldi r16,164 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,229 + ldi r25,89 + ldi r16,210 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,242 + ldi r25,44 + ldi r16,105 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,121 + ldi r25,150 + ldi r16,52 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,60 + ldi r25,75 + ldi r16,26 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,158 + ldi r25,37 + ldi r16,13 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,207 + ldi r25,146 + ldi r16,6 + ldi r17,40 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,103 + ldi r25,73 + ldi r16,3 + ldi r17,148 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,179 + ldi r25,164 + ldi r16,1 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,89 + ldi r25,210 + mov r16,r1 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,44 + ldi r25,105 + ldi r16,128 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,150 + ldi r25,52 + ldi r16,64 + ldi r17,121 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,75 + ldi r25,26 + ldi r16,160 + ldi r17,60 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,37 + ldi r25,13 + ldi r16,80 + ldi r17,158 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,146 + ldi r25,6 + ldi r16,40 + ldi r17,207 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,73 + ldi r25,3 + ldi r16,148 + ldi r17,103 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,164 + ldi r25,1 + ldi r16,202 + ldi r17,179 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,210 + mov r25,r1 + ldi r16,229 + ldi r17,89 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,105 + ldi r25,128 + ldi r16,242 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,52 + ldi r25,64 + ldi r16,121 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,26 + ldi r25,160 + ldi r16,60 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,13 + ldi r25,80 + ldi r16,158 + ldi r17,37 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,6 + ldi r25,40 + ldi r16,207 + ldi r17,146 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,3 + ldi r25,148 + ldi r16,103 + ldi r17,73 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,1 + ldi r25,202 + ldi r16,179 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + mov r24,r1 + ldi r25,229 + ldi r16,89 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r4,r12 + movw r6,r14 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r27,19 + mov r12,r27 + ldi r27,72 + mov r13,r27 + ldi r27,165 + mov r14,r27 + ldi r27,72 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,9 + ldi r25,164 + ldi r16,82 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,4 + ldi r25,82 + ldi r16,41 + ldi r17,210 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,2 + ldi r25,169 + ldi r16,20 + ldi r17,105 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,129 + ldi r25,84 + ldi r16,138 + ldi r17,52 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,64 + ldi r25,42 + ldi r16,69 + ldi r17,154 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,32 + ldi r25,149 + ldi r16,34 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,144 + ldi r25,74 + ldi r16,145 + ldi r17,38 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,72 + ldi r25,165 + ldi r16,72 + ldi r17,19 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,164 + ldi r25,82 + ldi r16,164 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,82 + ldi r25,41 + ldi r16,210 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,169 + ldi r25,20 + ldi r16,105 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,84 + ldi r25,138 + ldi r16,52 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,42 + ldi r25,69 + ldi r16,154 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,149 + ldi r25,34 + ldi r16,77 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,74 + ldi r25,145 + ldi r16,38 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,165 + ldi r25,72 + ldi r16,19 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,82 + ldi r25,164 + ldi r16,9 + ldi r17,164 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,41 + ldi r25,210 + ldi r16,4 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,20 + ldi r25,105 + ldi r16,2 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,138 + ldi r25,52 + ldi r16,129 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,69 + ldi r25,154 + ldi r16,64 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,34 + ldi r25,77 + ldi r16,32 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,145 + ldi r25,38 + ldi r16,144 + ldi r17,74 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,72 + ldi r25,19 + ldi r16,72 + ldi r17,165 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,164 + ldi r25,9 + ldi r16,164 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,210 + ldi r25,4 + ldi r16,82 + ldi r17,41 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,105 + ldi r25,2 + ldi r16,169 + ldi r17,20 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,52 + ldi r25,129 + ldi r16,84 + ldi r17,138 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,154 + ldi r25,64 + ldi r16,42 + ldi r17,69 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,77 + ldi r25,32 + ldi r16,149 + ldi r17,34 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,38 + ldi r25,144 + ldi r16,74 + ldi r17,145 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r8,r12 + movw r10,r14 + dec r26 + breq 7055f + rjmp 17b +7055: + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r12,Z+ + ld r13,Z+ + ld r14,Z+ + ld r15,Z+ + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_128_encrypt, .-pyjamask_128_encrypt + + .text +.global pyjamask_128_decrypt + .type pyjamask_128_decrypt, @function +pyjamask_128_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 20 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + subi r30,16 + sbci r31,255 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r8,r26 + eor r9,r27 + eor r10,r12 + eor r11,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r4,r26 + eor r5,r27 + eor r6,r12 + eor r7,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r22,r26 + eor r23,r27 + eor r2,r12 + eor r3,r13 + ld r13,-Z + ld r12,-Z + ld r27,-Z + ld r26,-Z + eor r18,r26 + eor r19,r27 + eor r20,r12 + eor r21,r13 + ldi r26,14 +51: + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r27,33 + mov r12,r27 + ldi r27,161 + mov r13,r27 + ldi r27,55 + mov r14,r27 + ldi r27,32 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,144 + ldi r25,208 + ldi r16,27 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,72 + ldi r25,232 + ldi r16,13 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,36 + ldi r25,244 + ldi r16,6 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,18 + ldi r25,122 + ldi r16,3 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,9 + ldi r25,189 + ldi r16,1 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,132 + ldi r25,222 + ldi r16,128 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r21 + sbc r0,r1 + ldi r24,66 + ldi r25,111 + ldi r16,64 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,161 + ldi r25,55 + ldi r16,32 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,208 + ldi r25,27 + ldi r16,144 + ldi r17,144 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,232 + ldi r25,13 + ldi r16,72 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,244 + ldi r25,6 + ldi r16,36 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,122 + ldi r25,3 + ldi r16,18 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,189 + ldi r25,1 + ldi r16,9 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,222 + ldi r25,128 + ldi r16,132 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r20 + sbc r0,r1 + ldi r24,111 + ldi r25,64 + ldi r16,66 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,55 + ldi r25,32 + ldi r16,33 + ldi r17,161 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,27 + ldi r25,144 + ldi r16,144 + ldi r17,208 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,13 + ldi r25,72 + ldi r16,72 + ldi r17,232 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,6 + ldi r25,36 + ldi r16,36 + ldi r17,244 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,3 + ldi r25,18 + ldi r16,18 + ldi r17,122 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,1 + ldi r25,9 + ldi r16,9 + ldi r17,189 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,128 + ldi r25,132 + ldi r16,132 + ldi r17,222 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r19 + sbc r0,r1 + ldi r24,64 + ldi r25,66 + ldi r16,66 + ldi r17,111 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,32 + ldi r25,33 + ldi r16,161 + ldi r17,55 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,144 + ldi r25,144 + ldi r16,208 + ldi r17,27 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,72 + ldi r25,72 + ldi r16,232 + ldi r17,13 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,36 + ldi r25,36 + ldi r16,244 + ldi r17,6 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,18 + ldi r25,18 + ldi r16,122 + ldi r17,3 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,9 + ldi r25,9 + ldi r16,189 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,132 + ldi r25,132 + ldi r16,222 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r18 + sbc r0,r1 + ldi r24,66 + ldi r25,66 + ldi r16,111 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r18,r12 + movw r20,r14 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r27,160 + mov r12,r27 + ldi r27,242 + mov r13,r27 + ldi r27,143 + mov r14,r27 + ldi r27,16 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,80 + ldi r25,249 + ldi r16,71 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,168 + ldi r25,252 + ldi r16,35 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,84 + ldi r25,254 + ldi r16,17 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,42 + ldi r25,255 + ldi r16,8 + ldi r17,1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,149 + ldi r25,127 + ldi r16,132 + mov r17,r1 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,202 + ldi r25,63 + ldi r16,66 + ldi r17,128 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r3 + sbc r0,r1 + ldi r24,229 + ldi r25,31 + ldi r16,33 + ldi r17,64 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,242 + ldi r25,143 + ldi r16,16 + ldi r17,160 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,249 + ldi r25,71 + ldi r16,8 + ldi r17,80 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,252 + ldi r25,35 + ldi r16,4 + ldi r17,168 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,254 + ldi r25,17 + ldi r16,2 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,255 + ldi r25,8 + ldi r16,1 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,127 + ldi r25,132 + mov r16,r1 + ldi r17,149 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,63 + ldi r25,66 + ldi r16,128 + ldi r17,202 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r2 + sbc r0,r1 + ldi r24,31 + ldi r25,33 + ldi r16,64 + ldi r17,229 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,143 + ldi r25,16 + ldi r16,160 + ldi r17,242 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,71 + ldi r25,8 + ldi r16,80 + ldi r17,249 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,35 + ldi r25,4 + ldi r16,168 + ldi r17,252 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,17 + ldi r25,2 + ldi r16,84 + ldi r17,254 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,8 + ldi r25,1 + ldi r16,42 + ldi r17,255 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,132 + mov r25,r1 + ldi r16,149 + ldi r17,127 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,66 + ldi r25,128 + ldi r16,202 + ldi r17,63 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r23 + sbc r0,r1 + ldi r24,33 + ldi r25,64 + ldi r16,229 + ldi r17,31 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,16 + ldi r25,160 + ldi r16,242 + ldi r17,143 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,8 + ldi r25,80 + ldi r16,249 + ldi r17,71 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,4 + ldi r25,168 + ldi r16,252 + ldi r17,35 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,2 + ldi r25,84 + ldi r16,254 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,1 + ldi r25,42 + ldi r16,255 + ldi r17,8 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + mov r24,r1 + ldi r25,149 + ldi r16,127 + ldi r17,132 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,128 + ldi r25,202 + ldi r16,63 + ldi r17,66 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r22 + sbc r0,r1 + ldi r24,64 + ldi r25,229 + ldi r16,31 + ldi r17,33 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r22,r12 + movw r2,r14 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r27,192 + mov r12,r27 + ldi r27,216 + mov r13,r27 + ldi r27,84 + mov r14,r27 + ldi r27,144 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,96 + ldi r25,108 + ldi r16,42 + ldi r17,72 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,48 + ldi r25,54 + ldi r16,21 + ldi r17,36 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,24 + ldi r25,155 + ldi r16,10 + ldi r17,18 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,140 + ldi r25,77 + ldi r16,5 + ldi r17,9 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,198 + ldi r25,166 + ldi r16,130 + ldi r17,4 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,99 + ldi r25,83 + ldi r16,65 + ldi r17,2 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r7 + sbc r0,r1 + ldi r24,177 + ldi r25,169 + ldi r16,32 + ldi r17,129 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,216 + ldi r25,84 + ldi r16,144 + ldi r17,192 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,108 + ldi r25,42 + ldi r16,72 + ldi r17,96 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,54 + ldi r25,21 + ldi r16,36 + ldi r17,48 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,155 + ldi r25,10 + ldi r16,18 + ldi r17,24 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,77 + ldi r25,5 + ldi r16,9 + ldi r17,140 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,166 + ldi r25,130 + ldi r16,4 + ldi r17,198 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,83 + ldi r25,65 + ldi r16,2 + ldi r17,99 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r6 + sbc r0,r1 + ldi r24,169 + ldi r25,32 + ldi r16,129 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,84 + ldi r25,144 + ldi r16,192 + ldi r17,216 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,42 + ldi r25,72 + ldi r16,96 + ldi r17,108 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,21 + ldi r25,36 + ldi r16,48 + ldi r17,54 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,10 + ldi r25,18 + ldi r16,24 + ldi r17,155 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,5 + ldi r25,9 + ldi r16,140 + ldi r17,77 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,130 + ldi r25,4 + ldi r16,198 + ldi r17,166 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,65 + ldi r25,2 + ldi r16,99 + ldi r17,83 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r5 + sbc r0,r1 + ldi r24,32 + ldi r25,129 + ldi r16,177 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,144 + ldi r25,192 + ldi r16,216 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,72 + ldi r25,96 + ldi r16,108 + ldi r17,42 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,36 + ldi r25,48 + ldi r16,54 + ldi r17,21 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,18 + ldi r25,24 + ldi r16,155 + ldi r17,10 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,9 + ldi r25,140 + ldi r16,77 + ldi r17,5 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,4 + ldi r25,198 + ldi r16,166 + ldi r17,130 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,2 + ldi r25,99 + ldi r16,83 + ldi r17,65 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r4 + sbc r0,r1 + ldi r24,129 + ldi r25,177 + ldi r16,169 + ldi r17,32 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r4,r12 + movw r6,r14 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r27,23 + mov r12,r27 + ldi r27,177 + mov r13,r27 + ldi r27,84 + mov r14,r27 + ldi r27,51 + mov r15,r27 + and r12,r0 + and r13,r0 + and r14,r0 + and r15,r0 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,139 + ldi r25,88 + ldi r16,170 + ldi r17,153 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,69 + ldi r25,44 + ldi r16,213 + ldi r17,204 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,34 + ldi r25,150 + ldi r16,106 + ldi r17,230 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,17 + ldi r25,75 + ldi r16,53 + ldi r17,115 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,136 + ldi r25,165 + ldi r16,154 + ldi r17,185 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,196 + ldi r25,82 + ldi r16,205 + ldi r17,92 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r11 + sbc r0,r1 + ldi r24,98 + ldi r25,169 + ldi r16,102 + ldi r17,46 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,177 + ldi r25,84 + ldi r16,51 + ldi r17,23 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,88 + ldi r25,170 + ldi r16,153 + ldi r17,139 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,44 + ldi r25,213 + ldi r16,204 + ldi r17,69 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,150 + ldi r25,106 + ldi r16,230 + ldi r17,34 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,75 + ldi r25,53 + ldi r16,115 + ldi r17,17 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,165 + ldi r25,154 + ldi r16,185 + ldi r17,136 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,82 + ldi r25,205 + ldi r16,92 + ldi r17,196 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r10 + sbc r0,r1 + ldi r24,169 + ldi r25,102 + ldi r16,46 + ldi r17,98 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,84 + ldi r25,51 + ldi r16,23 + ldi r17,177 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,170 + ldi r25,153 + ldi r16,139 + ldi r17,88 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,213 + ldi r25,204 + ldi r16,69 + ldi r17,44 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,106 + ldi r25,230 + ldi r16,34 + ldi r17,150 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,53 + ldi r25,115 + ldi r16,17 + ldi r17,75 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,154 + ldi r25,185 + ldi r16,136 + ldi r17,165 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,205 + ldi r25,92 + ldi r16,196 + ldi r17,82 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r9 + sbc r0,r1 + ldi r24,102 + ldi r25,46 + ldi r16,98 + ldi r17,169 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,51 + ldi r25,23 + ldi r16,177 + ldi r17,84 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,153 + ldi r25,139 + ldi r16,88 + ldi r17,170 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,204 + ldi r25,69 + ldi r16,44 + ldi r17,213 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,230 + ldi r25,34 + ldi r16,150 + ldi r17,106 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,115 + ldi r25,17 + ldi r16,75 + ldi r17,53 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,185 + ldi r25,136 + ldi r16,165 + ldi r17,154 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,92 + ldi r25,196 + ldi r16,82 + ldi r17,205 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + mov r0,r1 + lsl r8 + sbc r0,r1 + ldi r24,46 + ldi r25,98 + ldi r16,169 + ldi r17,102 + and r24,r0 + and r25,r0 + and r16,r0 + and r17,r0 + eor r12,r24 + eor r13,r25 + eor r14,r16 + eor r15,r17 + movw r8,r12 + movw r10,r14 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + com r8 + com r9 + com r10 + com r11 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + mov r0,r18 + and r0,r8 + eor r4,r0 + mov r0,r19 + and r0,r9 + eor r5,r0 + mov r0,r20 + and r0,r10 + eor r6,r0 + mov r0,r21 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r8 + eor r22,r0 + mov r0,r5 + and r0,r9 + eor r23,r0 + mov r0,r6 + and r0,r10 + eor r2,r0 + mov r0,r7 + and r0,r11 + eor r3,r0 + mov r0,r22 + and r0,r4 + eor r18,r0 + mov r0,r23 + and r0,r5 + eor r19,r0 + mov r0,r2 + and r0,r6 + eor r20,r0 + mov r0,r3 + and r0,r7 + eor r21,r0 + mov r0,r18 + and r0,r22 + eor r8,r0 + mov r0,r19 + and r0,r23 + eor r9,r0 + mov r0,r20 + and r0,r2 + eor r10,r0 + mov r0,r21 + and r0,r3 + eor r11,r0 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ld r15,-Z + ld r14,-Z + ld r13,-Z + ld r12,-Z + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + dec r26 + breq 7089f + rjmp 51b +7089: + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r21 + st X+,r20 + st X+,r19 + st X+,r18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + pop r0 + pop r0 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size pyjamask_128_decrypt, .-pyjamask_128_decrypt + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.c b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.c new file mode 100644 index 0000000..3c40d2d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-pyjamask.h" +#include "internal-util.h" + +#if !defined(__AVR__) + +/** + * \brief Performs a circulant binary matrix multiplication. + * + * \param x The matrix. + * \param y The vector to multiply with the matrix. + * + * \return The vector result of multiplying x by y. + */ +STATIC_INLINE uint32_t pyjamask_matrix_multiply(uint32_t x, uint32_t y) +{ + uint32_t result = 0; + int bit; + for (bit = 31; bit >= 0; --bit) { +#if defined(ESP32) + /* This version has slightly better performance on ESP32 */ + y = leftRotate1(y); + result ^= x & -(y & 1); + x = rightRotate1(x); +#else + result ^= x & -((y >> bit) & 1); + x = rightRotate1(x); +#endif + } + return result; +} + +void pyjamask_128_setup_key + (pyjamask_128_key_schedule_t *ks, const unsigned char *key) +{ + uint32_t *rk = ks->k; + uint32_t k0, k1, k2, k3; + uint32_t temp; + uint8_t round; + + /* Load the words of the key */ + k0 = be_load_word32(key); + k1 = be_load_word32(key + 4); + k2 = be_load_word32(key + 8); + k3 = be_load_word32(key + 12); + + /* The first round key is the same as the key itself */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk[3] = k3; + rk += 4; + + /* Derive the round keys for all of the other rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 4) { + /* Mix the columns */ + temp = k0 ^ k1 ^ k2 ^ k3; + k0 ^= temp; + k1 ^= temp; + k2 ^= temp; + k3 ^= temp; + + /* Mix the rows and add the round constants. Note that the Pyjamask + * specification says that k1/k2/k3 should be rotated left by 8, 15, + * and 18 bits. But the reference code actually rotates the words + * right. And the test vectors in the specification match up with + * right rotations, not left. We match the reference code here */ + k0 = pyjamask_matrix_multiply(0xb881b9caU, k0) ^ 0x00000080U ^ round; + k1 = rightRotate8(k1) ^ 0x00006a00U; + k2 = rightRotate15(k2) ^ 0x003f0000U; + k3 = rightRotate18(k3) ^ 0x24000000U; + + /* Write the round key to the schedule */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk[3] = k3; + } +} + +void pyjamask_96_setup_key + (pyjamask_96_key_schedule_t *ks, const unsigned char *key) +{ + uint32_t *rk = ks->k; + uint32_t k0, k1, k2, k3; + uint32_t temp; + uint8_t round; + + /* Load the words of the key */ + k0 = be_load_word32(key); + k1 = be_load_word32(key + 4); + k2 = be_load_word32(key + 8); + k3 = be_load_word32(key + 12); + + /* The first round key is the same as the key itself */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + rk += 3; + + /* Derive the round keys for all of the other rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 3) { + /* Mix the columns */ + temp = k0 ^ k1 ^ k2 ^ k3; + k0 ^= temp; + k1 ^= temp; + k2 ^= temp; + k3 ^= temp; + + /* Mix the rows and add the round constants. Note that the Pyjamask + * specification says that k1/k2/k3 should be rotated left by 8, 15, + * and 18 bits. But the reference code actually rotates the words + * right. And the test vectors in the specification match up with + * right rotations, not left. We match the reference code here */ + k0 = pyjamask_matrix_multiply(0xb881b9caU, k0) ^ 0x00000080U ^ round; + k1 = rightRotate8(k1) ^ 0x00006a00U; + k2 = rightRotate15(k2) ^ 0x003f0000U; + k3 = rightRotate18(k3) ^ 0x24000000U; + + /* Write the round key to the schedule */ + rk[0] = k0; + rk[1] = k1; + rk[2] = k2; + } +} + +void pyjamask_128_encrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k; + uint32_t s0, s1, s2, s3; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 4) { + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + + /* Apply the 128-bit Pyjamask sbox */ + s0 ^= s3; + s3 ^= s0 & s1; + s0 ^= s1 & s2; + s1 ^= s2 & s3; + s2 ^= s0 & s3; + s2 ^= s1; + s1 ^= s0; + s3 = ~s3; + s2 ^= s3; + s3 ^= s2; + s2 ^= s3; + + /* Mix the rows of the state */ + s0 = pyjamask_matrix_multiply(0xa3861085U, s0); + s1 = pyjamask_matrix_multiply(0x63417021U, s1); + s2 = pyjamask_matrix_multiply(0x692cf280U, s2); + s3 = pyjamask_matrix_multiply(0x48a54813U, s3); + } + + /* Mix in the key one last time */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void pyjamask_128_decrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k + 4 * PYJAMASK_ROUNDS; + uint32_t s0, s1, s2, s3; + uint8_t round; + + /* Load the ciphertext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Mix in the last round key */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + rk -= 4; + + /* Perform all decryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk -= 4) { + /* Inverse mix of the rows in the state */ + s0 = pyjamask_matrix_multiply(0x2037a121U, s0); + s1 = pyjamask_matrix_multiply(0x108ff2a0U, s1); + s2 = pyjamask_matrix_multiply(0x9054d8c0U, s2); + s3 = pyjamask_matrix_multiply(0x3354b117U, s3); + + /* Apply the inverse of the 128-bit Pyjamask sbox */ + s2 ^= s3; + s3 ^= s2; + s2 ^= s3; + s3 = ~s3; + s1 ^= s0; + s2 ^= s1; + s2 ^= s0 & s3; + s1 ^= s2 & s3; + s0 ^= s1 & s2; + s3 ^= s0 & s1; + s0 ^= s3; + + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + } + + /* Write the plaintext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void pyjamask_96_encrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k; + uint32_t s0, s1, s2; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk += 3) { + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + + /* Apply the 96-bit Pyjamask sbox */ + s0 ^= s1; + s1 ^= s2; + s2 ^= s0 & s1; + s0 ^= s1 & s2; + s1 ^= s0 & s2; + s2 ^= s0; + s2 = ~s2; + s1 ^= s0; + s0 ^= s1; + + /* Mix the rows of the state */ + s0 = pyjamask_matrix_multiply(0xa3861085U, s0); + s1 = pyjamask_matrix_multiply(0x63417021U, s1); + s2 = pyjamask_matrix_multiply(0x692cf280U, s2); + } + + /* Mix in the key one last time */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); +} + +void pyjamask_96_decrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + const uint32_t *rk = ks->k + 3 * PYJAMASK_ROUNDS; + uint32_t s0, s1, s2; + uint8_t round; + + /* Load the plaintext from the input buffer */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + + /* Mix in the last round key */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + rk -= 3; + + /* Perform all encryption rounds */ + for (round = 0; round < PYJAMASK_ROUNDS; ++round, rk -= 3) { + /* Inverse mix of the rows in the state */ + s0 = pyjamask_matrix_multiply(0x2037a121U, s0); + s1 = pyjamask_matrix_multiply(0x108ff2a0U, s1); + s2 = pyjamask_matrix_multiply(0x9054d8c0U, s2); + + /* Apply the inverse of the 96-bit Pyjamask sbox */ + s0 ^= s1; + s1 ^= s0; + s2 = ~s2; + s2 ^= s0; + s1 ^= s0 & s2; + s0 ^= s1 & s2; + s2 ^= s0 & s1; + s1 ^= s2; + s0 ^= s1; + + /* Add the round key to the state */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + } + + /* Write the ciphertext to the output buffer */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); +} + +#endif /* !__AVR__ */ diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.h new file mode 100644 index 0000000..3ead7fb --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-pyjamask.h @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_PYJAMASK_H +#define LW_INTERNAL_PYJAMASK_H + +#include "internal-util.h" + +/** + * \file internal-pyjamask.h + * \brief Pyjamask block cipher. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Number of rounds in the Pyjamask block cipher. + */ +#define PYJAMASK_ROUNDS 14 + +/** + * \brief Number of parallel states for masked operation. + */ +#define PYJAMASK_MASKING_ORDER 4 + +/** + * \brief Structure of the key schedule for the Pyjamask-128 block cipher. + */ +typedef struct +{ + uint32_t k[(PYJAMASK_ROUNDS + 1) * 4]; /**< Words of the key schedule */ + +} pyjamask_128_key_schedule_t; + +/** + * \brief Structure of the key schedule for the Pyjamask-96 block cipher. + */ +typedef struct +{ + uint32_t k[(PYJAMASK_ROUNDS + 1) * 3]; /**< Words of the key schedule */ + +} pyjamask_96_key_schedule_t; + +/** + * \brief Structure of the key schedule for masked Pyjamask-128. + */ +typedef struct +{ + /** Words of the key schedule */ + uint32_t k[PYJAMASK_MASKING_ORDER * (PYJAMASK_ROUNDS + 1) * 4]; + +} pyjamask_masked_128_key_schedule_t; + +/** + * \brief Structure of the key schedule for masked Pyjamask-96. + */ +typedef struct +{ + /** Words of the key schedule */ + uint32_t k[PYJAMASK_MASKING_ORDER * (PYJAMASK_ROUNDS + 1) * 3]; + +} pyjamask_masked_96_key_schedule_t; + +/** + * \brief Sets up the key schedule for the Pyjamask-128 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_128_setup_key + (pyjamask_128_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Sets up the key schedule for the Pyjamask-96 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_96_setup_key + (pyjamask_96_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with Pyjamask-128. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_128_decrypt() + */ +void pyjamask_128_encrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with Pyjamask-128. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_128_encrypt() + */ +void pyjamask_128_decrypt + (const pyjamask_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 96-bit block with Pyjamask-96. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_96_decrypt() + */ +void pyjamask_96_encrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 96-bit block with Pyjamask-96. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_96_encrypt() + */ +void pyjamask_96_decrypt + (const pyjamask_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Sets up the key schedule for the masked Pyjamask-128 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_masked_128_setup_key + (pyjamask_masked_128_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Sets up the key schedule for the masked Pyjamask-96 block cipher. + * + * \param ks The key schedule on output. + * \param key The 16 bytes of the key on input. + */ +void pyjamask_masked_96_setup_key + (pyjamask_masked_96_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with Pyjamask-128 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_masked_128_decrypt() + */ +void pyjamask_masked_128_encrypt + (const pyjamask_masked_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with Pyjamask-128 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_masked_128_encrypt() + */ +void pyjamask_masked_128_decrypt + (const pyjamask_masked_128_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 96-bit block with Pyjamask-96 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * \sa pyjamask_masked_96_decrypt() + */ +void pyjamask_masked_96_encrypt + (const pyjamask_masked_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 96-bit block with Pyjamask-96 in masked mode. + * + * \param ks Points to the key schedule. + * \param output Output buffer which must be at least 12 bytes in length. + * \param input Input buffer which must be at least 12 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + * + * \sa pyjamask_masked_96_encrypt() + */ +void pyjamask_masked_96_decrypt + (const pyjamask_masked_96_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-util.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask-96.c b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask-96.c new file mode 100644 index 0000000..37f508d --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask-96.c @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "pyjamask.h" +#include "internal-pyjamask.h" + +aead_cipher_t const pyjamask_96_cipher = { + "Pyjamask-96-AEAD", + PYJAMASK_96_KEY_SIZE, + PYJAMASK_96_NONCE_SIZE, + PYJAMASK_96_TAG_SIZE, + AEAD_FLAG_NONE, + pyjamask_96_aead_encrypt, + pyjamask_96_aead_decrypt +}; + +#define OCB_ALG_NAME pyjamask_96 +#define OCB_BLOCK_SIZE 12 +#define OCB_NONCE_SIZE PYJAMASK_96_NONCE_SIZE +#define OCB_TAG_SIZE PYJAMASK_96_TAG_SIZE +#define OCB_KEY_SCHEDULE pyjamask_96_key_schedule_t +#define OCB_SETUP_KEY pyjamask_96_setup_key +#define OCB_ENCRYPT_BLOCK pyjamask_96_encrypt +#define OCB_DECRYPT_BLOCK pyjamask_96_decrypt +#include "internal-ocb.h" diff --git a/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask.h b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask.h new file mode 100644 index 0000000..23ec744 --- /dev/null +++ b/pyjamask/Implementations/crypto_aead/pyjamask96aeadv1/rhys-avr/pyjamask.h @@ -0,0 +1,335 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_PYJAMASK_H +#define LWCRYPTO_PYJAMASK_H + +#include "aead-common.h" + +/** + * \file pyjamask.h + * \brief Pyjamask authenticated encryption algorithm. + * + * Pyjamask AEAD is a family of authenticated encryption algorithms that are + * built around the Pyjamask-128 and Pyjamask-96 block ciphers in OCB mode. + * Pyjamask-128-AEAD has a 128-bit key, a 96-bit nonce, and a 128-bit + * authentication tag. Pyjamask-96-AEAD has a 128-bit key, a 64-bit nonce, + * and a 96-bit authentication tag. + * + * References: https://pyjamask-cipher.github.io/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Pyjamask-128-AEAD. + */ +#define PYJAMASK_128_NONCE_SIZE 12 + +/** + * \brief Size of the key for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_TAG_SIZE 12 + +/** + * \brief Size of the nonce for Pyjamask-96-AEAD. + */ +#define PYJAMASK_96_NONCE_SIZE 8 + +/** + * \brief Meta-information block for the Pyjamask-128-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_128_cipher; + +/** + * \brief Meta-information block for the Pyjamask-96-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_96_cipher; + +/** + * \brief Meta-information block for the masked Pyjamask-128-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_masked_128_cipher; + +/** + * \brief Meta-information block for the masked Pyjamask-96-AEAD cipher. + */ +extern aead_cipher_t const pyjamask_masked_96_cipher; + +/** + * \brief Encrypts and authenticates a packet with Pyjamask-128-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_128_aead_decrypt() + */ +int pyjamask_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Pyjamask-128-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_128_aead_encrypt() + */ +int pyjamask_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Pyjamask-96-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_96_aead_decrypt() + */ +int pyjamask_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Pyjamask-96-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_96_aead_encrypt() + */ +int pyjamask_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with masked Pyjamask-128-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_masked_128_aead_decrypt() + */ +int pyjamask_masked_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with masked Pyjamask-128-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_masked_128_aead_encrypt() + */ +int pyjamask_masked_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with masked Pyjamask-96-AEAD. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 12 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa pyjamask_masked_96_aead_decrypt() + */ +int pyjamask_masked_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with masked Pyjamask-96-AEAD. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 12 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa pyjamask_masked_96_aead_encrypt() + */ +int pyjamask_masked_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/LWC_AEAD_KAT_128_128.txt b/romulus/Implementations/crypto_aead/romulusm1v1/LWC_AEAD_KAT_128_128.txt new file mode 100644 index 0000000..dc9755c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/LWC_AEAD_KAT_128_128.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = +CT = C96F00B90B047ABC5EB6EC0F15BC43CF + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00 +CT = 9A4B3E4DB525820A3E8FB2DECB430A17 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001 +CT = FDE62DF05BAC7F8B8F0DF728A8362FB0 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102 +CT = 616BC725C3CD253A8D13C28A803256CC + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203 +CT = 63D305F723F44956409BB12477FCC0F4 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304 +CT = 8ABA74E3D2984495FC5E117B19368951 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405 +CT = DCEE5F849E99298AF5A8B958D2958346 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506 +CT = 33BE7EE65428D5EAFB583112D1D9A8B0 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304050607 +CT = C26FA7855B1308EA58ED8D8AC7F8DD81 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708 +CT = DF30EE37151E9424D054F3C3A1B2F2BE + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506070809 +CT = 6C1EA04E5A5F5311CAF55E0382D5F943 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A +CT = D1DACB46342AA1C4324D97026EBF50E2 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B +CT = D6621ABD2D11908BB2A78216135C1310 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C +CT = 3C2E3B663B7971C46880158A01A719EF + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D +CT = 336286D2347DBA5947BD76DBB9401244 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 0FBD389ABF97B7AA8BB16EB84F51830D + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 9D239BAC04A370CA5196D94B2F9DE8F6 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A66383F2C8447D288611B24D610F796E + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DB7882042686BBF608C625327809E1D1 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C8A2FDF9C808E609370C080726DCFBFC + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 014383A8876B66990D5406AC5E853A4C + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2541B2F43B9362D0519D5631208CFC96 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3F46CE6449F7C2DE697215FA443620DD + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B338A31B1D5CF458B211C20375550B59 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8F1DB8B8BCC291FA105B6BF3859F0793 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9ADBE9A75294B1F1B93775EE089F17BB + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 94338B82DCD560E0BE516AD2FF583295 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 99ADD0B128B25C0BD2455D8B01976055 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E43FEEE48C4121FD0FFD0FDAD5350708 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D41256AEE7EEF93AE28A062302E02F8B + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DF1CBB784F32BFA1787F004B0D837BEE + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F4115577312B06F60A8816DE47FBEBDB + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E95EE3E14DBF3C684433EE1ED971FF07 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = +CT = 691D79158D739AD24A74EF427B9C771D2A + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00 +CT = 57DE8B2CBF781D9189A621A6C6B93390B8 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001 +CT = B5D44DCEB08896613F7B3EC8F70C930C1B + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102 +CT = 13A8A9E9D79FF477540A8C082D7A296CAE + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203 +CT = 08B9C7A4DDF8FB7A6F1F92BDD97BA9010C + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304 +CT = 4CD7237641242D0EF2885E1823101451C8 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405 +CT = 6F43046732289A84C27B26B698DBC68C34 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506 +CT = 9F4CB7B8624C3C847C57C3BE4799C8D1B0 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304050607 +CT = D6DE596AFE8EE94E5FF58F8E414C208D2B + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708 +CT = FC6648E76C747134CC735572787833E2A7 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506070809 +CT = F99E65A1C010553B85CF9CAE016411F33C + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A +CT = D0E7684679FC94CA4A85C06DF89F98C179 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B +CT = AA80F62D99B9518DF0253A078322A3C823 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C +CT = 8BB3A24084641F9AE744B13EE1E35F2241 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = D195133399C40009F23FFAFAEC88638D27 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = D85935B082494416AEA7D58F81ADEFF6D9 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0AFC5AB987F6916D255ACFDE26D0BB1FBD + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5C4C6FC39FC96868FD02D364E18C38F671 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F3003ED2B425E99E59E58F89A00FC4E91B + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6AE2FD15A20A9C7061E92B0E3E47A4705F + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4A7804CD959848297BEE90E11F7C4DDB2F + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 39F252498080336AE083BE7B81471317D7 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6B98FD77C2A7CA6B864A04DD0E73E2A1B1 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 04C00CB28C6B5595293767D9D73B9C38EE + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9E1A5C1991537E37C94271DB40A88271A4 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 737F3B8AF7C14B51A44BCF59256B6D167E + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4A35081F6241A5FEC6BF16C49C0D5711DB + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3507CCCFF975437173D69080CF454E2012 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = CB2C35BED467C0A47B2B79F4FE86D7DDAA + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C30287FF6C70678534918DA08D4B2644C1 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D570256A610C264767D8688EDAC0E07752 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 3AAF3AE6FFEA74374942BD0C74E65E65E9 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2D69E79E1F555B393724A8C631DA257AEF + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = +CT = 6BF154A33F708E421529C751871B216B2825 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00 +CT = 696DAA45B4E9953178F9C03FAEA541904137 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001 +CT = F32D7ADC8DF811AE19BE70C33484A705571C + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102 +CT = 22E19904FC36821F98B4189AAE751713DDD5 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203 +CT = E9EA346FCC4F5A57045BBE9B342C6092DACC + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304 +CT = AB2BC72DAC71B50DB35D82AEA3BC370A7EE9 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405 +CT = F8966632C3872043F5A50E93616D87204EC5 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506 +CT = 6084248DBFC957396591F4E4967EE6554246 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304050607 +CT = 78582279EA098B68DBA4F435D751923F8142 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708 +CT = 389BDF17160A00035A21A9018E279E4CE3A0 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506070809 +CT = FA86439E8EC48171B5553C043B7404C202C6 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A +CT = 5362C9C38D4AFA39B1C460EC604BEDE6D6B4 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B +CT = B21FDECF6B7CBF09267B6CB251C83C60878D + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C +CT = A2C5C635681D42F0ECCB84D75807FEAA5E03 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 87BD7581A5F9C3538EA8CA974F9C71ED1CC5 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 22DCF2E0EDC38B4583CFB7CE193E50D9D82B + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = E313F5E4A257A0613B73CB30384799186914 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 168BD3424DA7C7607E21CAD3AFA5EE601A72 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7C0ED55E620FE41431E53D5F123A63772CDE + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = EBB65F57EB175248A1A358DFACF6C72866D5 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = AE59C5FFF2804A9D771D5F3A1971C96D08CC + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 75CB7390C1BEAB8E14A9E2078656763D8315 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4BA9A32074E87426C3A1E8778033FB7D98D6 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = ABD74D0B1CEC1BAC3D8F68C820B6BFD5FAC3 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3922B7D028D127210B515BA4526A15EEF7AE + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B3229E10230ED19E3115D8AAB2C2FF26C874 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 01D5714473278DEF57D15935DFB3B3FE7876 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A337944BA5A7CAA09FEF5E179BA3E2061E45 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 15E12F8205E6BD1CFC7A032D507DE132F889 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0F040999CF16A02720BB75F1526A5CC419E6 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 536E270591A2B18516795B517F56EC713697 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 90E8833F25912DB60CAF3E9764715AAAE4C9 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 879FBF60C185BBFE90853C81325F21182B60 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = +CT = DDB582B57A3577A876B2766C97590136C83BAB + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00 +CT = 825D560C794684C2E255A8EDF03AC13D604E6B + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001 +CT = 43FC5E05814BFA2CF5F1F03DCFD170BBB6E592 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102 +CT = F7D5C0A3BC05FE176F4CE055F23065822976FE + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203 +CT = FC33EB148FCEE7678DBB172FD358692310EBA6 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304 +CT = 88B692D8E729F302F336DC454B7C3C9D8718E0 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405 +CT = CA7B86C98164E9DD0D728D8237080A36B856A9 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506 +CT = 352EE404EE69AEBDBC2521BFCC9603AC064F62 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304050607 +CT = 2CC186B34A99170CC4C1AC132481979706A542 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708 +CT = 7549A468F7C000D3B99BDD89281CFAF52FE38E + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506070809 +CT = 6C02C03116E1F0DEE0FC5640122A4E8FB2C12C + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A +CT = 7955239C25D6238FA1BB98C5D4C7E92C36896D + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B +CT = A76AB94EC0202CCD49E60750C253924A2F3B88 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 60EA7E28735A380499BF96F222E2B1CB3862A9 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = E8659015B8FD0B27A230F3A9D3E5D0845CF661 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = C41E8FEA5072744AE28BEF2DF69DA618236D24 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7473993FF6374FDEA46455E86C7E4445BB1224 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 01807D575B1FB8F37E06164B797D403B502E3A + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7A05166EFECDB16EB9F29A29D5E94699772EAF + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 31DE9E74F6C94837674A78F99187A1C491AA8C + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 71D513C818BCB7DD05F8A4DF5A1C04EF4C8A96 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F38604BE39C4E90FDCD64A591DCDBFBCA2B0CD + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4FD79040A1DAFBDB7DC37B448E054F49DB0CE4 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8782867EF352B07C3666A36C3E85BB76ED7F73 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F3770FB618A261E198F1575BAFE22D708B178B + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7103019CD4CA7F098BD6A481DDF28CDDCF3B7B + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7789A9A4A01C494EC4742B3775F4D63094C6BA + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 112D0D190317BA7B3F21F4CEE24B1DCF32E0E0 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = C4A4B648393B3851217B84D3402A549C00C1ED + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 21841E79F59D58F97EE17F9241EA846EC2BF02 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 612D39456C0A8E44CE5390D17D0C8D10E0754F + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 04809FCEFE4235BE63D882F877A71AB27514A2 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D9F98134BC3027D432B3A10BC925CEA785F3D4 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = +CT = 4052A44120FD66ED59DACF9F2D5A492FC395A5D9 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00 +CT = B6B62EADA547AD8F3785EA25368FA0ECA0E6DA95 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001 +CT = 65F2AD866FA9DD06EEE6A062FA4C4F65B736592D + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102 +CT = E0B6AEB7D6F6CD47835F7BA0F4732045B43997D0 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203 +CT = 70821BED5D7B290F081101AC8C73BADAB308F8E9 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304 +CT = 1CFAB8C559556AC42C1CCA285DFAA12D2FA9B17D + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405 +CT = 3B34BD0F883DE083FAFD88C92890E93E84B30F65 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506 +CT = 71BB4971A148769B5AF2EB077660F906B922399E + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304050607 +CT = 35BA3E8ABAA0952F17357E5FEDCA907C24754BC5 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708 +CT = 6FE59A9742DC88E51060F0DB16FF999A5CA14F50 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506070809 +CT = 0CB0AD34DEDAF63935EAAEDD882B0404CEC3A22C + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A +CT = 8D45DCBDD737B6038C7E5CDAF5F9F794409E892E + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B +CT = C0408E2CFE57A31B56EE940CED5D8F0EC83F4BDD + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = F301063BA24577184E70EB5AF96B2DE0CF8FF998 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = AD939252BB86009E82CD37828DDFCEF5229BAE53 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 95EE1A61B7F17432F694DEAEC784322D9EEE0A8D + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 41D85E6894F4E3D4910D717A291EF51DB70FB3A9 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 36674386D450FAE8F04172B5C03E6680754B828E + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6748AA8ECAA5D1A4115BBCB4FFA440605CC44467 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C3991E5AD6862BC947B006A17EBE7717C14B6035 + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DE24B009AE8F32BD51C841A2D648323A1FA932B1 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3C342A457E9F75B09CF99C00F41A9270E30DF9C2 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 67AE248FDEE52D38599690ABB139F1D6A64A89D5 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8C5DF684E423EF78C81085CDEF74B33270E87179 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C989BDB9533AEE746CEA375A5C4A29E9878E745C + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 05ECAA004CF00169A52375BD37F90886EB2E52E0 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 590A4026B6F0BA2960E93DBD5DB48986185BEEB3 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9184D3983998DD7EB1B448E79714916B2962C304 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8B5A00549B71D0A479CCD28C645EA08D833E430C + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6016BD3A67707C7649A0A51BAE93509B3C6C8CB5 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 82351297F955EBAB844C0C8D762B0BDAB5EC27D9 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 295A1EC209A99A77F9624A226E56BC205F856FFF + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E5180447FD41C0A2144E85177427AAC04B9677A6 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = +CT = 6573E8C8F2123AA1C1043B6598AAC22119AB9EC040 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00 +CT = 7D4430EB1F5EDB1F98F549B637B76A70B604F55B8F + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001 +CT = 1EA7FC180F1FAC552A5C9BA72D8D4FFDBE7F264224 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102 +CT = 4A4FB4EC4481B720D651C8F40C67D925FEEFCC610F + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203 +CT = 073F3ABA591F3E14B35412B09A93C5E26B4945A11E + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304 +CT = EB13C6B388A1E6BC9E907B2EF9F00B8EDCA4671ED9 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405 +CT = E62E0D6431BD1BE57D2DD2031DF36071FF7F4C1CAE + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506 +CT = AA4099E5D480BC26021E7D416AB99F59E80173A276 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304050607 +CT = 897B8E5DF1E3DF41BD15B79935B50A2678B02FBE42 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708 +CT = CB205C481C4B5AC27F3F3032C1A899136EA85FAE09 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506070809 +CT = BEF4C88D8EF3BE19DA8AF050BA2C581E6D17DB4D47 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A +CT = 42AC22694CD242CF4B3D8775E99B66F6C138132091 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 58BDFD0D1854D54CEDF2A9651255C396E8144804A2 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = DDA81596C3E86E11ADEE7FF1159B00FD32B5605D47 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = CB1570C431E22931183E88479B807EE1C8B8EF4343 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 19DEF9EDF98381AFEA2FD50323D46A5CFF4A736EDA + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 679DF3C5E24CFA00CF895730985656E21E824A20CC + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 499F9FA020A318C4ED3E18A6A4CFBA86F1E7BEA901 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 4F9094A8E5038AC19E124949F74503880BE0997C59 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = EF5F2375F045B01E7EC8FA9DB686B798AD54864BB8 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D67CB7DDBA75A70806516179C7DF17D491624F970A + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 6D32B5A195E8E5424C22A1D0F74E97FBA8073D43FD + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F9DB7F8C4E60C9E3CB3A3179CE934E18BFDD1B16BF + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 003BF3BAFC4D01F025E72DA0BB4AA1661C486D10F2 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5BC5A852D62FA1B1EEE33CE436943F163B8FE23DB2 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3C7F3B77C64E8FE370F00103DF0291E9FEA7C9BBF7 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A3AB300242A0CFDD791EC02431EE9E48AF8F78BEE9 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = E0F218DFB892FDF4FBD3860EABEF9605B7B128EA67 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9997153DB72D3A0D5C9231911CE88B42C02C56B2A7 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2EBEA22D72D37388BBF16AB004AC4B9CA360A8E588 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 63B0482149FD9F159978006E2A969185BB1D9A3050 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C0F3F430764504BD9ECF217543DDFB5F6862711C76 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E292F15870CFFC52540BC4575ECA18EF7841DA0F23 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = +CT = F8E71AB69663E6116FFEDA203C828BD2C8F2C0D5556A + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00 +CT = 5C3E6EFB651FF0B563B1117E57C53BEDAF11B927D332 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001 +CT = BF21452266B607E5BD5F636639809C9D263BF287600D + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102 +CT = CEECF74E21F815A2C0E8451DC07F37155BC35F76E070 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203 +CT = 92479B2EC749662B79B5DDFD483E2EEC7DED47B97C0A + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304 +CT = B670025F3A4141F4E0C1C8DFE6AF59A87743CC9CD9F1 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405 +CT = CE8B0A2DDD877BAE24BA32A65D5284DB068E63FCB5BC + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506 +CT = 216FA57FD2E7A22E70598DF2FADE3E754565C16E0453 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304050607 +CT = DB80FA1B6FF03BE008CB1C33634C3DE0C5648B9F13E6 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708 +CT = 603625EFAC3A9FE3167556BE02F6A7DF7B83B217BB9C + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506070809 +CT = 0923D8FCAC83A4A9AF737515F10ED933354BDAD7EBEE + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A +CT = BBC5F169ED2C0E30E0AAF0E74CA76DED82112ABCA88E + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 9C34095E8AEEAA2756895B63B49BE6FE80107C38F419 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 8DEF11599C96C6FFB7AC41791E47AAEA80246FE7F261 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 39A8FE9E1EAF0FEE8A518807D459510E46BC52804AA3 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 40523AE8605CDC2232042258246FF10D8A96B3980D3D + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 710E298B5FC8C213D4E500ABA83AEE9A82B332DF72E9 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 09D88FCC7F9AC46A6295928CFA20D52C30FEBD5BB734 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 411AB45F4744B53415606EA152429D6A718A9A4C2149 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2C70F6520B78DE60D936D242CC5C295332676979FCBD + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2601F00F8B8D0E4AFB6EA1D62DBE670F76D0339E6706 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DDBE54CADED50782F2B265670198A70813A75FCB33BE + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D59B1CF2A0AE142F7EF5E7760ED579E3B2FE6FC8F2F8 + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 46972C28C355E0FC7DECBCE24B85BD11688858340B64 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 829780C2999011919FDE507025D2EC9AA5E4BF314687 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 289F4823F891DD2C97E2B552281E61DFB259A991B8D0 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7AA067BDF3AD01F4010C2ED0241B0AA5E5B6AE4345CB + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 29A25C2A80D5D74730F79886A8633D38421D0B757E21 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 422878202F778ACD92F485F5EE409EAC13F1FB4F88A8 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D32023E7EA2C043C8EE1B6F8840A400BFB1604F19F19 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 79AB38828F0AD587EDE208EF5173F7815F5DD1582351 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AB6BF440A8B4AB3F089A965984F61336F2513ECBFE14 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9033F4E57D48A1B7D8F810115A4EBE82316BE0E97DA9 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = +CT = 729B3B9E743BD0A795CB45DF73658FC21994161C684B1D + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00 +CT = 7522FEC3873A4DF846A9DA5AC1D28461B1962EBDD4FEB5 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001 +CT = 148809D7C17A90CC7D1D6B36A7795DC1DD0C83C8FA0148 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102 +CT = FB2D25C02E313F60BE3C7B30F6BE52DB1918215C791B9E + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203 +CT = DCB34AF67E7CDCD537502986F0C78CF5CBA999009BDA3D + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304 +CT = 0ACA1BABF7C46B8225A96150B203CC9F2F8FEFA273B5C2 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405 +CT = 1583434E2C3B5E8853BA85070C736CDFFDB87650D50BC1 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506 +CT = 78B1DDDE9511DA763BE6DAF18570A86D726BD831FC0E45 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304050607 +CT = 49C5999EE09D063642922754B02C3D81FA4D392A546436 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708 +CT = 7E15D24B95FAF3C4F966DECD29244B1018D6DA6B6DE56C + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506070809 +CT = 4EA954580DE70C65287795A6135A26EDF883FFA65DD419 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A +CT = 525276D22131280C79640ED5D3DD9E7ADDFBE14F5CF99F + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = CA5EE0A9049E41DC61242F099B80376F6F8C055DF87E15 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 697B3B9A775E07B2A6DB5ED9EF05F76A36B67778DA98BF + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 45A7E95D365C93AF25CD8F9611853C71D633BB86AE20D9 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = A8016C57D5593C6BEB167888789B497BCE857DAD38C2D2 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 04A2D4BAA7D8E30FC6882E535A1BBBD5BDB440795ABBC0 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = AB0C054CAAB850E30DCCC28885347588933ED42DC17877 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B6C018728EE5A37EF5D460AE7C4D029A674F013ACF121E + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 12F4AEFFD622EB161025CF18FF2E94C4232DE230A4DD82 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 401CECF463BBF2660499F2734B263CCE54DDD299860A63 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B53FA9967E6A0B8FED9B93C597F728C6C1DFB43C03570C + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 157329404270B83E29BBA5CF6425F16CF8A8F0F68F15D4 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = EFE46E8E24604697228F992A2FF6AF6C1AB8CFC33CA911 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2CA77460B4E85E180F862B37A7048F9368EBE4486BEAC0 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C683123DC8D5B8B86567DDA538289BF6A93E4C21DF5027 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BD5DB9DB7FF6DBC2925D8B0357083AA7CE19531C1DF238 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2EA62B67060EF62B9673BFC0E52BA339485DD11F3F7313 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 51ED1E5B59790C48ADA9D4382F3BA1B043ED65233F413F + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E2295DC6AA24FE9C2DFDBD0EB67AA8EA5C9D6F030D6868 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C9A7D87C459B17275D10AE0786C6365D4C65B1273A3348 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C6AA6F194BA28BF0A8362375B8899343767BE3425F08E9 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 4ECFBD8AA81A16C0A6394A785BE12ED48FE1E89CCAF3D3 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = +CT = 00562D725FA4B26F2F57CD7629A380DC70FC469DB2A526EC + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00 +CT = 94ABC9FABECE2FF5FAEEBEEC4E59B56AEE414A15CA8049C2 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001 +CT = CB9B58B024B35218503A8DAF802443DAAEB417F79E73DCAF + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102 +CT = 46B2893181A56B67B6959E6AD6A20113FDECF6053BECC35E + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203 +CT = C3286C49D09D6C854C9DAF13A6A0F1660C4698D92EF7AE5B + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304 +CT = 3904423E1E27FDD32E1EE0AEC68C5C310240A1F2A731F830 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405 +CT = D920638A65999BA0AFB4F4F85C4B3B00A888BEF0FCEEECDD + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506 +CT = CF8322A1E1F163484A1C06E748494E41D23EB1CF0E8DF83F + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304050607 +CT = 92B8C353F3189764D9049A2CE4285A23F6BE7C80AC1D2EAE + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708 +CT = 95E5BAF8BAA44586DD6F9872E925486B5F4D6A62DE267ACC + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 86EC3C9EE7D47DB58BAE5080B13E096C2E27391DA5677F74 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A +CT = FD0AC22FCBD4FA7F24CCF48E722E6408AA9E747DA802DF20 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 878B2DED3A349DA4E57E71F9D46A20897B052CEA9874B05A + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 229BB1090827F3F337B92D7585CACED0D2CBE41FF9649242 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = DE7B93C97A8B5AC7BD79BC730945A9230FC79C44613D4B24 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 1B64F01EEF7D5D2F5F251B4DCA972300134D856939ECE695 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = B76A78C1675B168CEAFFF46B0EF34D795E16F4C196DFF63F + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5458054D20B787BFD56C45C0AC9390CDFC4E163ED455238B + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7A229D00F96D1A30DD858D2544C02C8E3A31AE06B123EF84 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B2ACDCFA044CA7A7503965496637C774037C00533B38CEC0 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3FA02BEBE3A1B27D10902FF144651F61D09DB77C475B4E77 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D2982A5492C8B8AFDDED31B310740B21EBF22D689FA2C4DC + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D694571BE4AA851E58B0419DF4058A834714B4247F5E8561 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D5A14020CA29C703A9DAF5CF89A85B517DB084F11CFCE847 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E7BA73D72A32F3485AAE1673453C9F411BDEF5A6B5323777 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 262E4331D1A386D6C9CF48C945ACE8CDC4BC6146BA5FE658 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 54F6886E9F0A72B69FAD73A605D3B2DDD1491F3D834204F6 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 662100ECB5B654F53333A9F3800F0BBC172F40AF3C04EE9C + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BA8CCAA866577D3A768DD3C6689A8F5DAF8C3AD8E1A6A578 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 58AC6C0F2506B7835E3C82446B0E73EC7D25778EDCDE9B8C + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 71279532624206781754D09BBC0087B5DDAD3D1B7977C4E9 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 70E6C7839E425F7D9FAD061F15C91066893822D23BF29FD5 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9DA8562B60DBC7030DBD56D56B7C3F2D1FFC6351E3A7A7F7 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = +CT = 65B2390EE71A1E3C1CE35F517811BE8B66FAC4D0BBB948C767 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00 +CT = 99B39F0E4B0F5B20FE246F85CA025F2BA225CBAA04B902C808 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001 +CT = 3229F7AD8A34539D7C20B2EE3CE909247E8EF79FCE2C158C6C + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102 +CT = 9C9184A04EB5D8721B7D2E436C1EF0E53F5158733BCCEADABB + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203 +CT = A554CCFFCE67F990294801543EC0485EA1E5C061AE86E42073 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304 +CT = D214F5F59783BF8A3225D68D9121619E771858337CA2796CF2 + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405 +CT = 9965C70A78FCA39B60103E4AB9FB5F5773DF2492B8B835ED2C + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506 +CT = 20992403696CD109A8C5B7AAA6116893285C2BC26AF9DA9C7F + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304050607 +CT = 0277198CD629C0F724C93B8180BD1868ACDEE8C4E3CED839B8 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708 +CT = 9CB7DD376A998459F513A5F8811D9D16220E7665B4A12E2C15 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506070809 +CT = EABFB38396B0F34D25557252430F61433E4C98ECA219457EE0 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 05FD6871E4D4BC67C42F6E30F67C142F2846CE267E1E7DE969 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = D920D14508F84DC135217F976E57D2FC1A964A23EA1855FB42 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = E85AFC8033CE90A7DFD5B0852770ABEAB76542B457516B34EC + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 0B1CFCBACE3F9ACF07E62FD23A9B3F02C3EFE5FDC421494007 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = B70CEF38E5881DE4A3205B8F8FC6638E617EA0BE0DEDA569C2 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 29FD01625B6CA9E684876007B46AA3CC24220EE553E892EDC4 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = CBF301F2FCAEEC30E8EF8E9A165D6CD621F31A95DC9E409919 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 21287B919454EED8E462BD951CCF55C5E42B621266A07333EF + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1DE5FF722853B946C80A51AF99CBE7022AC99AA2BB9BE65594 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 1B1F17D8BBB4B4F6C8BE18B6EC48B252A6AB2353844A6BEA29 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 05B8597CA52FEBA2F9FFCDB12C48BF3AA5007D6C83D5E873A5 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D3B30988A82E57FB8E31CE8438442B8895E29E9605AA471984 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2EDAD0440F6AE32D2DE683FBBA28882EF3DD7D6BA53A3A32F3 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C901B2AB60422EEEFA901FB8A3472226CC86FD50A3143B48A3 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3E20D2A2E564889E83CFCF98E45DF4781896864A758FACFB80 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 70A46CB3E723BD4929AE27AD5D328423CE03B2DE1AFF9A22C1 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A9B8B96FD872BBC86EDB750F0D8459D323BC82FDC34A005009 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4F55746331A469BCFB8D81D212F4FEB436D642EF333BB2A3FE + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 518075931BCD087C6A09EBDDE10767C6251BE5A4FCC533DCFE + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B3131A8F163DACCC1B42AE79CA4326D65E9A972C69C98DE2CD + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9E2386A05B967C112668D767930D2CA4E455FA4AD87D6048F6 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A7D8A2A48210D8D4C171BC2E3B6191E9BD43072F6A60282B63 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = +CT = 55AC6D75FCF952E1A8D2E0573F2AB3E15EFE2AE59F6B5A6C93B9 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00 +CT = EA0C8CB86896C8370027F55E12A0C70BD9FBA989DBA70660E1A3 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001 +CT = 7BB888FE2837F6AF1D01C5A69A50B51157B493CC634A86C8EC9D + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102 +CT = 035E952E827052A82BC1BAB33BC783D5D997CF141DE52F47FE00 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203 +CT = 76F2245E2E17AF56F1C4E205A7DD05E11DD76B567AE256B13AE1 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304 +CT = 20714EAE061E5784A1392EB38C362EA36665E84E86BB3C817984 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405 +CT = D63BE61E6132D4C1DCFDA86AFCFE2B191214E5664AB341138184 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506 +CT = A8571A698DC096C4901A84A7E173D48F50CEA54519D905DBB4F7 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 298209B0BD66A46DB19BA239FE23D43D17542595141DFAB34000 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708 +CT = E9604647885130C019D94A78472C003E947C5FE5723F08EAB3FB + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = C18ABA4C5B647F7851BF3096B7C2AA7E050843C8CE037B4FEB32 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = FAF9245C9FCA5E2AFFB16B1C539EEF01804100F77DD02E6FCF1A + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = D47ABAFEDCFB564A85536FC18A5E17F7E3CB2EFD6C6483D9A5B7 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 72A4CE1F171851D17EADC87CCF9501B848BCD9431F47093E3510 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = C533936AD66B07229684EFA77386C412C61F33E1FF9D8878B4D1 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 3DA31AE9A01CD24EA12C51AD1A01635C34855475400756BD5D2A + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = B4CFFC51704741A1C71F87915EEFAA500603B96A735381740D6A + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 198BDFABB6EFAF1112717F5A6BA846C1E2FA2AFA806F3439D4CA + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 31D9CC1468AB2B18115D6DCC28DC31520D62A02201F79FBE1C9E + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2A961BCA6E35232479AB2748EF331FDD104ACB5CACBBF1AB0AF0 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 81488B816042DF5F9A740664E7D80EE70D0F3C1A0A5425A9850E + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 90A752DE05C4ECC5E2800F074CAA9CA2BC7F2E1F6275256CF75E + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C771C9BAD21D39C819BD872ADE03D0CA6FC9E52A2895DE90090E + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 09A64B3A859EB9F12E9F8E8B74C285027C5DC4B812E421F78A75 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 23244C67BA6AC531131A0783C987622BA81032541036BEE1930C + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D3BC6760FDA39F93315F903D0C7ED300D45DEACCFA2380C92DC4 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ED4B1EEB5C62B4C8089F91543F311D5585585D1E09D8787B5310 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 451AC0415863ED89630AF10F0AB54CDC28D0984AA90779554843 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 750BBF97654B40272F3A8AC540606BC9AEE53E0587E28CFEEC06 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0190D274B28FC5B1A60C3D609DA579A220FA14391B2F170200A3 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3BDB857029C19E522BEB581B13FBF2841367858CDF2E26AEF0DB + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 023C89745D7ED2583BDC8B4041990CD2A514E1794360A3E9BDEB + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A4E97023B540D18641F5282F69363E7217714DC565B1429894AA + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = +CT = 6738391299EF5C28BF8D5EB85E94DA2F9935DA680087318A42010F + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00 +CT = 3482427DFDBF48333B215AC462C8F2A78FA8C8CC458A7BCC2DB420 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001 +CT = 770312D13507B00AC52090649927D9BC259274199351982A8CFCC3 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102 +CT = 358320132F901278740D5F16699063A0E630D4AF5CBAEE8A5D64C3 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203 +CT = 1F7B714EDE73A34E33CAFC7849D795C71C471F46531EE7C3A05343 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304 +CT = E1137B620ED6CA77B102C3A806883EE82A4983F9AA1B426FDAD577 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405 +CT = 51FBAF29FF5E4BC869C02FBC8AD4211D73272EC69A53334D09D453 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506 +CT = 1AE1D2C6F22D09FBC6C579D951E37085D6E594364970177003CC82 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 93F548775C19EC74E3C20319B523CB9D6CCD73461D04D1AF118184 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708 +CT = F11EC242F9516E52E51AB3727BAD561171C405489DD6829DEB5A3C + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 0A10649BDFA0F8B6F1D8EE4CBD3BDA0AB60DB3043FEE6C1322A9DD + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = BFE2C9F86D8E90506616E2FF76F766906401D70AC165DB788D8C89 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 8B2093D96788227913947181996351AF80EAF87BB21B6F254627CD + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 8AADF340535E7F5706CB6563617844454F259B5EA34FDAF94AC03B + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = B420C802624CB775A53AAC9A7AAE681729707EDDC96D468797D048 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = C3AB27CE94E7B6F6B7C79B16304770BE4FE1DA3679A26C5036C023 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 733FC012331A2F66DE835036FA643A32D15CDBF86D3865315D6109 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C80A72DC1374C6B25DD50FBF60571AF5ADDB266C97498BB19AE566 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 39FF0036DDAF3F9D3788E8B2DD900435207ED6BD4475C00E174A4E + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3E4EE9C89FAD1924A34C5C4FA8D335089AA99BCF1A34B1348D0750 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 84BA4D4A46DC34B694496D5E21476E78040B25B636DC5154FF155C + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3F4DF7A9A040756F3FD21C17C525E35DDF3F55FBAABD78F4767592 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C2536EE152FFE0E9505E70EBE5B43DAF8B9EDFE8F6D7E0E1D44461 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C524C74913991975404C78B32CB30470AF4728C28E18ADB4EC5822 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E8EC62BAF466BC8C1503DD6D0F2F78C5A392B1BE78E88441B9C327 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = EC2DD0F1D2821770A65E6DD7A1FFED34442C9E318471AEA8E9393C + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 75CDC4C16C461A281899FCA31A5CB8D56CDAE406AA68F1969C7DE3 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = ABE6F9F78316E4C21B279DE608CA82FA9F92240B355BFBEF4164CD + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 2AFCCE636A3FCF885E5C847D05B143C078F7B2EFF812AA16CF38EE + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 7999C7FF89FCAA300C455635433D282E63E2AEAD3DD236C5EF5C35 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BF54E2F790E9F84D57556B0F38C4CE5064990D57965CA09449ECBD + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B67317962F3320F49DEA0732A7BB3733BE424D87FFC8DBF2A26C17 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 510966A0639BCD7F31421CFADF2597BEF82C48C68274BFBA740A9D + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = +CT = 42AC0A598AEA03A366ACD7CBDAC5B4DE3BCAA28F55D8860B3BBFE103 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00 +CT = D7AB515BC1475DE44FE9A3DC88A01971486D03B270A1B827E53777F5 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001 +CT = 81E4ED5ED4E8A05F47C6108BA917D944E1F886B9D0C4BA5B18F4CE78 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102 +CT = 4C33175295338F13BFE879368FF60A64DE2B5F26F7C7883F9E72194D + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203 +CT = C0C7EDABE392225212F1109B0EA071A355EF5A4B790B19F6A1D8B270 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 9730D37D05C75A4621805BF6F74DDD277B44747EF66F9085B6525994 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 83DA491A3704454403D721201E7EFE0410364DC114ECFBB8DE398F89 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 91094E14652D08834A1B1704865FE1AEF1DB0884DA2EC3C3F23D893E + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 49BA3FCB0818C6749AC3DC01B7F44A7C8A1FDB0D86A1122A556A1191 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 4E8B38C2F44395E7F2CB3269EC3D6FE121ADC55E0907B47E3E9915BC + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = B7881A638A7E5FDCAE6DD3B88F6FC2160B2FD13032E5608BA2AE975B + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 379FBD8D899F3A6463C308126867B062B0D60ABD5B93E17FCA9BD811 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 79D42F39D25879F7B397E628CF30A16E552A393B220CCE18DBD86635 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = C344990B0D4DECAA95C7CF4826CACCCF470E6C7B37D01FF2A9E0349D + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 9141454D8867855A2CE7F6F1147DE65B262CF85A03F555782B3D1A29 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = A11670B033A07DB051D38C831879F446199482369B1DDD75D648044A + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 08207DD86929B508A61394BE41B7DAE1028C119A7577E50401875F4D + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 881D1F8BEDA92D530C3AAFDE462C865FAA912493C9B72CC54A43E05B + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5435F5352EBCE41DD7751CF1A9BB9042BCFC2FF88E5555F037B44879 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5FFEEC63452BB29AD34A85CB08F0396FC841CFF947CFE8D127C5CE27 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 37FFA1CFF6E9A678F1BC877F56852A4752A52499CF80029C125FD94D + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 20E8A729B7F9D3F99E92F4A72D349AFBEB48B436AE5C9147AD73A996 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 25178CA0D43A684EADFD7A64E4331E0F7094FE2487F97561CA82958F + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 43BD07448CFA892BD8AFD42F53F6B84901D0F13198535B82CB7F8E36 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 34D790A2F8B2E0F1A2552E16268AD7F8E4022772A7840988A0D3C422 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 65FCFD40A826EE0F6A9B85DA01B6A3CC86B41AC8AF93932E744ABDA4 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4224BF38BD80796605ACFA8B4E20FD85F4786072E815EF224BD2511D + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3E52FA947137D432C87CC141584AC48B5BF760A3239D2CDCFFC84DB7 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DC2A63D9DE04C2F03B88008FB953BE7A1BD65C78E2B9796CBEC35616 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 96F2579950EE97DA4A0FB9B37819A07880D6A7F3990087CE585D3B18 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = FB77C8A797F942451242C3E0B8AB125C080DB752D284558C5382A5EF + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 56F36726E38BB5C905C3652EB5C83D918330DB990CEC089A6138BA9E + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F8E214574F803E42718D8A43A2F222793DA7A8E01FA94C27CDBA13FD + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = +CT = 6E7781AF6B13C3A69CE33D655D94ACAC2FA55175EC462BB5665A785464 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00 +CT = 66B2DAA3755382F97FAC5A98BD314676BC8648B6606858E80A7515B565 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 96E1941C1A631E07F55402E977AE92B6CA7BA117E084BD0E459976DF4B + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102 +CT = F7201D4E43C92DE96C4184F6F0630EBB1DF6D2A555F691D5006793C802 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 754F5A55D4C83609CA22BCF3E303718AF3B55CCDFB0FD9DC1A2D5BDB73 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 11B023EFF00CF1AC783CB6E79197B911D5A40DD165CA464D3D10A924B7 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = A8FEA54286FD95E437034C475A10388417C0B241C7AB481435DD56E3DC + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 6EEDE78EE96418CE076EB945A0657BE2024BA27FF0E19E82DA0A9B8F22 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = F7BA6A081154C0E2319F4BF31B469FF4B30F953A54C8B57DF941C69109 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 836E04742B93963E00319F6D1D6FDAEDBA17B5262FA7A1511D81050FF2 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 735EF70ED0F0FA6CA192976720BCAA8CDC96E654015C7CEEBC40B2C1A0 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 28BE3CF48EF2A16E5EA128492DEEF2753868F879DB66A70728215E9ABF + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = E64ECF630E37528F7EFEA099E5A7C4B78F6C126C969558062FFD42AA5F + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 9A3DB97DFAE3B7006568E40B420D18D6C06389BAB3550257A88355DDB9 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = A71B2523C05F7A2D68BFDFD8422C0D24CA67DA103513568C487A815396 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = C3AAAF130ABCA18B64723917760F614E2D64897F5A21C1FC99048024CD + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = FF4B615D9DE037C24E6B4F178811BBBCFE43F55D676321EA9A30D42B6C + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C33171C69354870966887C3DB16B8CF1A9B23A5621C072267BD4F929DF + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0A3EF91D95CD396CE3AD1A3D01D6A8190C9C708AEC8D8B6C8307B05356 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 89BC5450C801BBBB7F7033476A9E1CB6B880C93645F88879AF5D4416BB + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D77B58685DFC78ABBAF5AFCB46FBDE1B35A85049D4A0F56218C9DD8427 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5B2487AF428CB7BF8382E88E68828A4E1975B2956B6E371ED96AECC0EF + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 93CF9BB715C72CD11DB60D3440C5175E6959C8CCA3B60483089ACC612E + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 16316CEBFD7B5B22185DD5B73CFF03F6DAE47417B7A4390EDFD5BB5366 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 16D9648D18CB4C0EEBCA35A8F6AFD930FA6E2459BCF3FC2241DF57065D + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 559AA4F21FC0E5D1DCEB83E8E066DFCC7D07A348F4915CAAD0B3312EE3 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = FFF7D239F32F76A07E4D8466AE5533DE16D15C90187E235BD3A0B86012 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1E878D9B360192262FEFE57111E9B175CD08A301281BEFD387C9F92CC4 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F6051CF672CBE89625042385A334D43D2008CCE5987FA06F5657A2B9AA + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FCC230C717A2724C0573946017DDF08DC57F29678B6C99D6046C582FE0 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6DEA420EAF936A435C277C4282D00A417751F5DADAEBEA2D093B02724C + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 21D8226E60262DA1B690C47C966049C4A764180C9AAD8C987F631DC09B + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2E0B320C6C06252EF56E20CD5A5BCA538C13884AFE41BED4BCAA849C3A + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = +CT = D32A025F741AC81E00F890A28EB084F87F763FAD3BFC89EB556125B20926 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = CC174A631094E77EEFDCFDF113508FBEB66408FA89770BB1CF0C27C9A637 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 47CC77F7911ED4EE926CACEE736CD0A050085243F5658338D3F825092637 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 77F544737DCC2680439106C3163F9F5B0818B1E8F9A95529B794E65051E6 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = F8C259812491ED24DE0C7AE83C408CB07902146C89DC6B2A35120B80C01C + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 242DFF307446032E7CC3736652808EC6990052A51755C2DD0C770B009C7E + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 99ABB101967E054D0C7C685DD92478513B20A50108AC702F206E0FD56678 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 0FAA2D999D771133651686FDC297F094CDDC0DAB565B53EFFA23F352E52C + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = D28FCCEF2AA6BC48B9A7B37BC209ABDD11CA8E0B7E059AEE4D58AFC89691 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 2296F3F65905753A5E351B2A23B8712B9780050208DC0C46A4A2BBAB1FE0 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 09CBBCEE57E46A60DE27E2D019D8AEF806926402474BDC4738838EF8F42B + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 46CDA743178C65167DFF40995678DD66545DC91039961C0ED94E08066F85 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = EABA780D29C494216B0343F00B37565AFBF5F284ADBA1D5F22AB4D00986E + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = B5FF25F148023F14A17A203B8AB7D98726C526F88836DB57D196BFB784AC + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = D13CA054039357AD1E3625DB3D95B65437C04796AAF5D9068B387784E285 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = A577EF706793B6BBE0CFA9A9171E31128184FF1BEB5F9BBB29384A8C42ED + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = E238B189791A2EB31182CE729979CB6436C75B6F597D0F8705738331C655 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 2AC8DB728E97BFC26D23EDA2E2FD50CFF171AC291D323264DAAA96C75CF2 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 19CA0366E91B6CBF367E041B6BDE770FB13827954CB9F324051E9F11255D + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 099CA88092B9401EA4B9FBE28EC25C534A122DC79F391476F8163FA5E23E + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 30FA9AA5ACA1529CA2D4CB136FB5ECA5066F69711238908DD636EAEA28A4 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = BD8750FE4B1F835CDDF43FBA887F573F791490FAF0A4E476A1EF03D6EFC1 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3DDDA46134633EA29006205F90F8C5C38A77621D41D7231C76BB94E855BF + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FA7FABEC9A64E61110F70831E6A6FE861FC3F10A70F28377DBCAA9DCFFFD + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EF5A3511EDE91CBB11FA4105394A5115AD2C883753DAF2D0594F8C70EB50 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 160459779EEFCD5786E335CC1AC6F770E1F99D5401BE97D56A3EAC519C68 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8B8020CE1FA6FDA4A3CEB6722774869433A6C3BC9D03EE77330EE71DF708 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D4AD2F7F3713FF57186449ADD701A233293A4389131309DFDBDD302EDFED + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D089187469A89C420A79718FC1F7526D79E0C5280BCC6DAB1B8B1695512C + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3D2FC321394D14043A8AC796D53632798E4F905CB977A914314B1B57F2C7 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 75C68FA70E37BF95407FC09B8E6255AC2FA7B0C52D430627E79A6DD93AF3 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2BD934D70E842794B54E11151A0A1B914C92E9DA26CF2E160F046121CAC3 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A04010C88123EC3BAC2EC1E8EDB8D2FA203695D0FBCDBE60549C22D3C4B4 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 81753B47EF73FED880FB7E26D9B199B17762B14A2B943BC5E3EFDDC307F52F + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 173A461A7DC07DE4D9C2813F8C94190F2115E3CE592E68C045CD71C55F3B6C + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = B08E491A9BF89C1D1B6DE2E5B229271CF2DFBFAB607B5BF9304AC91E26BDF9 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = F5E9F38F137B11EEC401AE0D974138C65F2CE13B1783E99D976193318FB5C7 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = C7D5F25EA5F8FCDE29080A838A5EE72891506A5EBBD8D6851A75DB7CE51081 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = D41D3A8E9C9C23FCCC25DA1F8B8C3B0A75FDA409F734AC8560567E6A71A611 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 7E056D8C28B53F9FD645F27A1029298C47022B5B110F20BE3C8C6CAB156EB6 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 40264F74638FA16F8A80CBBCD3A6DB00F44C9F6D37842B2691E1F9F30A5C63 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 12F0EACB3703155FC699674925D9E9158536352D893974DCF7EE48EA80906A + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 2113276A7BC1A8FFD1F4807322BA262B80160CBC0A493AD63AA1E14949B397 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 4AB030B52F71262D9ABC4DA089777580C5311A64E99D9916FF06193737E799 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 48A782D28EA81749FD9C1EFAD8B9862AF0FD760604A3FED3FCDF8868B1EE5B + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 049F743FBCE3F48F383A3BBB90086B582FD68077D9D80019554BC4C3003253 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 41E090907C703F0985809E8D0EB5840DC5B1CCCFFC96B8B7EE7F4E9DFF6E87 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 830BFDB0FDA1C0503B59FD13B8AE92B63D3C407060218E58A413824D91CE12 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 59A5DAE9305CBAAFF1B8C4BCEBDCC8C05D5C1C1879CAA3E38D9F67D3099C0C + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = AC704FD8CAB008FE6986885ABE8BD6D9FE66AF992A3A0D17D4AD8F6D87AC95 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7F633B5BD328989DF509E75D04E951B8C9AD1B3182CA33A8D1A03D65363660 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E8ABF967817E981102D4DEC0AE1304A539A9747DB8362817A2A9B72E516B8A + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C75BCE9AAD48E9A5977A17EEC4DCF8A92413A84CA9961E65B73CC317EC597F + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9B51D640035C1F2D58C36F1E4AF0E98FDC84C42A20A2F4F8FA68349354A95C + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 239CE34ED29D1C289175AF088F2ADD5EFBFDEB11D6B695451E984BC5176E77 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 934CBD026C0A594EBEB646726900E59AA17C21ECF2B27A65FCFE899C2326A4 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D7F34596F307A034AC58910DDDB16EAA5682BEF4D7EF1E8661DC46510D47FF + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = AA89478EB3C61D8BA75B48E3B49C927A348B9CA4FC30AF99869A9927D8AF6E + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B4EA8AC58C39E7D2AC50187D219528DD753EBDDA73CD8838D122558419BB11 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C95E19CE1934D2005BF7F81FE42D78C8871CA271FD2E43A47D8BC03F822D0D + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D998F9D2EBDD3D6646EB8FC0B165F89D64AC4B028C2B6E7F217F683EF98745 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 62B3B90B6684C01A95DB2BD854E21E08BB3813632E9E4E0F37B98C08813900 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A9C168BB119D27CC1C8048093EFCE50D4EC17D5C9013D65AC676301C73C8A + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 9C4E8320FB7D3F1FCFA0254314EB74AEE3CD38A146B3DC1DBC9A8C8DBEF501 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6376561612EEBD6F15B78AD9E5428E7DED42B6693D99414DF5FD7D5F28D803 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CFB6F55D3867B326428032C67FA2E3B54D8F04B9F61D317E3074ACE4560FD9 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = D19A9D1BE23CC54F810339EDD4E15C7039841C4802A94CBE2E16E8581E776CD4 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = B229F2A40D4A0275B4D930690927F1F5DF24F10AD9EA0F5C15B074EDE29DE172 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 21C4FF899502B969AD591D23641831AAFDB9F29B4A0976D854E6412F4FCE1387 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = DCE5D6B6187E194CFBAC0F15FFC7371AA213FBA58FFA4B8C8205D7E0E80F2864 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 5E0CBFD0386F1F093C433891D7DB2F2206BA8089B790DB52857F9D20FE25D9ED + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = AFD1FACF637BCE39848C2F86206C8B83BF00D7525E22724AD2C5F9313BF23B27 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 5D58F54F7864A3B2B3C35B82FC41C094D9A9AC699FE915D684BD03AF125F9DE7 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = E6B27AB3868E9654140889E9CC78AD5FB482A0C3ECAD9D67557E1E52E966BFF1 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 75EE1416329095B6975C556E46277F6B5A390203D0F94D98A9416D6080BB3DC7 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 0437554C5E7FC89F1EA2DBA4F4CE5956710DE120963E2AF99C15EF03FF0BF0DA + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 4D1D544AE3EB10C29944A675F43D52517C6BE1BA964C884A906068CC6B6D2E58 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = A95AED7E615329B231B78D76778D76D9C5A82AB4B6BC9320B6B5A0D2CE5BE002 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 1C8C37D8D2447718DA85C0B3732D5912647A3D1F26F41EDE72032CF6087846F5 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = A9BBCA855D5446D570543C3F07209C69165340A90C4EA99EC82D5644AF2AE4CA + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 7A4245969A6DE10189C4B83D62F04059CB0D6C61EE25996A0FAAA5391FD4FBD4 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = BFA06890B546744B74DE7CE7598F9A362B063C07A91D1B805F0290E65F0D89AA + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 2E0420E78E5D9124A4B11EAE2BF98BCDB46B94515F170AD559DD79EFFF808516 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A96D0059BEE960418847817B9BCC7E768BE00ED3B5C5B7615141FE711095A627 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F766E9CF8D4F0744C5EF061317179AF96B2A4B31902DC589DAAD3848743AEEBD + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = EC55A0785A1509DAB3B1B26E2079CA225FAE46E7E2F86E8A31BCCBB8E463592D + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 82847D7A430A645EEC8DD7C62761654AD484F7A68FB53801445E71A0BAB5AC8E + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D30BC3E62EA955953ADDA58AD69E821A5338714BCE55B36B6F4672600B4F6D61 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 69B57622ECEE58AF0886818D56DEAD5552F03BA8BB5BFE103F966E67691B20B0 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7C0D224B9BB027886FB78CFA195B88C73D5D1BC97B9855CBFBEAE87A6423EBCE + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D31062F289C9F682C43294F1117A854EC62DDEF67A65E35DF668EF8D6B2BE1B4 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = EB455781FF38E80B4698B5BF6ABF8B80331A7DDDEBB591FEAAF53AD26887CE29 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 78B94D94758B3C63C6BAAB66E2AFB71977F967D0C56F0596ED9E165BEEE71FB0 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58A62A65CB0708624D71C3CEA1966F03963E3529B112F24EABAD00C9B2D016E1 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7CB60F2616CFE4C4B133130FC46F60C0649FB7D17B3B308592C42DB0B2544CCF + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8C4B38841A2F74E663470A49453CE8F9B6FCC20514A32944ADD108E763699CB1 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1FAD316BFBCA523D9ACF25A574F1629C031BBDE92271A8CB21F4C5076DC6F449 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2BF10401D161A15C5D2A528BC293B6FA0EB3CC0FEBA63CAE112FDB575A8E9876 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CFB37931F8F32367B5215E7FB506E02CA219C12568EBFE91DFFD86751F7651BA + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = B384E6C5CF48A30778C972190B570320908307D9ECB4E078BCB1EF224EEF8966B6 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 69B63E35490C2E68D66351332ECF134D36912787EE97E0A994C6F0DB98BA7446E0 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 19907ED5D526E966C886330E271D2AD36EDBA0F0269407E5A2AB0D908C6F6B0C35 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 1F2F65DD509EDA19B302C4D26EA9554F0E46F7F4C44C5223B9828D3C9E1BED0A0E + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = E5DF7AD6A6E44605D2EDC1705BB206F9F2BB121DE64C1A6C7CD0128817EFE60AFD + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = A091CA4AEB121A3AAF5724DFDDBF08D13CB7A057A9725FCB35EE93B94E51F2C35D + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 90206A6C657C0CC982AFB76EE3F1A343F4B5201783350384FFAFF3C8ADA7885AB3 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = A2489ADB4140C5A92E0295F0D997FBB560B2A06D3BBAADFE992492251AC5D5B788 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 1B98C2D9ED238C341183BF1D2A884C8D2264D4BC8950EEBC6C5B98B24A4E837480 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 87384C27F8170C36A87A65180D2342EC2CA66291AA38F0DF09943D455E5FAF4C30 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 24D8A0E5C29724C62757F4FBFC566B92093CAAE327A457426171ACFCAC7DC68A67 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = AC389C7F205306B70D49DE2AB3C6D60BBF8A6BF5A610447E3EF02BE1FCB07E37BF + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 6C6FF07CA1A43E4B77E9F6D4C4BF1DDBA5B4C1738485D7FCE19DD9877D982F591D + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 50FDB6C1B64C267315AED54DF92197D4ED8DACD7D554D43D850017610DAB58C4C6 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 433FB3CD0F6D484CE20B2E65C8A9E6E3C75340E81E1B0A57F36BCDD8F6EEE1D523 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 9FF11D398F11129629456C8170C7E85AFB3688FA220ADDF48A5C78248A5A4D7237 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = EDF2F56C37629A219E8B361B723A313B379E58642846ADC96E8FFF9B0AFF8D7CDE + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 83E795E8254A4199F9F17C2D5BDDD83DF2D538F029595FF72239031D31B171031D + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 635889A6571DBF62F7760E314B010AD274AAEDC0E75F026A396EC355ADE289FE04 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DC238BF560AB5D48B95F4C160B7D9BE7E184327DCCA9C9E0D1E17DD90519E7F1D6 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E37CA2BCDFE734679EAE4F09FC6A189709B6AF1D5DB10C01FE3AA84A27C8974506 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3029C79B7BD156E9582569CB8A6084E8C176649AD6A878F0E2FB84E702DA15775B + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9E6522D974C18D957D702C59076C81BFE64245978F8768AEA8C58C0F857B8B53D5 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DE7AD120F30E33C51BA47F33C43390E228AAA0420559DB5E55A77406E01DFA0AD4 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 376149ABA8317D30BD5D481A48CC5DCC0AC2AABFCFED1F6BA02FD3E81082BEC7BA + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7D5DAD4392DD1BEA1C2E2C85DC9959681B7423457C33ACF0E5ABBF0050B87261A7 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CCEF81CCCCE43BDBC4CC82F6D59F55C7C43E392146F3B98137D797F13F42C68EBF + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 96FFF869411C71A4EDD20DFD41B738E77858AA7CD4075748AF1EDA5C07018A3083 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F54FD8252A6161938100BCFB1AC1B1C73DE4A8662706E4EE16721DD39F495CD488 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FEEA9E2262C6C0A9D2A44F400FE57361024C5ACB0FACCD7CF20E4EF35705CE0A85 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A35D64B33B06741AB5D3B746488818B37C4478D0F02B462426B4DF48A8DCCBECC6 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 82A09DC07FE703A4D3679405451576116F79DF54478248FC6FE495DF41A05E56AB + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D0AD12024EF99DB762AC3A113A9CA0A49EE03B40F5C2373B87E88FF846180F2D37 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = AB74F27C928E11DDC6D2FD952C5417F24AFBA212ABB9007C4631F7E5EA65126DDA7F + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 9D67771D17B6F4AB35AF90E06341009C9828E7F9942FEC484BDD0C5EE9EB6D07D9AB + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = CD35E6549AF0F0DEC14B1220C7FB2818C4ECDF53AF87ED3E3DAFDDFB487D2C025539 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 86AB4B72DA9D6E2418435CCD8FEE0805F7FA00CDBE389BC86C4A577521A6C376EC9E + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 4BC78B0F330B5A8A08A78A4E3275486C4AAE0CA4E28388787C054AC7AE0BF71498A6 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = CE10CBA14C7DD632C9481951C5B7BBDCB5237AB0ADF319CB8A054A7027D794D26F03 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 11C4093F4C1DCBD2F9C5534BE962178AA6F28EB7636C99E10C5CF4CB7AEDDD80807B + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 0BBC84622DE862CB25CEA9210D681C6E414BCB24216674AFDD5583983E8DF32E44AF + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 07A072CDAA4D48B2F7A5BB5EF8D3C37F5CF81F0F0FB4C67FD93511360C4D52A73E6B + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = B8DB93A90FAAF9429E478D54B780B988B0B1C5B49EDE56993661E53E6AC244B1B92A + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = 1BAA98E8FA882FE54EFB00F30BAB4A419E04FF59F9F8B77A74FF662F0D432D0461BE + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 09076ACFD8816269888CF1195BFFED1357D3FB7F41435B393A3957E9E094EA4AA635 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 0FBD35EA6633C319A1AC859E28D9F340C7C9D3BA94974B78FCE105C9A11ADEA31A3C + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 0FB3CEB378EDC586A2653623361214716D42C5DB11B23F3B91ABF142F487D281D889 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 8017E8118F4D32DD84DF2D8426C276068050760ADACCD83A88DC1DEA31A83AEA3CCE + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 763D2333331E6023D7758AD3C1905FBD2E45AE879791D3D0F38D841FC6686AF43498 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 779DC12001DE7CC2191AB8E56819CFDE1B77968A5A77C7091354DF20C1CF3BBD592E + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 72A533564A849FAC06CA2694C9BCF3220D9004C3B1ECF6B49866681AA1E73C39CBE0 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 468D7ED2B82BDF80CDF85A5C9EF421F18174C49922F9DA71135F1B3D9BCCB76EDCC5 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D668A7A9772993F5872F6C99F2C4555DB68403A78C443FA1C2142E7A2CBEDE8987C3 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D6798361F3A51129A9D8593B1848A6141147EB499EFF3C38C6D1D7F8C62DBBCB46D1 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EE596EFB6E10AAF382FB0D63FDDCCAC58BD283C03C979349EA237B8EA2F4A3AA7A21 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B831B2108BFEBD71B207FFC53EDD8F5FF901A6549356E0D48B2098BB5039232CA062 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A4ABBE30DDF18990770E6E14C89374E3956E66261D7D3AF060CC05BD31D126C98A39 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9FE1245879787CCF66ACA7E50BC5E9707FC752E9D86BC0B4D51FF077DB794B3A05D7 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 52C0B13CDBBEDA5EF56FD822EFD8901AFD5F604A361D6CCDF0B037F829066733D3F4 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 32E74898112C5FF60D3D6B2C5E170C7C2B146000ADE2F11EB927B7F1682F1C8F07F2 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 954447EE518A6883F3B040C834912680132FF938A6E7069DBEC3466303670C8DF407 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 199A3E02951C446C563D17CD4806400ABAC1099E62C01FCEFC7A9E6795B8BD06EC27 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1049DBB40D1AEFBD0540EEAD5D8D0BDA06C034A50E718F772D984C5ED5A3DFDCD9CE + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8A35BAA4DFDF5028FD943FE407729E6A5D24823D52D646D01A623A4898B43C6CADED + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F3530A6D139FCAAC3B52BD9A8C87F1004FEBEA2C1DF043E86F4BDC7DCBFD847CD1C4 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = ACB21FA7B1CFC381BA02B59A0A52ABF28DC4FCDFAA64B6CA7A8E1BC55714C53E3379 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = A28E0E9E47E97C2D8C32626722C90F11CD29CF04AAAEEFE8A4E124A13DA74F178E5DD2 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 4D9E985AA7CCF2ED7715B4639770238042F4F41BD8E50A3E9D975121F43C517E930D6C + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = DA7530439A044FA6BF2404FE030EEF24E7CE499C026749F7A7F8A6B9CA2001C06CBD01 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = D56608747A4B5E894872745C88DB0393041BE9453BE2BCCD2A058CEA1F76A7FFBC79FC + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = C154F60CAF10054932F73397BB770D229F700774A922C075810FA0B6C9D347BB8C1008 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 99E2C70096790E2A7CF3FCD6D0B4CF9A15954F03A0CF49C1705BA822B2E28A4143AE06 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 1D234DA86B21195E8F4DE1E6E6B454389B05463F38BE610B8391DEAAD5D9F59CBC7EBC + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = E007E5D564C90958349DE4A7A26DE9D04E36AC06ABC81E68347793CA0348FF05B885D9 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 9614540CC63EB1798507FBEAE6B141593C36C86752DE51ED13917F73DD13E1827085E1 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = BCB058F77C0F851D856765E134D4B568368EC8FB2F53494AE6D313EECF0269B83C89C8 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 500FF2DEA7AE7CBD85EB4ED5F96D7BE2E93604C3BC249797A7E29E3256EE8D9A8E0227 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 46AD42F73072DD0B81F805AE4FFEAF77CD37B881F6C72DDFA64B735FC88BC296C44A3C + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = B6FE9BCA44336472DFE3BE5D1589F4E7C02A132DC27AC153B418126E89464D4F0179F7 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 5E9AFC21AA1F1CC066035308EDB876B51B9CA6D12474035890B08D85FC6D04D7EAA89E + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 355E87358CF9042FA10A1AA488FA0B8EEA3BBE89DF11A2C9BA14B93D08526DFB97AF66 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = 7899E693096B6F092ECF4813C47695181D2BFE03049D4AD49696F589CF3494DA19B70D + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 2908AEBF7274164CED90AD437C2984A4CD3ABB6BA13FFF66661D25891A48A27C0D2119 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5CB458FB7A5F0F6A95AD49886C8E6165F60C472AE0E469D92C2E3CD021A6D7328FBF01 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5F14CECD60CEF9D4C90B4CC849C32B2EE5DD8C93343EBFB9E1C1CF0D323FA19B5BDCBF + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1B4384B74C4B486723F0D40BD4ABEC2A9369AC8CAAFC663A16EAA102B94530916558D3 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D3722F23959277537B560A186749642ECE4984923298DB89D8E994605F2DF76F10F040 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0A2CE31C03DE5A30489987905D4445CBCD7B10E3EC6EEC6E7F1E8C81D2B44884DE71B4 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A41D381D94AE0284C33C9A1D9178A36F01E715CDA2CED545F4A61D8FBD418820ED7786 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BB14F6A5E3E07FE9B01899DDDFFFD234B165AD329F8A0898173F1F13557954171626C2 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 837DFFBA250914F90AF7C2C1C33B618A2B2239214E4774657EE29CF09998F54D8220EA + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8D189B917264B2BD5AAA1B5DF542C5749B4B8E581D6B28E5A05FDA07EF935EBDB74904 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 46D38B8848527102C33D5520A2B3F94F032BB1A1B473C54D6FBB016DC9428A4EAF6CE7 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DBFEE90696093FFEC849782EFA4B8DF3A7DCE4BF6A3BF08CBEE3EA253AB438E8BD7422 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6983EC3627A1A5144957F92AD3EF9EBD37E7940CA777424C65B56CB6C87F9A2612EE60 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = AB552C5D31FDBC92413C58FB6930CA4BD1AB5E7B2B0B8E33E3DC08D5C5289953E4CEA0 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8CAD6A087E62124E474BEB93B10BA2351B9502B1B5B6401C2A622FF8952C513DA30AF2 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 626715171D5C2D2335E59591BFB032A3F01A7F67D58852E84DCAD1F078FBF29B465A1C + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F726BE319E031EB8F785734111F7B2E4F2AE83960EA043A16A113F65069574F6D1C465 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 44AB77ABD38C35AB98E5177DE3FF97F031C91BD37C73307A3611D14F6C0100F44FD8A85B + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 44013388DE35170E8D291879D2341FC08EC54C100FD6D1904983838E999EC4848B196869 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 843C352DF0EFBBADAEB8ECA4A895BE081781C4F3B0E2E4A58F45BEC087D22F9C3241E1DB + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 29200065B0B32D06FD8CC55558EB694E8196E9AD9023C05843981B22E86B962F7D16272B + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = CD066CE45F9B76FB44567659A748FF4C8B54865F3017BD7C2FE05597ED97C934CABA7408 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = ABE52920F478A98F068A00E11A41B2C7467304820B2722ADC9B553A499C8F953439AF703 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = D67BC5B8D03654CF05C27BA8A201B19B29C3F97DDA4F3EFECEFE2DA4B2908B3869DFC5D0 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 68F24E76070DE0A6FED4AB230ABAA8329E3B90AB0FB99BD5368E06D6EEEA1DB701084731 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = A18E47E2BE0557F602055756DF66BA6EB38AB396395E831675F9E086891399B4E6F20DF1 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 4752BEF596ADF41112C34736E00217E3EA5768678129CA56D0545B900CD927C0A8BCA433 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = B919DFA285A5A882BCD002EDEA7787D3751B0EB13D06E12AD3482099A091EDABF361E471 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = DDEEB9D55D41105B423C222E903C814E6D1A7592A354DE6714B84E75852C17EC3B76C439 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 1F87AC13A609A1EE908D4DDA69E711DB123E63421357C2A645BD4DBE0D42780795B90DA3 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 1E951B7BF2EF1202112DDC7BC2E15565DE92723153DACF85D6CFDC76B319EA4B4FB37FE5 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = CCFBEDF3B9501122C73C18DF370D59349716FA5E32A58721C85D51E0D3DB1B0C059430D3 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 9F270C7196612E5C42E808DCA14890E355BB03D6BC23045FB4048562873F7F79B2C3C8A0 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = B4EBFEAAF33CAFCD2A7017F5D4D0638D8E41A8E9D8CC133F853A89C3560CC6E58FB0AA00 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7ED4A4ACB07F5A11711E57CA77DF2B709C65A010E1C47EA830D471B35C875630A2D5FEA1 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 22C903463C5778B9B886B6EB95DD7A97EBA35BAEEF3FDC4F14509B6AA4F287A8EADB9A27 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 043B62AF2F5F671F0A4464A18803CA15E6F488C5F2E3BD94D7CDE874C4FA08CC410CA53C + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C9CC114E946508AED4D9CDC95ADE1F88912E71F2537F04F1AF143D80FA86E3A4A866EFF4 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8D6668FBD31BAE1D869002A5F062AC744E0F384861811F5A366485C5CF42082ED3AA8C7F + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 575F7D33C817BCDC00D6083ABA5091461E6F7A58041A9987D5DB172E3D27BA10F675FE27 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A96580FA8049757E6520757B5336334A1249DD80296C47F6F48835BF619A823D69116C7B + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C1293B1AC0DD751FBA52A85953F2D62C76744D834118CC2B00F6CA8F605F815CD47A9980 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 65F79A2B465E7F117C0244D3B51F545ACD653BD190A8A6D065EC9C42D75BE0BFF7C56550 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 61823094B10FE08D7F51014255F9F4E331CDF1C1E51B45AB0E0D9A93A72061721CA0D316 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2E7FE00EADF808D5425C71D4625F8076E447D1B342E3266092FC49D56769BD2E822BB3D9 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3109850DCE8C33B5B4D3F9C24845A8804E0ACADFB54C42D5958B5631BA645D17EE32EE94 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5D419636B126307EE6DF150A74E4AD9776886AAFC7282599FD1AA3C5E413F2ECDF60ECCF + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2E709F53ABD724AE49D841EFA1131AAD706C57E4AC0CF7300F73B388FC9377DF154D2EB0 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A37D03B9372081756D88C72B7BDC9312D2D37250E3EFD67784C906E9538A0BB3CF774CE0 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FF3FD27D6AAE9632001881EE2F9493BDC0E64FF0D7DE7CFA482C309E0AD90E08515AEB79 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 0C88355679DE6B44408B463EC690CC509D9BC6E166A88AB1177A829B8F93F2ECCA4AFDF822 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = F7FC713E8EACDA4011D564848CC7445CFE5755A78C800FCEBE3ABCC200378E15098B218D65 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = C3EFC21880C6959305CB13ED806A96280FE22451F9E58BA72758B75C6560479F73B33D653F + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = C79A998054D6CE1844218CF9BAB1DFE410CB80F9A17925BDB34A7504758B2B04C59B733402 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = 64E7C2DD086B1D3DE95F1FCFFF4FC80704EF820A9613ECF57B5341576A530F9475AAA36E7F + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 7BE72ED32265DFD1FA0F656CC19A1C53428694B71A444103B2F6813099EB765F8C1799B34A + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 14AC7AC4CE525E7703C566C5C4CB5E733F557C68EAD66A8632A793BA8259B1CF7FC6FADD13 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 758268000F7DFCB2313611713F8D715418938CF0D021455627DDE5F8F1978D2D216C95567F + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 3C880A1145CE2E7B039E06D005CD5ADBF24380A5C543B54048B5091CB8BD113B443B520A00 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 8D0DC81DB2374669822C09B594535A570BC077474F614B42A947E928D1F9A8D9C40AA00302 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 9A7C0F2CED63F5D11EA5EE6D3667AC3E7E757F93D9BBDF28F166723C1BE0212261BCE0B994 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 0A49AD1A03E9CD47534A5E01B4C08C1BAE0E0390E3EB64C1ABA1B1C9C7727F9FE15714B24A + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = C6793C10BC500654A53914B9AAF419A85CB3379A8E1B43E9B7DB9227B674B27A4B5D8191E5 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 580F16DEC536D1C7923FC8ECBBB0419D267B5C6D06C884B77EC0329BC3239CC60876FBBDB4 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = DC817B27EF84E188A2B68462860F2E8C7C4E8EC7DC73CA462E457DFF1BEC5AEA64DA38F02F + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 535249D36968CE3318094537A3BB91545ABE05B7297E7744185A184A4C621ECB68320CAE6A + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 45E6C2E708B73CE902A93EEFD94304E641EEABF7F3BE394614D490505DD3085B674EE0ADC4 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9301219E88626E553CCCC3FEAA3BF27CEDC6D3877D04680DC4531AD49369816EDE12A77B18 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8FF6117A19626BFBA74ED189C7EA5751DDFB6A83CC4BCA99AFA0D40459D97A27302719A216 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4495DA67008D019E1E7C998D1F2EA9B87A33E4FBA2C427A6C5736729A4520AC3876BA59D39 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 83F573AA2A42F8F903B7D5B67C5E10D89BCEA5076647E5E53CC0DF43C3AC44A43146568AED + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 687B324B08D504C07FED48CA4CB33B962ABE9BEC1B1BF89B0D73D3070E64F4A732C0DA7803 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = ECA16AA73476E8957AC868AFB93D9463BEB7627997364D270952E7F6D743EC727C6B1FE700 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7339F04816D9723FB6280CEB7E6C3CC32A861CFCE30B75B07D92DBD2F001A5F3ECAF9CB267 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3A14AA9F8E3513B03AF5B708916315D0B706D1B308D2B6214ABE51C33E9798EE078939C0FC + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3F20680604B2F50239D1839B227627AA0D4B8834D6F64702CC81E1983A66B790551134F927 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AA23287E37C99C444D186C70F31282E1F59A3020F749358489847404D36AC2CF33D9DDB67F + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 98535C31A74C8DFE2538A6742F43633CF3DBB20393187087296AB8982F443AC22F8F718204 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1EEF0B0CB941D427B0CD42964884A3487E43C19734C72935186521FCEFDD889C8F0396AEC4 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6690D5758D0B948B3039A945A60EA95B0CEE6F58120B8BAA3B0B95A99D570B25DBF033ADCD + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F603618016D39C3CFE67892B5FB57596A2D93E9D51E0EB5273034D51D1D0B42843AEFFB89F + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = DF4990BAF4F2E8976B3A7CB504C8EFBB5ED2C0B0FB3E7DE3E6DC1B2B856D4F8FC960BF0149 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A8562A8F1339C1F8D6155C8579814D6D9D70BE9C7EA0539938EAAC39728E5CDCCC85646AE6 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = CAAAC3A199E5CF7B9E836C2E4E37CB2937244ED5769559BCE19979381D56EA6389DB423283E9 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 4A52C49CFCFDD4627585D583667F78707550C2498DB3530DD1BC8FFCEEB287D4FB0FB6ECC5F1 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = B1F993DB9371577D17DEC96FF27E72F1502073853F317966B6674E7938B50BA36DB69F315781 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = FFF43DA707D0A764844B5F040F958447EBD582E4B8B0620CAB60D3E8921C4B6DD85E8F52EA4A + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 42436DF07A38739274ECC5D0C7BD9841778D4A87E65B46CCBC16F38EB1E267109389025E732A + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = A418653B3F6B8C0122A1DF277C14BCCA90294DC8887F85D91F6F597A86E8E0A9EBB40E86C37A + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 0B473C7D75F3269BB29726E5013D9E9B1DEAE89E8BBBBBF63AE8D1224E1AFFC6BE4CC14E0822 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 1CB009C8CE6CB1B02AF24DDCABA738748A8798667F9098A32A4E5F54B0F5197A01CA2037E761 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = B8E486334FDB67D1318C06A365388331BF6064AD0127F2B07C30C4390BAEAFE8FE5220F77364 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 324CFCEE10FD1D5E5DB74D41C2C4C0A2B426A8971E5DAE9E6857D111F090551D8421E544D2C4 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 4EF5A50560888E7165FC20E5F8216DDE3AF3124A696696BEB613926DD867044887A3DE82E84A + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = C330CC9995A04E51F5E80FA81A6FD760A8AB069877337C8E6C29519D390C218A37454D692491 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = D8AD99AE058B96BF3F976957734D107520F07E546EFBFA326E0EB5778820B0FD888B16266823 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 0459314DD16DD0F3F93017A67273BF62D02221BB22919EDBDE92F45005CF0D4B356AA0CDB30E + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 2F8EBFC8D7219789AA2D46AA7774CE0FCC214EFE3A0B540D7FA2E9E6F0C29FA56295AC67E8EB + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 1E546A7A3C9BEC3115A1C57B83434187DA39ECB8AF1EAB216CC21DE60D537CAAF879BC606FA1 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3F3026ACA27DE67286191147E3B31E543623F54E7C114E84D6B6A0A811B64644E3653388E50D + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 81F61D5CF120623AA7A6080F7C382F87DB86D27F64EEB677B3FFC81689D1A551D32E129C6189 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A5A8A9A2C8E0E064E29C91D67044D53A1B3A450ACC292CFB014DC620DC00BC340C2C3A595396 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = AA0A4CE54D2F7C216A1AFE16EBC682F67B636FBB83201DFEFBCF6530CDFA946E0AE10E267BD8 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 959D372BFB863FF1E940B190234ECB4CD964F3A0A841BA5C51D99B785BEC95967CF8650E5F95 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 41C9F94B5A7BA17CA479C88175E2E85F8D29707FCDF4515583D4E783B4F3F3511C26F4D30382 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D1BC71E61E870D9A2073326D162789F282F43B4ACCDE67118DE40868220DFBC09DC964FE164D + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 0CD8D2AED8A20185CA8E81E1BAC1A097752A430C4809A534967335CC6597D86F34552B0F2F94 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4FBF939459AD906A1E9E70AF706013D5E607B62573619EEEBA0CC9D441FA0E74A5DD75E31CC4 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C2CF6FBE8A78411CCDFE8CA6865E9D767DAB2CB1625AC844AA88540340B38C4EFDE5D9B494C2 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3334AAD3DB494976FF61B72EC1431B5063D458BE1DAC5A7CA8C5FAB1E9B2B87336B41A9F8A70 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C4F6C4101EF1D1E58290E04127962D6C3C9D909C46F78BDA1752717891C42DA6CDDF8D8E67B7 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A0CE2089082A59DA267FDC447C1D4ED1FE26313D4C6339CEFB3A824F3D7283EA9471F336F953 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0DEB99D4005FB661D8FA78116832FAC3B827E7C37BA2DEB266FEBC4C8AF58827475DF8077FE1 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8DB0FEC8B4EA74961344EA5362681DAEC484C0A1D63D5B46B84B86F2BD998342D1F2C0045D48 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B1EF6205887BC032D66C68EC597A22D340346485C9ED443CE6A193E2D6BF11425E471D403965 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8C9D26D292D8C3510B3CC4ED49AEAEABFEF2D579DD0FC360246F34301EBC5BE3CB0CC9766CC7 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 4342B6375CAEAFC042FDAD93B39F7AFDE1C78BB740EE4AA6CD635CBFB14110AF7267C26D2B13C0 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = A1B26FF68BE6CB69B88E75D6A346437DCA9936DABEAD8A0834AD1E193776C4DC19B82657D2D917 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 53CF2CF3C82A3B48D45F02E87A71763275F03C09052788D87C89CB9A864DB05E2505546E934D5B + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = E582974E0E029F0734AAA09DD05C1DA581E3D6E4914DEBCE67E57BC98F4D3CA94F2D61038A8A9B + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = E4FE97658894428577EDED6B303366695522331097B5DF32FC4345E7DF6FD4733503C53FAE7B53 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = FA7A4BF12C69B36F10FA8D358F8A4563222EE2587ACD979BAFBC3649502B050D52D1853D81D40A + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 43E514F197282220CE4A54A37CCEC23C10691DBAC0FE2A4BFF55D9C87412A6330D075C1F28C5CD + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = C7602A0AEF045F69FE42EA10B938C20E11E013A2D1DE573CD1B2089D8FA73572117095AE8B7F1D + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 520AD11BD8DC2065F3FEECB4A123FFEC193951459121F8A101D7277EAC4722416BFBE82E09E422 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = F444D35DEBF61E46EE9E1B2F6F67E36BD5D50717C74D81B0EC6876079B7FDA322F28504687123D + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 853B6F3CCEEB806BB7B9B54111EA9BDCB4A3B898D0953BBCD1B2ABFA0DE761D9E7111C31A6D845 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 74B6744CA954E5BC680C9FADDEF33284222073FC806201891AEE33F83AFD49FB2411D613F7F20C + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 6E0E5015F169870EFC60062671187979E17B469CD02BCC90931954ABFF6138F54960543E41DF66 + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = A99E0E4C88245066033AE8CF5FE22B1620ED25D8EC784FC89A04F1CB3709395EC2EA23B77DF7AF + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 80DE0A46DAFF779DB30525A4DD4B3E332C601AC3CC9B1D4BC172F1F1C1BBC92DEE5DBFBDBECDCA + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = 2F5887BF2DC4C16030ED4D8156E8B0A586ADE223508FE24D11649C8542535B218454AE8C81BA1D + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7242C157D5882934037CB11B21A4A4E66CE05D81FB5F274A78CCABC0DE7B9006C1781E37551643 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F95DEC0A19B14E5ED0067A356F7B2A5FECF4DD69F3ACB5DD4348DDE32CF7D758F10061F612C748 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3A3F1ED70D95D39323FBB34997234F28886179CDCBF870ADD09816F4124740418986654CF13B3F + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3C08BE5EBB6FE3A9A1D37D3C5F55E904A0D1BDD4E1060ACD31E60F05372CB64CCDF3F383173CEF + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6899999441829004DC2DD3EAFB15BD6922D6280411FE956E8BB850D385A9BE25BCBF2BB32AEFD9 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F0EED9C82B41735C7DA911484A5609AA88897FDF0EA74A5B5812EE5AC724B75B469572E597B126 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CA95AB16423EA71AA4623D8CA880069E3742797CC3B549887518DEF1F2E0C1BDDC733B57A56A3F + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 91C75C183FCAD10F57BCAB7AFE8EECA2EEF689593D9B8265536FDFBF47004E047A212EB02C51CF + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = DE218B0190F1F432F361D395DE5F4ADAD5DFDAC217D35A63AA24557F976BF57EC53075C1FCF075 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C95F875B7420920EC84B26404052097B27E2B740837DF3545533354DBE8903247A52B9A1F26DED + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ED4D76FE1AD326DD35D85D01BACBC756A73E09034AA353BB60CE13994AC7D0DF574EF937BFD478 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 07C53914DFD789739B99A61804935834454AA25E3F4C318F84D8973CEB36FF0824AB79F54854F2 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B6FD97406DA3C9C2EEE032242CAC09C7B0F60764F810F2566D7BE58ACA30638D3C31BBEA193D1C + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 74E60A17AF502D85639D43EBF8EBE06472FBB2C8853DF2346380F609D753CD03059438CA282674 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 30F81E5BA360786675CFCC48E11F71A45055A6F91E5A2132D17FEC7B6D335926C3AFF6FFA1EEA7 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E3885223FC36AE2C78B2346B58DE18FCDA28629575E312087D756B58D5FEE6D24F618A4FB85A13 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 681BB9999815EDEADF2C96E0817D2866B91321AC7818399D38DF5069DA7A9216B8FB1F1C957536 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 0615B8133562E3312FCEE922057835C5EC588E8AA5253834FAFA480D2A5BE99BE5B7753730D4E3DD + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 86AFE5F3BD2944B08A0CF676BC3C54F75204DA02A6BF6AE2ADD461D7AD0A7AE6A8B70255A524DD89 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 14A02D8A82D6BD040DD3A04DC9AF2999D73BF95F625789A76996FDA2043F6EE4F9563203AC72A338 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 0BE26FB463D6069D1BD73D557AEE9B9E773853997998D1EE26F4270E9F7693DA76CBF7F4E675BE31 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 9A6971EB40F743AE38DFB4B914658888A5BFFBE5B2416DCC20B601FDC113D317978F5B5C1838338E + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 9671F33E3C157CC1E8296D40004A2DFAE2C9365369453302D710C73D902D46242F1504EBDEF8C89D + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 06EDE6F7E7247C19B896EDE5FFE3A4525030BDABA071573BEB6BBECB409C58C5DDC7352F21CB2183 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = ED3067EF5982B36687F2AD61BD13C07BDF02FC869E24A22C488808AAD5A2B31A614F7A0919C3C180 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 4CECE31B3110D2102A19E3109195C289B6CA96B199CE1682466D7F3501DC9D1E9723B54F8117C858 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 97F496613A1A124B820621C1200F4C724170DFB26D61393334BE0E2AC62816AA22DA2FFB9BEB486E + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 8C60CF1F667208E116D55975A6BED8D96CF69964803EC4C6B0EDE9A37FEF559A7FDE8FDCE8C9BAC7 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = D7282C6F91C23FD67BE76EA23AC9EFFF509DE21474A0B618453BB6F5CF603003DF0D22B4816A68E3 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = FD8D1E8E2DBD73AB9FE6F10862D82B422C9FE1AF01444F4223BFBFC688E54292EC3DAACF42D903F8 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 2EFC91520A3FC409D13EA36DAD72482034A0586BDC46E90DE51DCB35FB87719453B8199EA6F72498 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 67F5200105C417F2BCDF6CDE54AE7C0E7DF4174633A93D865BDBBBA206D4AE73AA17DED5FB2ACCDC + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 2A8C1771A1E6C10FE86F1084BE206F756229613D7495792046170EEA7DD7E7B0D98BDCB8026EBD35 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = A663DD61BA1B75A74C8B80D5C757C2CD0F960BB49316805356F9308B06B7C5BACAB721EE3ADF8685 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 30F9FED27BBBFAD6FE7FB567673AAA552933A5880298A521675B0CCAF1675DB10CA012A31788B670 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 30D63F34648C29E4902FCC13B32B8925EE1093B66AB6C0BC252E6FB9694079BA48FAF206EB7614D7 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A929BFEC0D472DFA55D8F0BDAE0700BE65177EA765F4A1683AD3388B7754202AF7F5FAE6A76B8C92 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6A6CE5AAC8A04D8252680FC7640DEFCF251BF6DEA697EF8E26C09A7BA731AFD2B9B705CE47DD12CA + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5732435ACDE3C04C217E9C45DCCA2E3ABDEDE740AFD4A75E73515769A7E89B4874286C8BE56CB85E + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6CDA43C11AA9D5B01ACD7E83E335A95573B0AAEA96BABBBAC47FFF33BCF778753BA12EC07BA945A6 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9D3851B4A1A41E608E3A50C8778FF7790B0F9A4D3E978887B4913E2C40B92B8FAAC7B5E082064A0E + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 61646F0407DE9F82F9B5C26C70CF9DAD8B96950CA5C0037F0D4BF54FCC8AFC6306587608A1104953 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E90FCB520687191E71F9EDA5B1162DA6EC283DE659236683D123451DD179E4F11E9BE7ACD2F8CE39 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D318AB27B078C6093A0C8789E5761104BCD647BC4E30B9423A84081C314E1D56075C29B42F455203 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5A908B98706DE765F9C9EAB5D12D1F04ABF282F0AED78D7A5BF085CB9BF41D46B38673C3850CB54F + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8EF7484A2F414D4EAD3A0D07B2881DD89CAF8AB06AAB2CCDC041698842469A4592E8D2BD0840BA31 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A370A47CC98F8C4EC91688C6447656845FECB9BC2832AD22F08B0371EF16A169CB22D4A73D82FF86 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BC088329D60587A92B0CBC9D3AD730E1717C82929A4770552B77BD92813596A3DBB55516B1CA3EA9 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 82F3C972603F474B80727BA5DACEC5ACE3ACE6E2608D51168D9D6E6C56E12E10BB363F23E59A45F1 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FE26015666D51AE788688555CADE413FD64221F018E458961712AEB056386D824A1BF77B8DD12F26 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 183D3D2D5FEBE8963DABC9DAE4F18D45099C7D88F43F2BB40CE537081CDDDFE1E5502805AA180F438A + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 5590318D7ADAD24B320567E46902B70ACE16D3035F7F8BFE02EEFD049C9118D340D1573608DAEDBC4D + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = B6836E78F9FADFFC76B770FB21283FD361260DD738507DFAD24B4B6D8B84D6FCC1444D923E3A2AA720 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = CF6B9C3F706E3CD51E8396D625C78C4BAA0A7BCEAFFEEFA7205AFCF367D8827122603049E3B0568FA8 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 9F4AB089CEA61CA3D95C58C1B189151E6B043BF7830FA58135FB6371CD8F06FE52BD21CC4EF2AFBAD0 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = F306EEF72ECC7F380A54245D174FA5C29F71A342F5804E577B844DF4FB69526032490E83677B7E6597 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 8493958A6E129068A0FA9C1F8EA2D8B572896D07D4AFCA411DC38CA6E750457DC0DC2050DB8B78070C + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 0931D92CD32042FDB1CBFCF2A33241A8347E7812C9BEF7948FFE7CF942D06CAF2957C02CB4965A46F7 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 4A8158E15CA96C068332F7F31AE23DD90C722BDC29F73A31B829B730CAADD693CCED5D33EA3C98444B + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 28B6C3BBB074A3AB5DD4FE18BCD9B1117AC5D2BEAC14B2BC39AB03EEA52041055DDBBE487CE74071B6 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = FBD9E3C1021FB6694D89F8199739E6067262A50F45D01C6E53FB6833EC035680A00644A53E1758845E + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 274E05A71CC879B8C2EDC484086D2700D88BCDEBD31087245C268A5151C8AE373948CB31DFB12A17B5 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = C1FC767D4DC1D57ADBF5650AB1B6ACF7A1AC61C801501C6D5DFB551E3568A261752B4FED2792F18B72 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 2AFCD6D129FCB819A8EFE95D332D0F06950C8C12F4A398450B6E45F84AD86E698806B24313F9A0449C + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = BB322631D99825F110143B161D87B6CBC2B7B558E5D3C78ADDA4819C6736E024D563AA50A2EDC144EF + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 06DC95589039D5C2A129E823569C15540B270054B6D3AD6105D139EEAC3715083387DD308A9C26E64C + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = A94AC0DDF29C6D039B49586EEDABA16081948A03511F44E15ECC5FDBD557342D6308842A24683C587D + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 57333273F7B80FBE88F0443891AF01EF3783BD952A19659AC13856A9E7124C95951DCFA4D4E71A6EC6 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F3A2FDB8E5DB8BD85CE64B9351C603690DA7D26483A8E9E1F131ACB383665F74BE2630365C84BE65FB + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5CBE12751CD85B9A7F78D3A196DC5E6F222BCE147DC07F68EB8ADB6C58E2B889C54C1D23E0A1157CCD + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E931D33F1597AEE5EE6402101581B3CE7C657AC199E123EE34A3524B96DB8715E6C053889A54F64920 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5AF822944B7A7FB2A58E4914C31A413B1EFE3126EAF82760CC34032BCBCBE0A6818E53D34491A99B40 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D5CFD5BDDADD21500EDC0CB3CB8A861B531822F796ED14743793A98B3D164B4443ADEADE271309FABF + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2201CDFF44E52CB4CF67E057AA299FC31310FA8F22DE91685FE5F53D2FCDCEF2FC708796B1649B6BDE + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4BFCB5FE133B0627CEB280F3E83919706A6F1D58DEBBE5AF3938048EAC780C9304B49B8D4A1C1190E9 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3742C930228518219205F6E9F1AAFC88DC00D75836987A9FDCBD9B2D00AA4580E8DF0F0383C8D0A39F + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E7FC68EB0AF9842F940564DE6DED4BD955A1182927E274200AFD0CCA591F683B12E416D0F11BE2B66E + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9CE38D5BB8F6B098FE54C7BF1C273F7E17198CEBF99BDD2F742CE8A4089B79E6373C9FED5B6BE01B70 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 93D7149F4D6649F381B82A590ED1EBA6D7D9088884666562A8AC47E5DC654FB94E52C0773AAFE24A21 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0C7905B42A6A73C5A060B89D00706C5E241CEAEA0BCD8D168318817BC55E7B0A773B4A628F9E7F52D2 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 329BE51A1ED7BD56446D519C0131ABDCE2A3CFCD7C31D37CAED0D51D17A3C63C551EBE824BCE893904 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A231DF8543E1BBA1A7291699A124D2CE6E6182602AF4831C81E3123235F16ED757238D69BE278C9CE6 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DCE182FED93D60A0689EDBA9B493E0CFC76D70F3B275F9324F490C2C4C1EB90488544DF1E54D61680C + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 1F86AE25209C374046EB8ADAE47E0F15CE2BDEF98CF93B9B97EAA0D5D689126A9FE3C5972C9878AF1639 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 8CDE4D55C4EBB3FF076C33539EBA0958B444378346F45916DCCC2253FC56B024FB8AE9501A0C21A8AA3F + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = CF1B8731F28C7DBD0A1AD66292DB360145BF25108E4CED95E22861AFD0A2D4D9F34D499E286D324E887A + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = EB6F677A4E3597290CAF6B77F4D0F12C91820B8E77832B8B2D0DF9D8C526B44351D514F2A6932FEA1E6A + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = E0EA33F5AC6B34AA2EC10ABD4A73C497F4E08335F1B0F922B7672D29254B666BAFF5F72510A47016F34C + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 62841CE65BB2EF9D2DBA11E54B1E17A8A629B4DED9EDCA82096BFAE660243D0D345E6427F30706B98E4D + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = CF3A8BA31A1084DA83F076F05059AAD7CE73CEA88C4F125E361E99B6A5AEF2E8EF384818F3AD5D26118D + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = CBEE0F405DD0E7D059F76D1DE15EAFE1CF8CA25670E59F7F0FC6101E08DBF9E7162FE8466A02ABB14115 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 5403A1F61DBCAD6B2BEC374CD949B666F475C505A1D814A4CBF272262AD59EB4D6CFDC6C9825AD1D2245 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 686FF250F41AB6A3A88166DAFA53E0EDFDCE601B54A03C50D318D1DF4BA84190698E20334CEB20019642 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 60EA776D6DE85422D84D5B617138F94FAF4086BC7AAF7700D8B0D5DDB94750CEBE41B524A2515BCE1AA3 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 5326A35B427A77E0BAF0F4A8BF0F4C86861632AC00D9357F7FBDF2692CA610E80FF6C93282621F6A79C3 + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 412C6020B11A88012DF8517B5F57CBB2F0C052246CFE9021979DD8AB70C42A8FA2893B4D2A7CA1A4D297 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 5FD9F2C4E55F3677795B7A41B5EED7FD10C6E0A5D4CF258313B36FA24494D24C7045BD58B433CC42DB61 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = B81593962144CBBFD0FB64A99D7112773FED1F68DB415600A8C7CD19EDA71113D377BF4E5DB1044FF34E + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 9B69AA217EA468A58D12409020E8DDAF636BDBEF58DD50CAEC71E3B9982763089EF0DB8061581AC7F488 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = C9DEF1A104C5067B7DEDAB341C980110FF98EBBBFCDB446F43E91ED2B39702B87BBE5ABB73DC4EE0302D + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 42CE3EF0C7A5ADB37A36A614067CA65AA88B77AE4CC8063661D7779B937491265674609E922439792F2B + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 93764F17CA4213CDDA76CE2255C29F136D02F2EBC70AADFE403E9C266326CEB49366DE337E9DF1447BAD + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 20CEC09A70C7F0E2B3B495340DA95F0D93BF70273806697123F2BD09F97001E3548CF4B753CCCDEAD3D4 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E6C7A6DE3644D4FF8C08447B54D4B6B8FBF624041D7873E5ECDEF9058669BE39D85486056BDE8EBF6A14 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 45DBF4E5EF54D694FA1707E9D9B884F39300DCC9039424C761730C74CBBAD2562FDCE11774755A585D2B + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9C5649081A83D73AEB4022984573535CE28252C664C598B4E14F1FD4CA908D000558C6C3584DF9DB613E + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 99EBAC00545DE97FEE5EBEA869C516B51220D72FAC2FE04F56C381A5C35D300A7364337A1B769DF0F159 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D92A99988B977A26C79EA4F9263923A41C8BD37DD340C4F5CDECD75CA5C757DFD48E4F9FF0D43FDD5D6D + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D9599A0C88BF5E0D56299499DD00966F0DE4F7BFA31673A96FBC4BA67AEC816FD334D23972DCB57AB720 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0F4CCA2B0B8BED7BCC25BD20B10DC2DC299D80F057648F37AF8710136CB8274561DD312E00A1CFC9127F + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = CC498D7E7F76AAAE7E8AB10E8755BF096CF7F2A87F9B62C562981E5B34542C2204E5265D3C39ABB29091 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 2A51C7F797612C15C1D1F119772F69AE88C13FFD95BCB04C2493A7527D300B08A022B9EBC6EA81C82020 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = BC6D2AAD04D9DB369DF09A1C6FCA0978DF0C4B68525470A894B21C5DC591BD02499B2FE0B17282DC0F01 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 66CFCCFC8F5A52E1C5B633AF2331B4FCD6FF177C4F516D596C4BE6002D7CCF433B65DE2114E059BF31DC + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 27A7E0B57F45D1C0977A530F724F52C76C7A5CA9001D0FAF51C075733C0AF2EF8AD6AAEA39579EDBD908 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6853A80F352653E990098520006AA85F1D80FE831104D72330715FC78B3418375638561B8C55E5F56DFE + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 08A2740DC2C3FA64FEBA456EACFE70B9985922F57CB728B471E5CD2AF41904B234C272F6F76F8A9297F629 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 62A05503437F4F4D6DD2517FBD06FE5E4FB4DE12917D421542102AD7A380F99151ADBD3C9FD9D1F8E56D8F + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 9E52F49A2133B58F372CD456237829D6E3F03CD71C01132057C1874268E256ABCDA06FC1F3189674A43CD0 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = CEDD44353C1CE8EDE2E2057E225A74EA80EA2DAD4BD2E17F6BF468A49E73930D15B51A8AE07EEEE17C0AA0 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = A1D08348644E5C05234E5134947F6C182CAEA78B51FB314705F97024ED0DCB1B84F1B1F72D4374A0D153F1 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 94CB24AC4957D9D8C28740E94D56F6BF40264111EC3EA9696BA83D567D1F182AF37E5AAF62E9E662C50A9E + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 451BCB21949FC82BBCE0B7AE16B7D92B37A3C3E6EA597E0894160B12222C91F6732C8331C3ABE30B2BEA15 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 5BF58730AEF9345AC66EB1801B5F4CEBBD59A1A66CC8F91A017FD0838888F56EFD820F392A285B6F53214E + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 7DAA5B21CE98E96865EC37EA1BAB1322A41F31A18B201D41C6E4A16CA40746B619ACBB05E2803BAE76072B + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 86C67F5D4604AB566D169CF658BA02355DA4F8FCD13A7551832E4968E62D061F1436FEF86D1AB8AC5560B3 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = D2A4C6BA8D3CBAE6371EAA2DF1689EDDAB8082B034A10B38C4DA8AE9172E6F1AFAA8E42DD6FEA8F0B33972 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = D9AF0EEBE2BDFF7895DE64063325E78FB357470A8D9F13666E77B0C7E20BEF4BB02AA56915C73D99F7E2DE + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 4C685321763EDEF2774D3EBFD05E2C26C1528B5C2DCFE179C22B773438F494E0A6D16AF01049271FEF9DA6 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = AAD3D4BC3E216590A979D559ADD142F5992ECD507040A861B95F81203D1934F554C8673EB7C865AD8AF669 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = E93ACD639E18067D60F459ADAFC2870E3DB1560A93B59EF9F8F7AFDC342512871B14EB852841FF97007FC4 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = F1F6FABBC34DAFACC6BAA943CFB782571F702C02B0CD76FBBA21461C0F844CAEF279F4B9D43C896EC5828E + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = F7BC3F3440A14513CC0EE348FD5DE42948D3CA937F63C9EF4FA9ECB3BB40A5A35A067684BD0FF2E84F43A6 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D4537583278AC690D196ECCEC8E93486F18FCEF496EA1FA5CF88F627F021D35D702F58E11D45084B03A6B4 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E8CEA54DAC2E004E5819A3BBA0FB6242B81D4B8F7ADB149F3F3EC1C92C886B66F748A89187A665F1BE2E6C + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0CA009A750296F87606DC314623BFA4E59155EE107D8E5AB6A563AE74E381A2171A154F7390D678667E0FC + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A115DD60D399184A85F975688C601D684FF5461B1A468F8EA47980EA6B58DD7AC846F4B8B190A4BCCE8EEB + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C490380F1DF1D24B1AE173F202AA1FD1805DB4F2AC19C76EE542FCBF40CE171EBD709EFE7A8AEBE090D58C + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C1E4F89A07325EF0543909F0F588CCA76981856D42209680A6A8E327B4D2D669122FAE7E4BBD908946FBDE + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4289BFD9FF4A098E91F79F8F1BF1A47A6D1E5AE4835E4EB0D951268A4DF7862CF432DEAF25FD33204D3274 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0B7211E464895F80C05FC18F90CAB23B2AA9B3E0B50353A8254A0F6A2B6CA1111141FDC5EEAFA6B71D770E + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3666B8B63169F8E180F1716AA71C651FC7620654C16935ED7B08FD429A28A9C0B99985DD384488374C1997 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0E40D3ADAC4523C93CC1E8CEB412F61A07E17089E9017AECDA289B3CA8084B77F3BA6412FD3BDF4E50FF2B + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 31CE196F6F8E9F4522BC274C2AFC2BBCDDEC1A3DAFB962D5394A6A093F923C2B9D7A73D4E67E40D12C6FDD + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E38F5CB7F9DED5496506F87AA770D2C0FD79A982ED3A7E4AD92E14617F6C0E00A0B0D15FB3BA1FB2F7AA46 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B85EA81EEE42E1D84646CC798F00ABE79604BFC84966333962566309940478CEF80CD33A62027FF0DF2C68 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 5B21F7448156546AF0D2222357C7A2F6371EF15E31BA2CA0AD5071783304665DF3257C7F25D98976D0131A + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 51FF5FE133617233FEA42101E732FC6DEC2CEB983C0E624B500E3CE5E94EBCC9B6F7AED1D8B943650398F7 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 101FADA14391AB8D0FC56B47014C1D08E80295FA30FF6701A241E8C09881C4D2CF0C840F81F86885A3B450 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = FE36809403CB90A1E8C1D534E0C434501DAA6C2521F234033E6AF84C548230B7B6B613FECBB8E448FA679278 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = C5A90DE55872AED1219A29D35BD740682282CF0EFAD9A91FAF29268129A9B42C183125E826D93FD199AE6C9A + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 37EB2BC246F3098687CAE585D3D68EF0847D26827D2EFBCBBA192C2EAB26A1E4329FA6B16D5B83D41B78A8B6 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = B5D24A5CF64AA7C4C9502AC7889176FC96FE9479CBAD69996B7E97F4D8E5AC70F778EE8BECF733A782FF64E1 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 382268E402A3722A1C219DF4F0A87830943FDFC16562B4895CBC41606443F52712F7D7028243177296B3A53E + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 2EF37C693C122EDA7F9DB400A195AC1F3DEF56A414EB0706591937303AB62B17F86FDC6035B2229E786E645C + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 605307DED3DA28457A6D021D45AA3B5BD5A1BA70C333E0169541C4202E3517217D4DFEF277E8285AE0671942 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 5BF982E1928B732E738A20C4BCAA17521F2A9753D58DD37D49E0BE9FAB3CBC81B63AA34B2879725C7B9AAB83 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = D03D24539621E6519C79E8E1AABE13B06F1964B937CD8DA4432E87226BE89CC2537FCE600DEA04C811F7FD95 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 4A935E79BFD6919DA3C18D57B7C3AD30E9B5182780BE6D0F0E490E530B9518F1A789EFB1AF7C6E2CA4B1B0C8 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 8BE2B8FD387673539A22B0777BD69AB2309C9FBF3B4FB50C770001371E4F45F08D6ACECDD058CBA7235B556E + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 7C32F2899723D3D25C42E06E75456F2C83EAD952B262178B49300089BE1F81910508AF865F2B07A27D856E57 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 564E50F3CB3958DCD2757D1398540C8B41160B44C0554706E37CC28EC0C15409F3E4FB090FC7A467144D4CAA + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = B39424B99426DAE367EBF413D5D60C832FADA6608D9C3182EAB8084BAA33496FAF4612C3D8B705A0774EA89D + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = BE52103EDCE3A0E4CF228900071F9C6E88AE5E36C7344CC47954FCD2CAC0F32B4F6FB0D82298687E190478CD + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = 5997D6AB52B3833002F1EEC129B2C8FA7AC1C5B81FE97F3241114C8D2A481E15A2F53FABA70BECDC5ED6365A + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = DF608952FC0C41163CD8156C64CDE91D8C160048AC6A777FA052BB5D4991A4540A6829E33A6402D2464AF48B + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 779A4C48AAF3D6D2A5C93AD506D761663ADD642694FFA135ECDEAD9A426682C7A1AB9CD2518B037C038260A7 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 92CF3A3D352971FD50642D438AF24C7EAD92EDEBC12E412B38B744DAC6F0BFB4C6E54C0F8451A83AFD79D790 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B8D64C45B003F8B8C029CE5D454B59426E5C1E4122E2BE12A092B139284DAE4942F2F6629A15858A4F5801CB + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B2BB3AEB31CA0EB7ADB64168DFFFDBF52DA2929F443298A0AF380C0059725A27B52268C337EE8767605DE207 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 04177B3270F941A0601BA55A95A0351281CDA34081A3391A9386EB90FAD153F8168C05C8FD43EC5C3C5F5C99 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 890038E457E846F1C4715952D83C64E4784BE62852954DF1EE0885CB71664CEF944FC58302121E21AFBC604C + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 508DBBD891FF56FA0D697D37AE25D452885F2C20DDFA9DCCAADD4CFB8ACC862E027A38CB47AA307CC8DE52D6 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = ECBD0EFD9AE886E37CED7338138E2CCC8372C2DC057F7C926CB60B60AA38D17C8CCA76CB87A799F054B4A343 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A31FAF507C27DAD0865F79D8F0BEA714CB10E530152E81C78E9BAA69170090ADB17DE76B048D2AAE4563473F + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 31BDEF4AE4E6BFE2334F0543B4C22AE68264C575BD5E2906CFA1A157D5EAEEB7474A5427B843313303BA80F5 + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DA7EE32E0C65E8EC37AD5E84DFEB038E1E92E1F962F3D5F7748D925169F04F41B77FE6BFC4EF312F989FA506 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D89F19991EACFEC917BA0A2279356114BEFE1755EC1B088BA64066AF3B20DD0F25A76C90B78CCBEC50F9B0FF + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3C016F4921C3C154F4164C2531AB29AA12CCDF9EB3E2A066CEE0F221AF65F426E947AF2A26A0359B6743AB5E + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D3244004F6ECC317F6CF602BD61904B15CF1FCC09C200936C50065788706D8EFAF8F12ED26ED1D212141833C + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5308273B7EDD1DC6A54C1B72B19EEEA30980B9BAE61ED1069AA5869B27F2E2B5E571EEF09CACC0F6A3BD128C + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8648080FE5BB17EEBC10F04CE8F425A6BE652610E2C0CA5B7B3DE3FBDD29835DC5A60D0D130FDA04B3B1829D + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = D459C826D2CDCAB8F5BD685F81038EC2B477F3C8EBA6070D6BDDD7780062387D7404C638D5446FA94DC437539A + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 61A5E27D24F3DF68CA63C311B1211AAA43E6B29972ABBECF069BAD20709BBE6C06A1CC843DD053DF744AE121B7 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 9048B2000C50B278ACE21B3F06A5D88901B09EE955833F37BFAC594CEFA01986603E7344039655768A0CEE581D + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 7CC61F11599339FD4439D5F13C28906AEA089C020BD16DA82AA5BD3E62B28DDD41456AE566B1CBE64971F8EE22 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = B07AD2B9CF30AC4D5FE4B8B3A0FCA59C960B75A81DFA96AE0FC07733190A424E15FCFFCB97C839BDCD7777879C + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 1B59F8A68F192413E6BB5CD7612856E11A2D5980311A140D33F82AE71909DE7B79FFA66CC7FDADF8B7D20D9D67 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 33CA2AFCF941DD9C43C01E1686DC31127D95231A36011D81F21AC460BCF7992C218B92983B3C0D8F4F498546A6 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 31E2AFB69583E88B8DC067916FA1B79CF22D7646D701CAFFC7AF91552A50550B110939A5DC443BA3B549B3D133 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 00DE09FDC9E828968FFA1A0D959008D26513A447A3EE5ECB13EFDE7EBE61FDD45B58CCDE954EBDA9DEB903404F + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = E099C23E462C176FC47FF291C6EE8297E1C9643F071B7A092D78C031FA0AB9F52799AF3E6FFDE7DAC068E476CF + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 729D93616969A5547CA61D6584339449DF4603BC6C1E297A10C159F0A51065E635535D01A732D5C1AFBC8D37F5 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 8302AC34B179D9D7CE42EFBE26AB1F5086FE7695E5592B2A287F264F6BAF219A5494C191358A40CA1E5BAE13F8 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 08A42703AFA618C06AAEF9ABDF45805549CDA63CC471BCD2257C1E7E2BF1B6B991D6EC09C1332F1C5FBCEBF6B2 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 0BC847CDFFE7C464FE403DAB6BEA3F9FC5746108DF8FA4A6E7D2BCC84FCE3992A0F637699271299036962C65C9 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 9BDEFE4C13117D686A02A470F715FDE2141B773BA5BB07492D29DDA6161F13530204A67D29921A3D2594E6CE2F + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = 22A304E8D2649A0623FF90DC01D4180D7A43CE5F390EF576A778EC8EFEA82DAFA1C8E902D004A5CD86E2212F58 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 9FE5A173199F1768613CBA6D55471BEA3B3F58E10620017FD1C1D973BEE2A2A0DD9E4EA403EE3F817BF852BB6A + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D1ACF937D3C9BBBC80ECF45E18397019195A8D3058D5B9F33A3062A79C7F986C5042F30192180C8F979ECE7105 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = ACC9FB613E8866F05F27E3C04BA12C3C7C763735C55A1D67AB35FBF33C24DF60CB534B5C1FA0585C17D3F9C957 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6C8EF1F20FEEF0490DD0F6CCB91B2C36EE180A398345F68EBB7B2E47A1A36128F67F3BFBB94F3661F1B6965110 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2175FCAB2F43068EBC60A78241AC223AEFE89B604A400949F14D6BDD946390AD40E6030094ECBB1D7C1FC2C8D5 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 906C721296F0C62C5AA21D025A9C10264C13876B3AFBA6FBD4A11E255971E013D68B25D9E200273892E8163327 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F2F6E9B1A1E0617DAA2A806456131CDC9D7C86E5E967EE421F4F3362864C38C7A4EC9E592AE4C69C36E95BE6C7 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4380A3F24E3346A2E497F37CCBA59719BD817DAB160EC977888ED7DE608B26AA4F9D0CE3301ADD55C9EBB9000A + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 91E9041DE3391C811936FF943869273334C2E39CA3070DECAF65F608417B2955B8B4A87A6B580EAF5E8D3E3141 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ECF9D5B8CCBCC73B3688CFB9C4092C9D726B8DF8E9C5751190C85D942B0FA800762A06377F37A61BFBB497E3E7 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 348F4EDA755893A25E3C9930647C83E0B371FE594DF789A2170C122DA441F3D2E822F4B516EA6A584FFA5EBAE4 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DB011C264A58A3D3F6253923D26FA23F202E4A6742127F72E3A1FEEAB27A441A718B8945DE402350EFAD2B9600 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 87494CDD167876EBB2F6774AA57DA98A3B0EAC20A0299902F248FE6B559C0BB800CD6230632C2BB17492FD6BDC + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C19434AF56858861B1C29E0102AA7A26E77F460E725301809534357F27EE3683B484E882FA295550A67A626A65 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1DE88F2D3A8E2305B80D396228B219CADADA1F65CBDEE50441664FC9186B7EB10FA4A3E136B4E1C2002DDEE086 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E2664F8CD02FE6EAFA937A5104DE863C80E8ACD1B75E18B61196403D8E4C989B7A047A4CDCB56D8B3C1CD05147 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 447A73D6F93605738E1C167426E512649F16429D1F78459436A84173C5F2F745B4926C7E6E9872EA6306BB69B5 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 8E994A9EB08E976429759873943E6B9BE852C33F9471E1E2C253CCD91876476E9FC52057170C71F784DF1E3F03E0 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 38A80BD1841D2C460F393847AABBF010F57704CED1E6D9964940EB31BA7433663CECBC504B917DA4DC884166C283 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = DC0414811711091D0973244600FB31291AEF3858F2DD12DDA866830AD1BAD06EE67855D41F91A022A58E57CEAE95 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 41BB49EF05A8A05525D2B1A01BA40E52AF93EF3BBFC819FC60DA086C8CC8D05E9DCA6B32F4C1823A3809968C9A65 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 1472A1A7C9D64D38E2C7E82B49250B18500374C7A9D7AFD704369ADBEA95819324C92EE7853B885793CFE50E246F + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 6C59B55E615096E4A9652B22C6629EE70C4869F0C0D85B5EA3ADFA1A0BCB99B5E7E92B479ACA93035FC89BCEE566 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 1D91D35A52782B590658B81F27C50FAAEB28840479B150C312C526C9EEF96525F191148669CCC8752EBFDD99425B + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 36E20C9206F142B2A8B2F0CB8C688683B2683D1B8AE5F85457EAF2E8A7A3DAF7DA7C34CBAEF3C2E5754AB3A4E1DC + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 5DD0B71B40E19C5B99D7F414308C0C5833C926043592084E9060DC8FCD476743507E66328CD08A13303AC17192C4 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = C6C00123E72A60AE1098BF6933582CB0312B0F9D9E126DC964E5277745F7434E21F36ECA6147BD3EF6E7FBBCCA94 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = B179B98E2636FC31124386D2D46E54018CE59E5B6B1466F25CF2173B8BF67948EFECAAFB0901BA282D162F5C5405 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 367D8BE55E8C0780F95577DFAE2437828240F0B344A22241DE2636E45D959E7EDB19A2AEF5439D5C45002A837A66 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 3FE4D221F9C37978AC8764AB1115C3044E557E75C63106203D98187C96479911959332E6EEECD14D2F559FCA1607 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = D94CED8619D3EF5B649BCD84A4298B400130185A71D26C94F5BA9C75664722E230C9430C73EB458FCCA1EA66866F + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 524AC9D4560658DD606AF20C9B5D80B4C35E150D0BC8FB86F9CAD82408A83CE32550531901F51A05C6A6DB99C7A2 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = E073C45FE1C182394C06851EED8F73FB7471E7A1744118B57E9D22A03E5FE608D60BF87BB23437501E33F1819B38 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = EF106C2E1A99C684E7B787E5ABE5150C9845D8C6BC7B2B8C7DBFB8844DB2AF7E5C193CAF5DD7AC7BFD432332FD0D + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3A58CC4D78B5C8F52E0D070D6E6E205FE2834521983BEF90DA89F0EA80B338CA4A6313F762F0554CACF7A9786794 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B584B41D2164971979E6ED2230BC4434A2C0FDF7233D2D401FBE015478B7AA931DFCC46DB17919C1CC8257E42A8E + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E527E836D1D10DBFDA0E725775B7874CD71BC850BE1DE7F25DCDD12B349B13563A463D28D4EA2E90C9818DB9F2B9 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 81251D3AF80CCFABD024527840099C05B053048C46B1CE485B3AF8EC2F40B8B82DC20742D53E28D80D524C8E3018 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5B9642D89E7BE5A52A6D130F91968C01F4BC16FCCDAD5734978F68795A12BC7D7C84E365D471F581BFF2957D69A7 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7492CCDC4397299991DABD6A3F15731883BCBA473971295D11BDAFA07D135B96107D922A4E71DC14A2E796BE67F1 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F93C29056AA5B1F4D5B2A1E32CCCAB9D83C67B9823595E2861066B0203B204651B7E951ACB2D2BABE8DD97E55B47 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 893061B9611F71FA9DF0E9BC893635F6987952D9538E196B6200249290D0988736DB4C24C999F733468098D33E42 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1817887374B611ECAF30BE20E6B0CAA48EEE11CE07BA5E5DE806F65FFC63D15D6AD561E72A7ECF56030E9CB582DC + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A621C52D3735AD5BEA497B9A7D8563EB9A032D96FCD851E770C93B035E0129756D2F02403661997BD9F48380467A + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3D544DBF7F5D767102D2063E187B57F5092D4BADB61D04B8515CE748EE5409EB79D45818B12D542DC800286D376C + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 378CB93BE70D77161066CC0472EF7318BFA35F85D6AB86AB19AA9718A465D161AE57BD73178245E755F28EE33F11 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D2B058212E1BFD6543FDA7A75720F173A2B64B7FFDB9EDE3AA9DF31241C797A703B873DDBB0018D482681FB887F8 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 835D2B7D717027AFC224669196FE7C8B812217017A64415EF617372FDE6F037E34DC96C5A722D44B06369B738EEC + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = DE1BEC74E1CB7EBCE87F717A9D255B111D44F83F33C2D0E7EE1CE1F4CBC5E293DD68FF47D8C5110D58CC90212386 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8B427E508FB8673159F7575D130B2B82C573F4DA761DE2F1C8562D1E78E099D5FEB64F1435FDCB300526E88179C6 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 65CCA173C045AB2535A41C50647B466583AE342BB8364D6C99CDBE4B4B747CF50D9240454E426A6E67A868E33FE614 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 3220BC1EE520A6C475D8C62495DC03123F79A806428BD107AC865755D13F151D1F94BB5CCFBEFDCD54C23F5F63C23A + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 99928D89012B30256A6087FCEE7F2177D0CB36455ADB3185F459BAB8F4758CF90CC4BEBEE20BD1C7F18214C99DCC10 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 2388E8F93DA6372227077C73955E6FDF184F65B721480463CD0D91BCED9A63ABE1F5E88F09890C352E6236BED655A9 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = E21DC0F95E94E001A24932FDC93E89CFBD1E67247F0DA43E5CF831822B3E34BAB60C2463B2AEF2E284DCDE563AD4BD + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = D2910E5A2F35011FCA31EE6A615C658C78E6C66377ED8FBFF735DF778BFDEE91AE485F883175CC0E8B9245D97B065A + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = C7BECC1A07ED276B2E87320D4942EC9B9F582C839DE23844D94B71C1B54050154C3E035485A5930CD854F83E4F2DFE + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = C35F6C2ADF7268DE666CFFBA99262A047E051A12714CA8683FEE77AAD1C6DE2F9A8BCF132F362BDEBDE2550A7FA59A + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 0F249F500DE2E406FD53752CE7CBD3A5DFCC676ED9A5BD532BE20AA66744B4A9A495DAB814882BC9EA00F5E056FFC7 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 811D5D4029A9F4EE818AC51FBFE014EF70C136B78153A08B380448A4B296B26B954F498CE47E618DD0E6653F8C7BDF + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = B6CB7FD726E7A03268F9160E4FAF2254D0E187D3CB244776A2F7CE9DA52771BDB0BE8A3B67E4A5CF1CE6AA187A6BD1 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 3BF05999E87D72414FDF6D3912D5BF5AA1AEE1D5BA9DE3E8E19A171B8E4CCB8776FE6C263288B9D8A56460E44FC2CC + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 009EA1BC50220120087A6C1CD3F8EA200CDB6B15561E43F39DD117FF313C20E877CF521A66D7A1EACE8944CFB90BCD + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = BA08CF6CBC1F30FD53CCDAC3320DA3327BB791B743A72F14E20A806BCA5A407EF86D755954BE0378A164234AFF26E1 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 6D58A28231AAF14E5FBAD9DFD37B60059F2F95A2C98E873B6429E29C3228E20CFE77558609982091E4F1CB69208880 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 4AAF25E0F2691A95C09DB32A832B2F33F07A2DBD740BF9AE2E921CF9D9D500A63E490FB04F63DC8BF64CFB2620DC8C + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = A2C73D79F5398D7069279D5C9886A65284AC160458FDF6AAB574F084DD39607E2305D80AA57FE301960F4AB573F750 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DDBEAE5FAF8E10CA5ACDCA36226EDE8C0BD096149C427AB107644F13D30C5AD6F4463B2F13394FE9E7F2812D139321 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = FFC9D501881484346DDACF00B6163C2F7B505C54BA731F7F62EA6B80076DE5C0A82B646508ADE52CED708172C4409D + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 45743E0AB03647A35B36D57881422F5B21185A4E357714F8349CF2539107BA2C7EB264A3B11FBAE866FEC4A728EE37 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F4E563EC13A6E7ADC5574D2021949D5A81876FA54FA206A841883742EDEEA994E7F03DD43A3FE5EA191C34D8A0CB09 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3CE1EABD4FD3DA419407BBA542BF482E3C5B5E0779857ADDA056A6685A2EBEE9A008EA5F530B304C7EA67B6F7AED97 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 1DA494A6FA6D2D9FDFA4ADEEFE25DCAEF055C66D6414F0E29CA05E8F900EC2CC453669FDE897154AFD2B8A7AD4537A + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 14D99D277CCB54B8C05083325FA10E6F83CE185A24F725395DD912C60E70FF811325E8C616F88B9155D0FF33822DC9 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0E32CE151B1400D4739E024C9214547CC7E4FE565ED3497A0B22DFC9CAE5A3F927845DE66729A818A50DCC385532EE + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0CD7B685E00F5AADC75B47B82FDBFF0274012BBD24CC1DB394F578A18C0211F5A8A9DEDA7D3451233EACCBFC020875 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 756FBB9255CF78B9BEDE42B2F1EA0A6681AA96DDDCC0B9E0CF92A51BA74087EED0411E8820272CD66580E8869A07DF + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = CF4E96CE179E9BDC2A127D0667D67430E9B6E9B9B5469D837ED4751BBD623BBEF6633C98C218F988A4EF172A0EE39F + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 844AB703158FC1C928AE4D4AD75AFE754C7AA1933B3A40D5DA21ADE93EB77D9A40EA116C8F7FD8284FD01585769832 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 33C91E336BF8724F274B50F6AE48ECD8590594C4051E6A3F0DBA3A2DB99C94597181CE89C29CCF21227267D25B5C3A + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BD4A1E9740A1A40D8862462920F80E8BA0B2D90099684A4B11AC99C1BA889DD4A1E0FA97602495371C0FFF625DE06C + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E4922055952816D825BA9E5DA85F5AE28E72F36CE9090ECE2A7DC0E7BE62CD36A53D64B0A6375A7FB05D174EF4053C + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CDEC5DBED829C1526002B9FAFD07CD38EA109CA552ED759FDDD4B2926890190646CFDDF71F4DDB44DE748D1A930739 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = BD14F783056788BF8EE192F2A1A3ABC055F33792C0A581455CF9BDEE7D8324BC1C58387E91F15AFE31C506FB6FFFE25E + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 80019A7582B0CD4F739DAEE7D2CF797F0E671FACF30E87B2A92E1916E8F60D43F0C722B22F1D39DF831FF941AB650E8E + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 26468F73B9E6C1888C6FC5799BEAC0F82AAA3E69EC4FFAC3FF5AD9E884D5AF5BC32B45BEE76AE1BB8A5ACEB67DB56551 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 1C1F5BF152910EC036015F12C386718CEBE221C0935F594281E410E6417C0D4C2DF930E9D95758722664666791402033 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 4CDF2E8D07C9934746474BAE5140FCFC507281D238826A2BAFA0907A69C8B3696E6D664296562254834D93D822826B1A + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 59C341B359F76A83EE3AE52E4F40C0AC7DC5B389CB24E06BDB79F42AB84793FB84F299E7206703C0C1C2A7B2713F0F30 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 0B71ADF8419F29A80AA585FE6968E0936FBDE9E46AFAD64921CA4BE95DB1306E600EC02497EDCADFD6E77D133FC20C66 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 9D913ED6324CB9AF2FDBF73ED020903809C4D16F5B4A237AEF5EE33531F37B40C440103E350BC7DBA51AA377A164359F + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 63E019E2BC65A730645DDB65086A6C6DD29DE0C6909BDCD5C49BBE6014C939A3FB720C784BEACE8ECD78A3E0FB65A298 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 5927FDB0A1759F28F0CE1D3EE4BAE0E14B8A86A97D9F2D4B6C2792614507E1E26ED4274F561852562563EA0137238F78 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 38DBBD5BD9821CA9454F28C375D88798D4AE0267B2823D9EBE817454B08A43AFC64E92BA29319D5D648137199A8FB723 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = D0ACEB19995C4A9AA98AACE39A773EDCEFC213F847C92323AFEB9903FD937DEB9E7D97FB98076D4C746EC6052061B885 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 3AE5DAD426FC419B99E198E8AA6590176353908C68A3D20E4BCE7079A34B7E36C4B602EBD1711E8824C2F672ABA96015 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = FECF987B1DAD9A693234F346EC2695CA3E279A41CE2287751583C2A02CF10145729A0E4C5DFBFBAD7C321B206082C25A + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = B958392575871E0E5227BE112843835500C06FAB30F59298B45F376FCE72C6501F0C06C66D79F763DB027651E5568D52 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = E7B4596612906D4EAD667AEA1D15EB27B0C2EAA79197256D1DD674E305C83271FE387F5BB47CB2730CFA9ECBF33B2196 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = DA963AEE2A51656B08EDEAF54F58E7300891FA9B9866B0A45E37D30F1DA40E7F44D0D8333F32629620BC3006A4272C28 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8C70C9884FB915E1DA6AD8CA1A5876F8E2E71FFAEFB54043DFCEF43E001BC50A3D7FB78637A90A297D57DC720FD09C67 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F181D3D0725F6A125D0D00471EF2431371F010E4C5184B493D51336B784B1FFA66A186A64E45A0F84ABF42433FB22F7D + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DB44720526D9D37F55922EE2BE385717B1E891EDA60F742249B63B6E35D29D8777E6F9D119200F1598FFED58CA119720 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9224ADE9C4AB82CC63840D14589BDC2D01BCB33FD1304F70FD1D3ED23987CCEC771C0F1AF26A384A6992E8DC9EC6AD1A + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3AB8C3E00953A352226F9501F1AAB74D22F8612B5D3019F61D9779F60AC343CAF2A9C64F1B6268FE301C0436987FBCEF + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D9176344EBAAD298B88F9296E9C9966681C44224ABCE57A50A3AA081A9D8DE23239C20EFE55B35A8452E46CC24611D06 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D5B9566076DF4A4EAEFF46FF2B5D12CCD4DDE2E2B30CB8C3EB4E667207101A4B02C63D5E9E35A04140F75AD42BC5493E + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C2A88C46E190CA4E746279ECA58E57E6822FA82D737FFF9763A5D3369B076E61C86E90B15E0E0C9904FEC1D0184A80A9 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8ED630E48204F2779F658090D08C050ECD2470EA3B99EA4F190E93A1DD6DE1547027611BC6E8D7E7CE1858F82B9C716F + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 935A04EDB480C16B758907E5164FB038D6C58AC1A0F38E6631F2BDC861C8F912932E9FC9800FCCB5453FF5E24EA45AA5 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F76BCA9BEF86D34132C12B481CC4BB21D0607EF11AA5062DECC555341F77AAA35A756CBFF2E234E111B4384F3634D12D + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4144F934DE79326409CA117E94E759A2310BDAFB06C23F88A08105EA98C834A55F3BAA8BA9D4B4A7BC41B10369470907 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 11CB6DE4F97F4973865B3FB7AC31A9D0FC8293AB368298C3A04A6CA9D9052A1240F73A426FD04638FD300BBF2DB0EAF6 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 5DF040290D2CE9AE2D10FF377D317C04A1FCA5B51214A124AFABFEC4AB703B429B00607AB70F7B766813CFEA8E29A9ED + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7891A6A79BA6B68169E8969FEE7F857E8645582D22600F372B2F649FAF46126ABF0118D60B7A2A2C362C5B317A51EEE7 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 033BD399095BAE09294C88AA8FDE508229A3AF401B95F8A27039DC03378BA740615D1AF2F4393868385E7CB175B2E665 + diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..f13a728 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m1_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m1_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm1v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/LWC_AEAD_KAT_128_96.txt b/romulus/Implementations/crypto_aead/romulusm2v1/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..a76f18a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = C90F619FF363B13D980EA3B28D620BAA + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = 3A971D74FD7D8966300A5EC5C6A4443D + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 03D3D92EF92F2D640A4403D6818860E7 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 318347822348F7DDAA2565A32F7ECF65 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 691061001FD1BDC3484DD36C9CD05489 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 2108DBAADB255728213C69F0332B8A89 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 4970AC0B3B98F2A0C2C5349DC72069A5 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 5AD88D12EB9E781798C3F690CA59004F + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = ECB8878035AE951E50D4075DCF5322F5 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = F0705D93267C3A31DA5E1455BADAA9E3 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = BA412D9E8FADDE475EE50F7140B4F843 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = AB8AB194023840ADEE7361E96F0A53EC + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 83AC9930113086A8571359A409CB8EF8 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = 0E8892EAFF82194F6B785F1F748C9F3B + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = D58AA27FF4BC5617401BFC54F46E25CC + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = D47FC2FECD330EB9519C90C4CCC4812D + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = FD581C69F162D108C8E67F0B0433E80D + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B3DCE3FA402520C92F0D6CC4F0764262 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7AF4AC00266D4F0D763175698A48E8AD + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 604DAE08C1E382E495CFF1F148D952A1 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4A1339D6A88D492676D7BD400FDA35F5 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8E81C6F415F076CE79FDFAFAF6145A2E + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 2E3A3671805CD343421E95B5FE3E2BCE + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E5FB1B7FFF5354A016D998616B975123 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8472730C63B3C7C770E9290D4AB9B3EA + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A638452E5E87190570B756A14F6B9BB4 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BB00D7FCFD54CA07940F45C926338E85 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 22320A53DFE2502A0FCD6FF45AD81364 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B442BD5667863F2568B9D3EC334158A1 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B460B18EDA4D2756F527BE162CF1A6BA + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 51E8F720B9D27CE185637DA30DEF3557 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AE003733A8BE94A14E3C8D4BF8D1F0A8 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 08F4551396C23AEC8CC154B0001B6497 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 203F668C50FED0D8ADB163A6E686AFCBD4 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = 5043F7EA1C56BC0D23E9676D58E3D28730 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = CD0E9915B27A6E184ED2BD13D2D206E1C7 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = C7ED4BE3D6C49307681D6E45FA2CC8AB26 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = AB1940D5BC9EB9C25BF4A46AE95DF5C3C6 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 49B92563A9A9DE25E57B82758B87006D36 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = E70FA64EEFC22DA92246D0F2932B081278 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 686DCBCBB222EA7EFD9600057A1DC2415D + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = D7B1ADCF336EE05F5053F70291DC404CAE + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = CE4384BCBACE1B6F1AA458BC4F27772421 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = D6CBC8CB06C9806BAB250A82B54DB4C0CD + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = 941090A93CC99493D39C1C08558868E505 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = 73DCA0EF238C65F1115811EE02765E9AB0 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = F0799D1DFC63EBF0BD3DE15C2A7E6CFDE7 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 9F7DB492C3F393B9098E6D5438A689FEBC + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 05B80037582902CBD6AA8AA151CAE666FD + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 89ABF93A2F5C782C98260D340854DF5AF6 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B77470491F183DF6372F4D8268C24F5231 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7D24FA2A748A122D22411D2AD5FF184F24 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2C3CABD03C8C002481C4718F7952B9D209 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6C7FDA12A77D92C7CEF320A73BE4D60FA4 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EB614D7BAAB4159EB1801FDB0AA03E6981 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 61E286FBC34372A609B660C40DA486EF5B + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2B412379419FEA937DAD9BAFC4FC10F75D + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 914A7D8B560CFD03E80D179FB40E30BB5F + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 12908BC5B8817E733AAE435C66F029231F + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D3ADEABAA26A3CF208B4BBBDE47E286046 + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2725409A7C796AEB74375ED0077DAA5F7E + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F131C58A47218BB7E36A73BC7CAB3F2116 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 39F0D9EEFAAD5EC8F475D7C856B0483675 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 920CCCB809F35720166D7B0380EDD34DE7 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E99E7B55DA5377ADF3A8603289BAE8702B + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 32C330F88B418E1215FC60CC042E042D93 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = C870D5AFEA02A98C3DF9CD425C560F87F489 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 6F8F38A7CCF66BFBED3BEB0B81489E39BA94 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = 6F577F79CED8A0F43AEAE141647DE364DB8B + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = B8B27D101937CDCAD2043BF5F0A471D92B6C + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 0F778CC2BBC9F3E1D91FF6563EA397E7937A + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 010E1BC779120078E3CDC4581FC51CE5A401 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 6FD6B26705D8FC2A9C0AD876C67623E93C30 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 16E265EE7C6938A5EAEF5EA254EFC7475BD4 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = 7EB312B6E8B5D843BD3BEB5ACF99A86C65E9 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 49B722EC0C6C68AD6D9640FF7FC8336D5C42 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 9CB1BDC62460D9EFB65D97E34081C4CE45FA + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = 43A5374D0CE5DB2B3F811E55340E499FB92F + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = 8F8506755C8E3A72BADCC1F53DBABFAA05C3 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 2171A1FC875F8F3AEFAB19CE0BC73BE0AB71 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 0C3C26F606C17AA66B08EC26BCE5857E6CF4 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = D48D0E75E5EF1DEB04122A169CB783607607 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 11590B4787A695ED3B3E56E4C4EACB436C63 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 201EDB0AE82B38AD26BE884E7E47BDE2595B + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8279376F5626A231D7115A0E012E358A1451 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E93C95DA933692196A0E15251CE1DF054DA8 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8C0667AEE4AAE384B681ED1B55C25C63BE47 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 150F17BCFBD0084773E24AA4B6E21FD91FB7 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E79D0D77A6A92083CF13B063C8692761C979 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 38F62D10BB97EC5AD6B9D4EACAEA43D4E053 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2938AF85EF14068FBA585B8A61EE1E92102B + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 2E2C21E01EFABC158C396CCD280A5239B216 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9FE03B7440D5BA75566F8B814BE710765210 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F7C3F09DD62A9295300E4D2F9B62BF480517 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 696F25612C61FD4F2C744ED4517C3410F20E + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9BA8225FDD0D51BDC49F13DF6D592ED7A62F + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 01D90BEC35AE4B58F482BCD1E562C588D6D0 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6E893441E998D5F3270A6249B3AF6BD8F656 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F6369CDD6BC136B36BD395A3AA448671D5FD + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = F2201A53A00B281941FE24385DB76155668998 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = C704570442BA4E958440CD13974C3D86544BF7 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = 1AD5043D28BA6A8923254D390A5B6FA0CF9AD9 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = 5D35408BD39E801644B4F517D44CE0ED5088A9 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = 6F6BAA554E44C46E61B986EE2961C88FF8F070 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = E81A31CE8C65F1920FBCDF5C8D55A32DB6D48A + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = CBE8243E96727232DBCBCDBFFCB9E6D8D50106 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = ECF527A6E98539C81339367EB467345CD000DB + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = AE04D7A44398B4070A00355563CB417EF40248 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 3477D085E61CECBC7141E218FE4FD976CA6D98 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = F27824B1B85C0123FCD9FF9A9CF3D1DFCC0771 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = BE36B261E5E4D9D347E2985F2C4DA29A54C0E2 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 19FD20FE5689A76764FEC25330B5FEF67BA72A + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 5F811DCEA8CFA715C867AC5A5E5672EB40EDDB + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = EF765F95CCD9E1340D8A0EFC75E451533E7D6E + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = F7ACD5914E70EB68664D589B4C4E04EAC33E90 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 567F510D4970BF619478C6D5A6875FF37BFD80 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7231A29EC7233809C7D7D437A0FBA6856AB195 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3295094B15B8EB1F51D70E1F5315C3C0FA309E + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = CF668AF6C3222F29BF64B4F192BCFAFEE0642B + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2AA402283189861279D5CF6A98EAFE82AA4B4A + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2A08D05FD16BFC3DFD16D4DAB464EF9744FCA4 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 95627D5738500E47A4A31EC3CCE61508A09426 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C48EDD2811EA2D0EFFACD6F4F7E8FFCDB8408E + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 373823CA19E177F84EB6175B7CF066D2C2D858 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0DD3CBE77224C061132DCFA4985C476E8E1C7F + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 554E25639BC88454F07ED4A9DDEBFC85311B90 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DD34C6F315E3E0C204DE7AB25CE888876C77AA + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 84FA1773D470A6CAA781131492BDDC8F215BA3 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B8AB12A07CFA16CB7EF7DEFC55FDCB87DFF964 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4694A232C2967401AF5308E3BD104455DB7A7F + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2BC38BEA358E2B9CC55BED510C269A0D0B3B86 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 4E12FC02CD120CC566DFE9F2237820F76FC4D8 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = C24A8E8331E9560D2FDB6D6A9E57FF37A954D95E + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = 539BD4667566E30D4B7C8EBCA19EE1D485B36520 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = E6B5FD64C402728F1C55DFE7AA0C974618ADF3C8 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = 07E9B819117A06F9552159A6781616EB33EA1B73 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = C1606C15467E903C1130C605AA7438A253D83005 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = 6958DA985FB2E1CCFC5CBC7AB48EBB5C74F434DF + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 6E91F665ABDCCFCAFC1C6CF9EDFB16C497B2A9D5 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = E28BE514123DAAB74F10C175672478561B936863 + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = 94FB82BC66F7A56DA2AEE8FB49F33E8B7F702C00 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = B5F024D2D49C453F39D80C1372A0777D6A8CE04C + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 68FF6D948FCAC97243DA0AA17300DC073C501D72 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = 5D1DF5A2B9CBBE951B0D4476D541AAFC57D97D90 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = 3D0BF9C15DF6A5BAA04B5691B5C28E4B7E51224D + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 3BFFEF82DD4F80524C10EE0D13DA0950838220D4 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = FAF26684C8A2EE3A6B4F428616BCD3C2CA745675 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 12928F1F381ECDBDAA7CADD8A86C846433541D12 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 263E299F2CE04110FA94F2A3585951E7CD8D027F + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 09DB59179B31301A9DD1D3ACB9752DF01820F8C7 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D48307BD927FEBC105DE350BB97A414300B9927D + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F57FF1DEA5DDC7D5644C6B2168ECBFE1EA9D211F + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 60F5C9796A7D295F6CD22DD1B2DC7292A4686A16 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 467BF70E5F4081288D828A0159FDEFB0577EBE5B + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F777597E78B4FC2F45121DDA943460D7786BAB14 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 94E293006EB9C0374FBF759A0A72FD66E6A1B756 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D877E00CBE2728265429A6C5B5A80338207CAB12 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 65CEB32DC4453002C980016583410CFE20CED159 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ED2A80CF29DA14B1F04E47517CAAAA512410EC82 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = E81D994F9B39295D16FB3CD95BE20BABB8B27485 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5D78DF931111629805D3560AD4EDD812FE0FC0EF + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4661C632E2A5FCCF287F9F661910592BE6EBDF0A + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 577AF5F85D117936CB10CE8C0347772AF1B3B928 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 715BE74284D14C53F1165A41312894BE63097596 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 12BFE4AEB7CC486D60BCC711B881DDC8744BCBEE + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 70BD29CF42E67143FB997F18F0554C78B6CCB5B728 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 34A642EA6EF6741CC8717391CF6D9DA8AC46BB4294 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = F592E04B5C305633A3025671063CDB9411CD9698EE + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = 6E6B2EFA562A7D6628A825D99E4251C119C4032F04 + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = A3A4AF89CE2094387B6C5414E076E7742AB9A74E27 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = DA53B0272C8474428E94F6083F89160CB16E6778A0 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = B1F303DAA781123E600051BC71B32BEDB700071479 + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = F592901B2E645F2A4838F3B832CFDD98805794FB77 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = FE47055C9B28A74E02888B05B8964EA2A0D153ED82 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 9ECF478B4BFBE4FE960538CBB344AE5935E472E32A + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 3FF471F23DD2C12343A55838C2625514C64CA53551 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = 4F7253BB77F404D21D58F69D169386290FCF94033D + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = D17BB2A6830C1855F3A7870214A8E83C200DD16337 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 41079E29A2E672E46DEB5F696C574CCADE57ADD1D0 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 7621D519ED09F1094498418163CDAB65A9B4C72B26 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 56AA2956955E98026E5961FCD27F38D7733EE4205E + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6E052F0DE29CC69D4F0F24B1F49622072AC9B6C8D3 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F8843830990F00D5188DC0C73308F73DCF2624F634 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = FEA28547BBDF0AC95B37FD2480E28C20B182883DD3 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C3BB848AAC4CFD5FB6BA6EE5537302F9E323A9E1DF + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C02BCFAB84E5A9481EB006E66EAF803DA12321A008 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 664FACB9D5EA3EAFC0CF262464491BD0D4C3309E1E + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6DCAA46A6D39AFB0C763AC093A65114BDF9721283F + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6F9E9D9D2D29985E693D418D7A80810E14C7854027 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = AF938C0F462961329D456CE6F4ECCBDBA6D144D88D + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1870B9654E6ED47910AC62101157410EE97262990A + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2AE6A207134B21847DA686836E4DA69E79911B7B86 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 826872EC29C622C3ADDA0C82422748C77E8108D2AA + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = EBB8F99E00F61DA0696AA43B993FDE64221CB4E038 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D63C99B442B93016165C3D9CC39C6830FC12D72033 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 54CE1683CAF718504AAA1EB106BCF1CA6B6EEFE0EF + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E90EC973DA089E04BA6CCC0556E6B3D30B33486A4B + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B08875F46F035F449AE8E5A10FE9ECC894A0EDFD6F + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 7EEFD20825D30A83A49F3C80EF5CB32067AABD27A515 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = 55896480F1C2E8AFFAC6DA5DD4499C15DF21DF8F0EE9 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = 6824D9CBFFC272754C499DFB52C0185E884DE2EF8761 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = 49C627C43C8B2366DB05B5A8A42C549286AB379639A8 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = CD542B0DBA4A4CDD9C99B7674D2D27D57F1BD1E34188 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = DA1029BBA548E5375BA2DFFA5A9605020CA8DE6F5ADE + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 84C767B3FD080930C8E77CFCFB339A6523EC4E2D84E8 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 5922DADC27F5EA348B8571689D2275C77996B2D4F55B + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = 439A9E295BFDF38D00201EF98D119A22605443760942 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = E61C13B9863AF431FB080044BA089AC9F225BA2B33D3 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = F64437793E97A4FC0EEB4B12AC73D95AD80BE9411574 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = 701DA9B5250F7E3007842B9B36037F3B58085351951C + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 29F5872B850B243DD801D7474A1C033DB3F46CB66915 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 80621F813A0E9803271C0428FD815CF22FCFA0D09EFE + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 687ADAF4B5506CD77C977E66446B90BC8F2A5BEE1E04 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 78FD73747777EDFB553358FE22994C60930AABEE338C + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = AB47A068D1D97B336AB0339F599F5F9EF0BF4544A44B + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F26B2EBCF8C0556AFB327E642E28C7AC986741C57051 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 360183F3B27684493226DFE624E5381B16C02413E254 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F222D4D8B0660E982BB6222B8C1613EC4474EB195C8E + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DF354784692E67343453941C8E35DC9BEF693C2A0ECF + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 571BD3F757CFF181955979E3C006FEB541CE55CA341A + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 18B9AE86587CC95BD111ED20071EB089529D6B0BA54E + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C63A2B84D057453289B668316986E8793219B149A3A7 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 52F16488A082C6FEFF1F5990DABB9F7D57303CBF7F43 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CBBDC61A9C2CEE00158B40C05250DE274BB4E95B312E + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3DE3F8A37EF0223CF8994E997BB1FAFBABA022667410 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8E4EFC8786E23CC023CEE1D73E93A7CF5A129430C6FC + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 271EB9FF40534634B1278FDE8CE22F79096AB299D91D + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A8370FE8717BD3ACC0E53C07CDAF3556A0B1FE3DC53 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B7A28845B7971CB7765361EEDF2241DE85FABA5798BC + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1A45EF0F8690804DD17D95959E578672F0379682AB86 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 0A27B380D6697A6BD2E59763FA355E949D4E4E692D62 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = F263183D7CE6B0CD6920E1A5756664A95143EC033A4621 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = F30E5ACE835921A16282E9B407D2D6AAD6AA0FE5191E36 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = 4AE9AED506C9C9467FDFC015252BDE017D5C58498B33D5 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = BBC51FE591BC31DF5A4879DC8CF35B9CBAF0708F0B6FF0 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 15FFEFBEBE178EEE3BB190BD39EBC79AF52142CEC547CF + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = B2C67FF3545303A2662801F4D7C5B492E173AB2320BF07 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 442695149D8164359958D5B6A7461656D5A730C7F022A3 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 6BF0EAB03D7822B3FC7EA26824A67D0B7FFFAE239B613D + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 27F7279F2FCE13773445FE07E78ED9DD6F385E62099C7D + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = FD2F6F7B08DC305D6666086886625270C357D160A5142B + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = E3B58D361A1012E734925F4BBCD19C4381EA150E2B4C8F + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = DF3C0AAE758F3FF48E2E72E050861935A5ECFFFF7C4715 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = CDCC67C3A207B8FDD7CD9EF7A21DEC7BCB0A3FF14B0D94 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 97823CA19A310838678BBD5CB481CD9AAA2F16AB8DDF56 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = DE23460C1D0640DCC35B75D74A6BB4FAD4A355F2B93255 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = 6E6E579A48FDA79242B0DF68763E9B437388C5AAF30441 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 89192E965D06CF08D5F4E2AFB2B5AFE6F9B67B049CD03C + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C8E02A670FA3DA3130792B3EB3DB21340B60C3AD300135 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F0D2D74F4BD25DBBE7BCFD615CCC793D7E9260C89A69BD + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 30F9BE26A07D53BD2ACF3E861B6942ADF0F4F098E5457E + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9753F45F76583654CA7D4CA45127B41C9EB9CCFE5AA4D4 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 59D4C6F8D143A7DC6AE6674F0D8592D05EF78068DD0554 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4FA8D80449CB7996389FB1F22F0FB8464159B24CDB3626 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 102E7114C54D7E777D0ACD126B914F88D80B0AB44A0E4E + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6C11ADB5377332FA479EDA1907191D81F0B07550DF0B84 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 893677BF78FCC4A6DE561E52B62DF5161031AA95EF7CF9 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8EECE711DF9043F42E1485B295441440551ABBBA1E2864 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BE9AB3EE61517DA2B72ADC678067636780732BF14589E7 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 95CAF1B9F8C92C6AD337563C14D4673C1B4508EB61E81D + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8BA0187DFA8F22C0B6180CF2E9F5FE472D5700417F1C2C + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 208D3C39842EB3B4DF4296AEDD545AC80A41CE615C47EA + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 755CA8BD215C55A3E289F46046DCE2BEC1360E8DBF88BF + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E682D263A63BCBF02C583E659E084D255A7A4FE3C80999 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 345322B40B6ECCCA402B05239AD31E82781362D6D37463A0 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = 867D83CC200DCFBECB063A706F935C0870F1404BBB44A474 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = 9E36CB2CFE8CD4F47E157B4F4897FEB721AEB2DD606DDB04 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = D9CD3232C0A7212886816CBF477739865526A1CDDD650494 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = AD89D37D9B44793A9CC16BB690E8CDA1AAF1C2890DD450D0 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = C31B5A7688C18E690A44802F3BD81FBDCAFE9570A3664838 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 1D58867F615BF10DBAAAB41A87FEED9F87F3992E9FF2B970 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = EE963EB10E97D9B615322C4772CA3BEFCF47FFB0850B37B1 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 60BE7448B317015CB67A5AFB1D6D0D684ED8669F05661143 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 56453B7B59DF4A21733943ECD4DD20267672086AA7DEE028 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = A4E9C7FFA43D696CD17D0C47CCC283790A3826D68CA06435 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 51B204C1CB5375668A934827A3FA25EF188347294F5223D7 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = F1834200E5A7C763BB04149F6AFB3C93A05B2E0E80E30A75 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = C788C24DFDFB66BF98570F69C0477799B6C9106F8CAB7513 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = BEB004382E89514CCBD3C33C5331D95D96BE285EFEEA9E9D + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = B5B97D75F484D18642BE94ECFEC3A873D3593E8C8EDD9C57 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = BF70FA81DAA0BEABA0C49273E67F673D538820D8542616CE + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 27FC2C50FAAA9E4C230EB8C6F0260E8132372403367D8100 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F2E0BCC398161C5F0087B6FD194C32F66A146BC9104C4F01 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 45BC907CC477CEDCA182A30A3C12FD4085F540850B9E26D0 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9AF7E0F3DB1FD362CD579FF0DAE7EE04462EC84B4DF49584 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 20FFC7DF7B5DDEF766662798F709DFD44A58C53E29777EB6 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 53E63A616D13F11146EC8CB40C511D1BAF6838E5047AFB33 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8566784987F8948468E9C512062A0811CFE738E2BAF0350D + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = BFC96EE0F4DA979DC84353733B0D60DA290726CCB3233A6F + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 63DB689257192C58DFC985137FB8F2AD33156C63503782F2 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 6CBD0D12809D6AF7E4DFAC048C42066B34507B705BC9726D + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5B45C740257B97054DAB31D8564B0E568AACA784CF6A7E6B + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 39FA4083B5B65DFFE0765E5EE830B246533691AF84E363D4 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CD53843F6BE9BA119067F14F3431192FCA873E514F521C5A + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 64425959F9147E7B5DF65B885AE3E9D31B2BF539F30BADF5 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E89283627104F98E8B8D4953485DE5C1152366B90B33E122 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C42ABB98B2A9A8B8D60DC5A806BC4740032B61071FB9385B + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = 347E8C22BFBE1A02974A51E257334399A618F66DA5CAE539CB + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = 813796E99F05180D2ECCC9967704F09240208ED1A74F6038C9 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = D56C55D7D7AF0CC9FE49FD1D6D99392655B9A5E0C26836C180 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = 26D92ABB8197BD19230804894656D086339B86AA2E8EBD6569 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = 77FB3EADBAAA1F105EB83BA0F77A3B0C68C1A036EAD08169A4 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 7918123BCF403C118DA2AC5352C0E8D21712BFF017028CC2FF + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 122EB811CC499826C20B4A6F3DB5CCE1004CBD221C8BB1462B + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = F7DD8B3AB1F10A1AF96B0B41E6DD30D360F6B5547160EAD20D + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = 7A8EADE73C1F230CA4F4997E772ABC17C4DBBF50DD3ADC0EC1 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = DA95A170077C537F772AC91CABC378D7D59CED99E23FC8DE42 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 61E009F42F5B34CAF4C36548A126259886B9BFF700F46D118D + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 144BC1AAD6C4DA83A2481DD7F9EE4C9881B9F616C2A4163E14 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = DF5E5472B5A5C57F8F6DC13DEEA16AE2C23DF638DFB65BA454 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 68D4FEE9800814B0290875E183FBAB7EA22794F001BA82BA53 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 192197BC698D397B01A9F196DFC7ADA56EB24894E038FAF0E4 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = DDA00B1554A43DE98CF107C488C44DE826E9BFFF46B5E5BF20 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = DE85AC2556CE65EA8AC68AC96D67F9AB7141DF614836186EC6 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F32ABA45543E02514C8552E0A7C5CC8C808F9B3CECAF2F3C57 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 23F740F4E202F0C570010403701CC27AD620C6F62BF9DC26E9 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5C2A342C5ACAA4EB24FAC5221F8AA81545E83C4767F1E57B3B + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F2F5A97A0E3F2AD771C9535F01C0809A40D8965353FE2B4F07 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7B95A2BDFD8A86AFD35BAE46D6BA8C5C81B10A3E4BC488441A + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4FFF2F80604F3366DC4A86F9BC6159F09644F935636FA076A9 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 0366959BAC5C7167650A63528974DE731A66A361C1E45305F0 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A61994C9370B650BF8F3D3B9412BC48F441B6688CC46DE0EAB + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C36FC5E3EF88F85C0D54C519370E5DD1C301150D229A433AA4 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = F718BE808F5F92DE87DA61F88A4EAC11A0DBAF74E59F1C9216 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1852A46E1CE2CB78D69C80E68C86652BC704115DE83516107D + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4CC574614FB6F1FF13F1A492F0851DF892DBD2BDBD8B9382DF + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 16A3391807EC2C206E4FE468C4ABAC3CACF4ECD0E9C90CAF5B + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B6777E54D3EC36AAD98576ECA389E1445AC02C5894ED07C34B + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D3B379E63836282B1D66F9F8D3FB27223C6C6E5E45ECA0E0F4 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 494BCF39EC608C2DAB3F508E10108E42C6D8F6DF6879ABCF6D + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 9D6CC8C770DBC4135CF6D6033D609496EEC59ED3CA3B31F84564 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = F66B20C74C43A7D6184CB0EA240B6943214B9C768B73D58DB50B + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = 3E97D70F258CE3B3BDB621A78CB755498C36BDBB62070A87C13C + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = 9AB0E22DB57AC781DB4278B5EB741068BC2D281E315DCE840E73 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 3CBCDACBA34A2CBD5D53080BA52531AB9155C970777A8F553DB9 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 64E4D03279EE87F1517FEAF19DF89A032DF8D39C25D5187F2585 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 8723CFCC657580C051E524964CCECE7F9FDCC95D74DB4E927008 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = BA23E8570F01E0E39842259CFDDF2CF036A14F6980AFF5BA11B2 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 4407DCF03039E923472EB938148D53D6CD4C0E8ACF739F2336E4 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 3DD3F7C21F2349CD6705EBBD86B807E85C07DC3B563520AC1505 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = FB52FDFF12803F938AD18EA2FBE544D3FB1F0D14C67167C4D5AD + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 3D7774582EAE81133C24D59AB811C87A44E65E822A2CD0F60BBA + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = F3975B46722E23E4A3991E5F43C66692561FA66A59E4ACE94B18 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 58705F880660C47364A65B31FB88E28ED30CA92CFF9D3B1EE8EE + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 5C933A027A467B04593788B06FAF7DD3B22D03BC776A0E078C6B + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 19B0A87789964A72F995763C47F58E3F3FE9F5574E35FF89AC2C + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = ACDEA875E21F95AE17EBB7B0AD0EBB812C81407ECE57A611509D + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3D25F9D1550B659EABACD4349BEEB85E6DCD0BDA9B8B739B42C6 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AD28DAA73402437285EDB0742F6E445918F4E626D68A6FB5B64B + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 21126A02A9E2EDE62FE0B17A451636781E0BB9FDB3B7D942B4DD + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C754BB83D17C76B02547DF1AF9DEE8C16CB630D36D929DFFA63D + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B592944653277D014FFED76A2864513B1EF72F057B1470FA1AAC + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 57EED3DA870AEEAEBCF92A092024CECDCF9B3087F8909C6A08AD + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F54F5B686F53CAE3944901FA6B7B9E0379157CCA4BD3A236B2CE + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E56E45C4E6F11D5CF78313CCE7CFED5FC83B1F4620686B6C5897 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7227BCCFD935F2CA53908E7C4FA4C8662F1CA2916C74407B6107 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 48B0E904473C977C0E983C5CAAA31521207221177533946B7BB0 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9C8B27FA6402ACAB1410BE82A1B2CF0872C3DB23F5AB9B388C11 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 857DEFD50F383056F123833B20080A8B7D50AD335EEF7DCAD2CA + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A7152E836AD6F1A69C52462075F7D2D4CDB5E775520E45B8FB39 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 02F337DD380FA43354967EED42A635CAEC3C76BE7665F0C687CD + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CDB358A1CE565A18F68052079E43F4A792638E289BD96E90CB70 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6ACE5734637A2FE34993D85B0B55F80B6664E5A9EC1F3470D883 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 4AF14B99B418A6475EB4BAA759C82A1C74B89572796086E9D04F5D + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = D121FD3D5F959B23499A5F3778EA36B483DAC225C622613D68F275 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = 228EC2EE40102E97FD53D43FBE8819EA45DE530DAC6813D48ADEA6 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = 51A6CF44C9025173FF5F301F4F95869B15E89C69B7B29B971CC7F8 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = 8934416119BA4DD57DFCDAE85F7C0AB7BF0CB116810A3373DDB7CF + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 8CB437A843A0D24BF4DE425A6D5876A735FC846E8E7D840E0D3E20 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 895353CF7F29EA4789D2EE4D566E04D42B0276895E27BB75608D1A + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = D114255D1AAA58541A1EE2997EDCA3BDE27B0CB386A4082DF4F2E0 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 1E95D6EECC1C2DC1DF5B77181F88F812B792BD1D9B9AB18E61AD91 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = C42BAE846950933EC267A4B82932B8709F62284A7F3DBFD64E9E37 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 76E3D61FCFEB1DFC88A74832E4E5482FF01CDA75DC5425EC21C6AE + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 13DCD57C766735152E3D981F23E5E268B056F874E9DF396220F1F9 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 46D192356055FB8C3BB4218E1200F4B1EDC7FBF8BEEE257D7A2B3E + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 31CA8C7B9B1FAAEDD158C828824B6FE22124911D37CFDC3B141099 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = E5374017F2C0A1795152287E6E2EA243AF4158F498C98F83A3AB01 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = CB1FA104466E1CEDBCCF05752C8A82C1E58A9D4EB91E690B58E6BC + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = F1A57034E12551E2D16CDA212344EBD0B579267A0C37F4DAC88698 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9FF8464E311EECECCD6225A7342F7AE1A9544640EF70D35EA0AF04 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CA469F62FA5881B2F23655C77DB7CEB4A28F68D3BCA477CD3E4EF8 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1BF74DBE34A5BC07AD4D4124FEEEE4914EA50CADB03930A640CBB4 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 33D607A7B0F76C0472278CA7D370DB85D26680F4EB3BD9D6E9DB07 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 938F5E8E1B2CB0A03840BD694C60095420C9E6B0EEA53652D68122 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = ADA939040F19F2D83A52A520DCD900B454453646A57D934B77FB73 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 25755B74489367E152657A9CA918F10367DBFEE20344DB179D8C21 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0FF3DEED5EE07566179477E5DC5E8A424871E36F5E160FF7FAE5AC + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 121EA90C481EE72077AC3FC1EFFF02D84D5B660D2872375330229A + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 03CF5AD81897C9F81F7C758C2FA94FA3643CAB0AC0A25899EC00DF + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DF4AA159DF587B63B116489C5D9A2124DDC48A95F5FE8FB2AF0998 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6D25CEB89AE43B11698249B6E2D2F044E8181BC97EE8ED039B48D8 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5AFD962498236132D85DA1B8C18658D20CB65351AA4AE2F361AE00 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E02AB9E07B94922CC75E74686EBFE8974B922B6DE8997E19A3EF7A + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AF15A6B9528EA7C151ADA499239B9F0347840BF7155FBF38A07943 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = EC1C68C4747D84282A50B39DC94DE5005702CDA703347E1D7BAB85 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = B6072CA9BE4C5B5F12663DE3B3D59D8B737A768C8ECDD632C6ED8C58 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = 096E3D4C7625977B638F72F6B581EA31D598D5499E351DB6EC14BB34 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = DE6907C0F3687EBEAFF48B080D70CF31176CB44A944E00B23C6167D3 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = 89DEE939CC1E2CFB61EE6BE3D457746236AA9BDDF9CB359C377163B7 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = B970E33B329CB2718EE1EB446747072DD56836A3D72C21100BB00AC5 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 30D098A4048FB96BD37DBD2A69491177555D7E60013F16B0F332E64C + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 8372334B2BACA04ED5091BE34E6294CA4F10F374180D1579DFA18590 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 45AEF48D63A969A2234B20A30F6B460B46DB6E4074DBB8B0D9EC72B0 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 384C288F2FE7ECEE416C0C2DE4081CE357B4A4AD2766FEE203A25587 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 19A34F3DF21959A4A6C07DB5C14FC408735DC10845405C824831A1AE + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = F756E90A71A58645231B0CA0940F5A71379971438F4AE3FE6D35E85D + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = AD3F6A3EA96D3FD9D8D4AF6B282CDF4AFBFF546D4C30D1A0B71421B3 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = ABB13CBE268767A6B2BBA4ADD02D7C358F8732DE707D1976EA74A3B6 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = F51CBA59B5FE18425D4D95F06538D805D5AD0575DB01D34EF87C0849 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = D53EC39C3DE1CBE1A8FD511832CEC17C76BE141289B926DE1E03491B + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = EE918777CD7BAA142CA24D75D240E7AF22C001F9BD71CE5FD722B19F + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 04C39FBE8836E3AA0CD6C1EE424FD0BF84064D120548BEF493D365FC + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 265D382078DD9DDAFFC17D6D8A227B15DB9B5D4BAE925C282A4B753D + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EFAB7BE5373E45A4A50B445A7B926B248BF6220CFA8680D8526F573 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0B39A73B2AE94459946CA031D1E8D8EE0C2B13864ADEF24A119DA319 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5461A06CBDEAB90F0CD57474FEDD958E5F8AB8F0C35DCEE714CCC4F5 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2884760AE8465AE66FF360C77828CA9912F829C6CA74C59D1C9FA6EE + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E8D60CD75A37B3B8D3306C58406F0AEF169BCD0413A0DC2261DBBD21 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C27FAA41B816D056E078993D9BD87E064D91A2A78B41D54B0F28107F + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2BE382C1603D14DC6B4862ECA72001B3E856CCC1EFE07DAFAD768179 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1110EA2BB02F941A0DE8EC74EE91778CE2FE9A48F00D6FDE72E1C425 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5AC43D0BB83720133B4C8E8E44509B5AB0EABEAF01A91563724F6824 + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 778050B10DDAF53226037C27FBD090D73A37EFA5ECCA8B26AC8DF12D + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 09981F3516C22CD0875973393EDBE12420A917B70A0296F2BEE9C70D + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FC93630AA9864AC69A10699935186CDC49C1250B485BB70E36D6BFD3 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 34F49D0CD7F8296E4A9BA3B0E7825146FE1C3A375DD4B144371BCBBE + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5C1427C6A55F4FA0481CABE5FB4BD54EC5E55388D0320FFD10F318D0 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64401FD9AF003BE89B7CA87FC5F663DCEB033254507258724F3E3B7C + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = F9B3152B17C536AD9A68DA1D9F71334063DC81E548AC9FA69F0ACBA53D + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 005D23922DAB4D15115B07C1DEE45FD9FB6DB267E337AE0482543945BD + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = C28B412EA1D372AB63CD5DECF599606758660F74910D93C18E49644747 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = A85F71278FD0E1F0D32FD523A49CBC5B45716B127AE420497344EC8795 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = E2FC92998C44625C62061E8185BE9051A8DF573D6239F2CCA718CD10F3 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = B2F3966C2BA5DF5094E939021EF702CAFC25F84EBD8290BD9F328041ED + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 46866A83B7ABF6753D8C26EC574CA5DD8116D353D7A00060350D386267 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 0FFE3F038C26BD91BE8C49B4EAEEBAB864AA437AAF456AC5361265EA57 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = E93039E41172C918A902F2A0FB211078B3F8E1015EA7AFEC19A39508CC + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = BCA28C0BC6EBB463969B1497C2D7B0C1749D4774E8BCF849E0EDB4B37A + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = B964A367954137AFF1A0378FF701868C1D6B9CB056467ACCE1B0B52986 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = D81319B96238D8856EAA1CDCD2B6235CFE8E315B02147ECAE16F2E5D7F + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = D1686E0F1BD0803F19820364EDCE770B6AA3927C2F6712B7F1242040CB + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 80858398ABF6D8B17BFD7C5414AD22ECD6724B6CE8D58948E2DD0B1D1F + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = BBF43E0ED99CD35E9E0ACCB8808E3ADFE0F972EF51315993B7B47D24CE + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = DE8A39DB464936AED7A2D3C0E47203C9A473F684C98A063C4CB529C7AE + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 0FD75349954275CB9FEEABAAC92D1F536FA8E9A939F3301CB7520D4324 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 1D5F1D7CD1DB0B2A5AF9315A5BCFC62AF47A6BC2A8448AE6245C3589B5 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 46E98F6BE94E2A3738D300C83E11CD9CA455F162BDA43E2D54ACE610BC + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 94F561AB87A6A3610EC4495A44287CDE2A3F28E8FC3E38B691FA968BB5 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 36ED481F96CC39C0984923EE7503428D0085678CAB98D5F6A0A0438D29 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F03AB2521FC7FF994A4D7B666EE00FEEB905943F4635D49349E63BA2DF + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A4861E3871F413EEBEB84493BBC2BF31D9493DDA46AC3352DB9539FD65 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E300E7000C9FEFF89D0CBF5737811451337B2C0B57BBFF16765E017104 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5AC5D9987D8AAB2918B5B84EE99277630815D33F485E12ABE37AAF6568 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ACC5765F9DA9B5BBE1FC8406C3085FAF746D22BE2CDA08C120DF8714A2 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7F23271862D80F5D374381C070CD9D12642B34FE400349940174DDCC55 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 484C50B37D1D148E0283DF665829A62D47FBE629E76485580DA596926D + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A20C9084D02C068B1AB1E575E7C0A02B15706DC199805C781AFDA1A9C7 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 765371DE14E4DE1F23603E4A2B364633BA8DDF56C5A8F5D59F0C208F5F + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 83FC24A84A6E99887C8169FC07AB8EA8515EF3371E0449475D0809EFEC + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 44A98404CB9B41E572C9834D6BF67F3EB8D4C7C5D85B6C9538DFF11464 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 1208E7347F87E7A737A619E6EB4C288F2E4B202A7E1813A04361872D33 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 1F3012B52089F3479F6AF8B21C917092684EB2F6B39972FCD1B38F0896A7 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = B3634D04B813AB6D97692968044B5C88917B03982B201B15D3E7FE3A2530 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = E8F3118E9E6AF0A536A3C1A2449DE7457E7C3F78B065A22FED069D996373 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 005424D2634C12007DC6487A7C5C24787BE5D0EA31E74A2973CBD727A2BD + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 4BCB8407A9E103CBA66AD3551B75C969C17C225C38E2107C90B6BDDF154A + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = BDDDEAF9E52B406B743C1CD432B8F8765D989B1C6048CAC1E49D14DD121F + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = C5D9FA87B4C6234A156BB50427D28144E839B14B9F65B58AE03D02472F66 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = E6A27D8D62E3DDBD2C69C43438C4D55190D4D5B6DAAC8ED67D8FC566C182 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = F087A43CF9403AF4F553A2958E1ABB0AFC559CCD2950AF3233EE89FDBA04 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 6BD9D955CB4BCBB8FD3FECB87732893A667F9C280935F8A8DDE724400842 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = CBC0ED6D06E272D8836F10446E3BB9C0B0851E1B077D37DF69C27F9469B1 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 51B70ADC89AF65F6C7BEC984FC349113FBA9304D1B0C4657ED1D590675EB + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 9D27F21D3F393605EF308E307F79C73C020F9DBAD27EE09F2DC2CF9F43A2 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 14BC5A426127E8A26375CCA18A8CC39B9369519699DCDFA3185A584F29B8 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 8B454240021DFD52EA3AB9342D60709DA131EA92F7B5E8B3B67FAC390006 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 02A33BCC03093C1BA3C3F8B841734170244135AF63AD18C6F050D6BD042D + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 796213FBE5D757574FA71C9591DCF8D42B981092A9CD7D1B93FD6DB2F8A3 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 64CA5A53A2DA0F19772201EF78319E54D79F0BCBDA73D6F4FDE688F17DDE + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B7CBCAAE6C9D6517AB1EFD2F6498C71675FB2972D68B42A0A47A60584653 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 7C01FBF9F0AF62CBFBA437403B73AB5558B35BFB4CEF213A646EFCB145A8 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 57FA21919ACEED8B57FD6FE5DDCD749A6EAD0E455CF348FAA8B0E125FD87 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 41D1B1AAD4449E978859BFBFA9752B53516210FDC6BFBE416E14EF8A06AB + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 859BDFA9A518C0CD67C0269DBF90CF019874ACE8D798EB9A89966044E847 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 19AE4D1FA96DE4C4FABE0868216A9549523A098F7397D45666BD67DC1D47 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 612606C66D9DDEF44EB0148655908C7ABE0079F3BA9921B0A6B1E2F2FB5D + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CD5D2544F3C11D33D7C75F501E45B040D41B3800236D7D5551725D045C4E + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 051F77A86CA9B62185C47792E3188B37DF290A9B55A5F84FBF8456AE4E4E + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3C06C4AA7C46DFD1CC3EB41265A626D6874AC61DC4674789342D4EB12600 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A74355139BD7476DB7D2C5493CF2BFB206CCC4B832D6996538A818FEEBFD + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FEFEBC10E0E8C3747F787DB170C7710B62A458C018A1B4AA7D5370FED334 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 392F674514389D45A77206A1418300BE4C10824AE943C4F9F8D653F2C59C + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = DE2CC941349120C6A8BAFE74DC32C5DD3C51170F63BF2FB7486461B08407 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E832F83D8116DC9F972594CCC6B3093EF5998061DD278DC080B4AE521E05 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 0814268761BE7796DEE293441604141A6F2174E840F987375AE9FBDE8C1C98 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 41C84D79F5E1A1438B74E3CC599F5DE404B87AC525A2A9052A2738E855A6A3 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 4FE77DCBC52AABDDA342E94120ECF8C52319DE15CCF0935EE7B199DAC5F320 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 1BB1915400683FC451151791759CA771790D47582273B2C2B27E8F51158489 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = A7130D3F87C7016C054813DD56DACFBC6C6DEC3552B0A37833F581B9D85A92 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = EEEAAAACD30FACB9B7D2B6F937484AFC7D492FCE4B500E987C6D08737D6DFB + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 1525933905783909F68DEAE8266035DC4D21ACAA94921FCA75B9D61C0728DF + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 93C1E45781F138953053892F94FD9CEF514F01ED12FECC6818C7F3C028741B + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 2CCF4FEDEA8847D2D73C774BB84D98D89C526EC2CC8F478E2313C9FAA76DAB + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = A6744A09C45FF18C7481E85D16844BBBAA8200BE79EBDF86F9464B1B781267 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 3FA059DB7448BF67980101BAD175CDCB402613DF1F8B88279AA6ED09D4F324 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 00CC449AD60D5C98E93C1630736C04C53BF47E5AD90F07BD5B531DB46D55C6 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 3727D45FEC60AEAB66EBF1FF4D3744306504B097ACE45485E3C3AFD26B2D01 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 63C88BDB2786E9DC97F248C37F57AB22DE05B909EBE216EEECAC2B11B4F4FC + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 8A9404A346FDF035C1ABBA3E2EEF2AEA51B276A918D948356AF267E39CE4FC + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = B99E3E630384B46F9AFB43FDA70ADE4C8163A4BF27E942AECCDB8019CF2BB0 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = B88C03E9F8241B7245271283B4EACE275B365B5E3A751A7896EC0AE219AA76 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 74F329880D222750DD6A89FE9FF92790B9A9D91987BA07F9C083DBCE46F4E9 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 779604D1E1B78E6420C9742446CCED3CAA572A44EAF16B7F2FB208D89ED143 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 68EB3E163540DBD526DA8D69FEEF6E68ACFBF174AF2CC09085DC9123D692D8 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 997F8259C68B9599CFCF659B18209653F3F084F84362B7EBDF8864A6C261E3 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8B31E8CA648DF587E926D4396EB5AE4A939D9B8D378CC4519D826486D17EB2 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EFD952E4E926B97F8E20F0182F978BB79221C03A456968C438E1D981424D1A + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6E33A72FA1F260A54F6A05EBD9A28311B1DD725B29D76F5BB5CA263C8D9C8E + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B421E3552721890907B9BF4D2DD77B5381CC3B57C4F848A76A1FA871131609 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E86E185713238A2ED4EC687C831CBE82F7E4AD3B56DE1AB200F6E843A2CBA2 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3F723DBBF8C6B70D8E38600F03BDAC2D5A60AA67C0AF2D72346F5708061E2C + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2075BED4C0D10FF8F251E1EFD62914AF49445C0DD4E3C7BBF6097508D232FE + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B487540196CA00A2252C6212BD11871C10EB205AF78D4EC359CD3A52A103D7 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DA66F80644098248912BB1887FAE94C4158FA362E3A3DAFB3B899F074D56D0 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0F846437746D1ABAECA44628335BC345E71BAE8E039770B226D9C5A5E83719 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AA8D5499F2FF60DF5B97BF86C560FE1C0CE733EE802C37C488D20751FCCE3E + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = EF35D807A587391EA3CA82875B840ECE60A452083A254DE72BF025DE0CB361 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 72B69AA8E5E938270F5A833F9C6189FE3D6A8B91FBF30B57274C57A712BC6D56 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = F4E46141D6FB67C7278AB9038D220478D764CD694EF091F72AC66CD461E18089 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 964E12006779D9B2EB6FC03B0FAC275A73AFC163268F71029A7A06FC3A7AA23F + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 9FD7D531CAFB79B2D287418E6A6D84E921621D1A64619FF95AC692587F7011CE + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 63C67AB15D00F77563DEE6D8D171959A106B8DDD2717704AB27373C3CC25B1A7 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 4364A07D3793816CF069E327B5B360B03B15152F04CB3F3552C5870B6E42FA25 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 43885FA7F5C9BF1718B23FE7C92C364B326E215289760DB0A7B11973305A7FEA + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = F7E42781AED9FEBDD652D3A7020FFD943FB9DE6DEC0CDC4F697CBD2C181FECF5 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 55B16E6C5785F6674831DEFA02E304162960483512829762F36B15683DAA0833 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 5E78505B86FAB32ACC44E9661A33EE32A23EC33BC5A8D14D59BFDFE5232CD8F8 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 1909F7DC70A95B298A64C1FF0BAACC08AD5D99051BEB9D49CF2EDDA275E6D1B8 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 7C5EC1B0E56B2D2F05C2E2FAD4E94E3494DCB7F953216EE73272FC1FB542BC99 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = BAE58B9006C8AA4CBB4F5457BE016F6F93911DA93D90B93182BBD3BAC0AC0306 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = E9060841AB42221AB03243D26DB0286A07BA86A0A4A7AE5D7318054748E03BB5 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 7DC6E1C99954E9E4FD73196B40D90E477650C154E55A5913C1A242F44839A743 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = 5FBF55900596129676F01594255E34E89157D8FE97AD2D688599EAF5A1A8A442 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 0E624BEF8292E8FF3ADE05C6772EE60D1AC055795B3496D65548342A689D2E3B + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 81B97A2CA864AEB0A0C1CA3858172C649F8883FEF9031FF0EC24D1B42124E3B3 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8CE9790161A74786B0C33BD10F61006B00090F3F8E8022D89579A88203DC161E + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 91F17000828C2E2D05FA7E03FAE242DFB7E96504280ADCB348AA345531C0FE0C + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C551742082D49A7DD18F52E98A53C61A77F4D551B82F24F41527BEB02BC83B13 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 6604D40D48F7A37FE09659480820F9E25672A7353E83A2665F384E42EDC01B44 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F9FE9CA66FAE49C69441B60DACEDF789CC81A647B35938877FB8052530944A13 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 45EF0DB34038D84BB862275780CB5E1BB4D648D4D10B911D128DBE8597D8342D + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A08E019D13D706A5D22E42D09318A799BFA512646F4C86FA1116E89FD88EBB43 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5FFB5B7E1E002A07B5FA4B1C72AB120281C1FED2187314475D8230FCD4347F13 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = EE0821EF0A01E3B88594EFE771FBE650D91DE5BFCD5D53459FFAD905106C2615 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4AD176AB1F0793C890BAE4D02698526144B41358AE5765AC416C183DE1F1B7A0 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 42684FA8B9D91A27F5C47D290B2414FC2158B848BE015E9C8D785E7E8453AA93 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 48B802C68F0A2B808A4FCDA2DBED47C673B5FEFB06B2B89F0B6615213A39AE9A + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 82E89598CA017800FF30B7CF55A058D01B511565332605866A487853FAA75FC3 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A441FECC7B67796ADE538AD911FDB7F2EE4B8B9868FC0BED1ABDFF55B955C9D8 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 889DDAC3ECCA8F9DBF511BFB8525C39844150CA528A2D1F4C59E5B1EF15C0AC7 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = FC64EF2EBBE93E1FE7509EB857E131554D46CD635DBEE699208E4D9D4903078035 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 690B7142586015689C63A2A48EF02734BCC7B17CCD00F291C3382C12F63C49C58D + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 95F3B1709AE415CACE82A2E06C9A66C59F5D39EE14A369419AE40FADA1B3ABEB27 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 148AAC31E7C298F28FF99FA4E4438A512131CCEF80740DDC47A19EEDADF73151FB + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 8B8A8D0EB11A6143CF65574BF82789DC39BB8CD84EC038B9024E28532C61F0E688 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 6AE3C28426314E5138873999A245C45D39FEC3C7D5EEA2D8D2AFEE33FE8EA145EA + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 54F676E7536251D7736201EA3F2C6B6345F24570AB643E65B9DCEB11EC27873DF8 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 07E3FA0DC5FF8B6C99450F1C8B8466E316D44E1BC1A3C97C5E07DBB1F1A7F9F6AA + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 49AFF38D0C667675B3550D6C8488B0BB9ACB84F86930172BCEEDBC2DA2BB7ACB6B + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = B39D27380C76E8CC5AA2D5026FB10641DDDEEC3B8F7FF7987587DDE9B5845B34C6 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 952CD59D4DE61263898EB96121248C415E0B28140A887C8599A672F13CD6E88583 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 2442D51A723EA2C44752C8378FB1416E40B32AF3C88AFD05CC097AE6716AC6B560 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 79A705324C67E977351BA526F1FB1619878E7A833D0D7EEC743AE3165843DB46DA + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 47D507DE7E66B6CF56B962FFC831231C4F071B1675A9ED5F7144DCE4C59979CDE0 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = C67A2B9CF2438FFF46E4E502E89D929DAA86896016A263B2AE0E27EC87EC112B8E + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 0D86EC289A42443815D45593A38C659195762348ABE92B2CB35E68C414E83BEAFC + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 88B0FE04A52B4D0452013914ECC21B1DE9C0A4E93CFF17A34F0F4CD979C1056C33 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = EAE814B305EB0EFC4D88D47999234100C9B52640618AE066B1A7D30AEB191EB87E + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0E4F7D29A6B51B78F588C86195AC9883750B34D807B39F0EB4D701F4A5BAE80210 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C25089DD525F35EF255E49BA0ABF890B3DB2138B4459C7C418425B1248ED6CC15E + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 69E529B6BA5627E422A40EC0C5319FB86E3AC99782F1946A6412539C1904B697B4 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A9327A10D1CC83AA836B3C7CD26211BE13D17B9CC5BC64BE0ED9E5C450D6EAC365 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7DC2E4A7DAAA5765D3662718E5D37BED57378865C750BE05D09DC8B0FC548A17C7 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5FDDA50D00D4199D940EEDEF1D656F9F6DC5C8793F4CC654E8DECE1EFF79CAC050 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4E234F912E2EA773A22DFE062AF0DBDC1205E14CDF12058C1C2E54635A0109979F + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C7372856BDAEA8F82D91D6C99AF3ECCAD1A2594F940C3CB44FFB3284C7A394F766 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CEBB002340C98B1A329822B7EC872F2F637A641FD1A05853E8A9C3451C9C09F520 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 22D0B9DFC94E27338C0022FC855B3E92977C1B166E377802EA6608FF16C2734F41 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 50F94C234B6380EA85A237F7055E4B4E51DEBA3869337D009F9F52B0D01C3BE45F + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B1B3F16CD4E682B222C313B061341CAE4511A146C15D8F8FCB7CBE8FE98359AEDD + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F143604A0AF6811E807C51E09039BB46078E4D8862195D0F46ACCC836DBBC5A3C4 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4A0A305F754F60051B16B6B5940B7304BD4B819B3D55E87BAD19B6A1B10B8F5632 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B9B1FF125786537D3CFD02B8DE7FC4F1C178C7CF0D7ABD19E7F3C11B9CAAF4CB49 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 2109B93660A3ACA0FE3D557E78DEF1B6B1530B0ADE7E19517055BE1D51A82371CFC1 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 2D167B6895769ADED9F3B7A918D29977B0FE0C7BFEA25FBA45527F3066F35E4BFAAD + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 9F65D199BC84040075C28374B1B778A28C1375ABE9A01388258675AFC77D5C9D32B1 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = F1F62FE5B991596EC655B40C6297F6D8D6A361690D8643E42BB91F5876BA67282DA0 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 0CDBCCCF61C6FC2A873408F86A9019B89483DB9FB591D67141E5338D4919E5FA9781 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 90B1ADF266F912F8A8570D2F20A7640FA5B67A01FAF5CBEF5F06C50EB33786555072 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 6323C22371B994931DA525C063DFEF2FA884BB27A3DEA360300A21863EDB9E75B62B + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 41A832B631F8BB0EECB2C643EAD5190FB51A65BF105CC26ED00FA07D87D4295499B5 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 12C84F7E0E27B1E03753057977372A959D35DD1B450EDC6F2F8B2E2D3D586AA7DBE7 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 01AF8D86A68FE4070460D0C23EA3A0E8734265E185B86D3694CA1EAAFD8E9338906A + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = C2D7CB46D268AEE9F350EBBDC769C333F1CD4D859903DE5BFEB51DE3CA40507D910E + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 0B80BD48387C2773D57056C8141F69B31D11971E0E4E0877D85E7A0F638AE3B8B4C5 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 2C61EBA6A10DB92A2E7AD2986DD9518B964EEEEF5EA6718FB9CC1A65925608FF1759 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 7B519E9CA25291828D0F4534C8DD644854A93801143DD28FC84EEE9297821DF76B60 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 6EB1EC631DF0E3CFFB5C70121C0E63F06B27B78DCCB19767AB350BAC6863A1E6FC34 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 640E77B30A8CC4FBE1F7AC67F565069A6FA7A8253E4DD7248CDC9F8D25D7D3200820 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5612698AB3FABBCA4C097D023A15E66369422A8AA58799B8E51D040CADA36B3EADDF + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 356BAC1422E02753211AD6A9EA77FDF2AAB4676C3361EAC2272FE45BC48526D12404 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D7C2A44871F203BF47F812E49F28FE18FA25CB777AC0B98DD3A96DEDF95CF33E4ACC + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 31E0E09260F67C64A7EE7CA18BAEB13762114CACBC5C99049ED677899FEC4A691B34 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E461FC84B53BC73630AD42BA8D37A2A3BD8F91E5ACEA64194EC82B702E70353E2BC + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D18CDB50BA2F8CD6E2EFC958F1B96753A78CFCA08143F3C3DFD75248F62DDAB1565C + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 82FDF9595A36C525893FA635C4F7FD9777B21EC3D3E976A9D9E2BBF848335B6D6840 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2287DB0DA63EF24BAACDE2D6F60C4720CD6BD2A882F15048AC1CC4045B5E699D1F69 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7605BDC67FC6695D343E3905DB4C04D4CFDD41C1F171F72C3C62F6A4C40FB3ACBDDB + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 662D1DBDFB7ECD31205ED82F9B83E4766973B370374CDEE13D26702F35EF234393D2 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C3C95C978FFBC97216BC4B9261A5E715AB898AAF0B46D3B59881659A5B3E03764D33 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4192053DDD9B0F591F3565E2AC3CEEFC1D539B6C0D503F8CE58D9DE782F9A9F14933 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9C20969A274D61E54E8B582429D66EF4DF4F9AF99B14ABD2380D0B4AACBC31FF9DDC + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EAE3FC0F9280A80157F4BD471A3CE25C1AD22142EF3791AADE311404521D1546F9A5 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 82926E7053B8E7B2E72F5D960EAA54051D5C05797DE0A53F28D8B395BE95D890F647 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9B69C22291AA9C74EBE6AACEDF32388426BFB1FD3DD70AF955204928A2B6043B6451 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A70D17D3963607BAA2696DC07F7C6D2DA00D315465210631F223283307160424C1A1 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = A9009293A68B5A59DA7B43E96E075DACC834061B7B50F5E836A0D57A39A3AAA6080AA8 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 7D7FE7550CB243BABC80C6C05A5EB22EA054E32B90F437A8D1B408AE54AB11748930E7 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 51E803DDD0B93DF44D0301CA81449599945542FD28E03B51807FFD9C0CD970E341195B + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = BE09316B04C023AC12C2F4349F1CA51E4129FD84420960065A175C0B956F24C203C38A + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 7EB92200583DE87CE9E24F43F7F888BBBD91AB6FC408509646C22A6FA1A5818173BF53 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = FE961E4F7A2518CA3A76A52F769DA9B6D33FEA448508C666CFB8F29D34BD6CDC718A7A + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = E64300C9AC7FB4308ACB210598B6D0D182B393D8200D3C185781EB7439AAC57760A13A + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 6762A37C68D44EB444E88AB48D44D45DC8A05FD09636FF3DE5DA40B998622A4C9F1043 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 57345848EB5015B0E98FAC5E24EF532C17E24121AA7ED6184C08D8ACF83FB3AC9DCA98 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 1E5E405C6349A9422D8D4671EB4506BEB0F7408466EBE6730EF9208B5C23FE73DCEA12 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 7FFFBA7908CA5DF5F3F732D939826B74E0D023F11F460B83228858499F25D0F1B9FDA5 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = F7BD559B6D92D5D0597A940C5B28FEC9A7C576C210150AC1AE5ADF387BC5AA424712C8 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = DCEF0CB82F4EC40A011F7651F62909060AAEF57B20DA269D114EA842109AD044B1104F + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = D9134324725D92ECD4D9299F9DE4B1FAE363D1792D2F8D1688B780B4671A3377AE9B32 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 4732C7969BF9C758D4607EC50CCA108ABC8E76B02F2515CF7C1514324105F788691962 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = C7FD5B01ABF298E92CF8F90ED3A23288AE03D898EB594C9D33313A3A9A1D01219DD769 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 302ED2ACF21772661043EE4D78308343FAD8AB7C94DCA5E41736C5DFC5A4E6B60FAC7A + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DA073347500725FF38A60B9355E44BD137A0F6C9523FA3212047D7841334BCBEE331C4 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8C3B02E8938178A58882DB7F3D8B4C745F87C6E7089BADC7DDC56C2DAB038F56520DB4 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3EC5B6ECBCC0C91F622C58E30A5658D65A8724F4D1925B8217C2084B053FB2C17AE4C5 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 03FBA11327591EC3F88DE962A1A84E42C9CA41A4868E88185F0B93B495BDA5A242E0D2 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F6E6D627920F1E7D325FD33DBFC8DD9AE21BEAA8769D00299C0DE04060AF41DA2F0B5B + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EBC8AD957142673981D02B35DDBF7543B845C4DDBD9FE37DB680B422375B9B4B343056 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C9B3D604598F4805BFAB39E37FB24882E74E8308E99C436033B3F9EF38FCCE0FE027B8 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3A9931C19BBAC8643BB8D9E58195BB9B9FD779A96C538750F72BCD3F1853339C715333 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D0A516935FE7C093D245B862C573D179159E5D1689EB943677B1BD79C4AC662FDC3790 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3E1A24CCB4588EF79D3C6E62925E180CCE3EF1C29BE9775561C9DBAF8B10682A575755 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2557F9F943B507AB7671F63732339D3AA866AA5D682C8B88A8E5F42B3DD430F1D9C12F + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9E3258E43E6269EDAF1EB9F51BDE4F8811995D2B45C4D4996A98E08E75B242518A4224 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2B5D0D3A22FAB3521F4F26FDCD1AEE1315DAEFAA3123CA942F23AE2D39C5ABE9CD5DCB + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0EBBCB0BBA52E11B3B34B989574F9F4C1B426AC605EED9865763855F4CCFE27E82EDE8 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B34A0808C6FF7E33EC9EA9AF9C2FD14318835C422AF0FE7055721DCD7C1C6C7EC1F8BE + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7B5B90541831B9988DB34BD0F4DA91254E3C16393744624951F1269C1C82B5A56A7F8D + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = ED82385EA382EFE8F9957DA7BB88D5C84ACEA709C9CC71307EA8E0E5291565A898537CBD + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = F3730E618FC9ED48E6191F29511152239CFBFD5421DF9FF8A472434B4CD550568AD5226B + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = E51970FC61A895151D891ADCCA180CE3766FA30A5F3C5D5CD58F7086908472CA90226DBE + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 86AD6F80251CA7552396218A6B25706F534FF25270AAFAD29C7674DE49AD5711FFE1F9B2 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 4A068CA16C7405E848BD5426AEBE21F937BF6281C535CA519DED0FEE874BE9DF8765E59B + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = B2636F0545BAAFD956E94536596994DB5711097E11B01D0EA449F4E1269CE9AF113A95A2 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = F217EABBFD9AC13C348EEB089519EAF53955F1CFA7793E48AE85F2E66973803318BCC091 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = B9A4C9649E776D000B0709F040D7E4DB854DB6D08ECEDAE0B0CDA29F782CDA2403257BAC + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 2828E0B105F4622E61FF15251EF574784BE7D54B8E7394E432BBDDCD425E4E196B5F98AC + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = B65D55ED310957C6B9B03863A607BDF320145A660791F219C76BA95F14F8D6FB6D2816F2 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 42CF6A3060D30D1F50C5AEB4EDC44A4BF59E131A887371561E53601997921D70298A4D69 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = A61603A543DDF18FA1B4BD5FC70952AC1DD8CB42F09F156D72BC37633CC774615266AA65 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 14563B852C22D02E3658D8DEECFED8979B5180218A964630E33ECAA8AA32E11C546C72ED + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = AEAA9603FED294CACDC321A81356FBF763EB19B752EEEB9194DC1E35803A4DCEBD2C6FFB + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 823749200D2135BAE8FC90F06B9F5B472C4B2D2AB1B097B9FD4151B6CACC20D6CB5F3748 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 19099816EAE5452A41D5E08418FA3747A8A858623E280ED1B644C56CD267995F7D890E0A + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 656045252C14381BE01E34A109C486774E81C2D4FC8D0694E23447406D9EE174F08D4036 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = CEC6D8A72DE2C23A58FB303DD89B987A05FEE20B3EA11439824FDB17F159BFDCA95E0B4D + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D11F9D7E45B8C08B5A1AB294CB4054899E13D2DBCA9C128FDDC41DAB559850576F16FF2D + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E7F62FC3A0CEEECE48B690D293F8F700AD6916240B9528274222FE45FE2381D1FE56417F + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = CB1100568D66D0B40FFC1A1E35EFD1B9E7199DF1F516A3BBA035ECEC9B0073F765A1BE87 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E3BBCCAC13030E915D831DD1C074F683592C0D4B0E36565C2EB23D0FD47AFDB5D11360B2 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 238875FD3AAFC766F9EAFFE758C51530F7A718B280EDF17A4D356D981E53E836A212D136 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = EA77ACD103169223EEC0A882CDBD808D94EB742BF50CCBE17FDA9846199A4E873BA332F3 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 847D209E7CF996053D736716332C73A38B39C092F3DF9960DDEDE3E3910751D62A261281 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C6D9BB5BC926B5BC740F2ACBB76244DA0CBDF6403E6F824CBAE95718C5B274938960BBA4 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8AD6BC35AA3B93994008F910701DDA9EF0732A5E9ADB521C0C564F4B7DDD368E5E87B5D2 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1D81EC648F3F104223E41DEBADA888D5D713DACD1D7117DBC80228DAA5EA48BF0191533E + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A49288476825994A2E3F655F1F38E1443DD916AF56638EE9172C3F99F06E9C3E3D041298 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4951EE5FD41EBAD1C6CA225265918D8019573504A3FA4D9A24C77E4AFE0588378BEA6F65 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 9AD3B2DDF34FDF6724E976720F6C160A09E473FEF2060F4847C25110D3245B890561BAAE + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 00C2CB1FA34E5CD9F1868EC892DFAF3E251FEE161836BFBD832CAE02EFA0B22298844DC5 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9586C83155B0E31D050DCDB048EF06B69BB90FDF74B7A74050F644048FB4F3004FC48002 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 9BB37D7058B01DA6FA7B992BCE258B47270050583C55B612321B69B8D71139A8345F457F31 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = E275F91080B8FA468A68DE02B1C5E8E4F48D42F1F863F30C16D1749F9F5E58CCDE8339295C + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = C5FB4D8E49F7E0306F38B3202F2EF215EB7071EA2B806374B7BB07C76AACE744E54DCE85D1 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = 40EB16AA662342F4D05C4D040F912B5DC55A03FC13E0F673028C241929AC9ACD6AA1394592 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = BA1F2C9139B93393CFF6E1677D86AE955D54CAD2650F2BFA0875D86837078481C14EE807EB + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = CB14A587730B647794F6312E6E7FA9F87E6BC545CF30274287733A766A51CB6EF018A55CE7 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 86D1231F72854CB57DE877A4BF3CBD77CA9A2AEEE0CF8EC7D851CE18C38456B21E31FD6AD3 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 14D4367232642174F772F4201E9F91AD7AA92B7357D2AF044CD3660B64275C2C7FE1CCEA6A + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 7317A19B762D3983F500F67DC0864BA7FE9E4363EBD8A15F6D947BE6DF52C4D145057BD64E + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = D9C55DF19E3BFCD46CBEF3E90D3D82329DCDB8F2BEF046A00005EA22FC7BC91F0FF451F8D6 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 9E098CB02AB7C1A4E59CC821D6BDE19591A18B94D8EDF3452FB5F0ECA4AA431872F4B490E1 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = F43BAC87065A0940F2A55F884AF7FC3EF6FF6E246E4034ED376C0DE0F664D03C4F674B33D1 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = CFC7DC26D524E4C15C636E37B85B1285D3B76AF9B44C8AA0B8DF8F04B9A174B57CF96827BE + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 146A4FB92BE45E12A9F2B8D508B29D1E6F0BC77922436FA20A7DE63B9861AD9F31EB16A040 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = BD49AB6EA0CD509D10D5630C2CE5E69839EBC60CF231C2A6C22379D6E5A394986E08653AF6 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 507492E6161CB4B6803BF879988BD53F5AD73DC1C2498B7B0499B2EA4D033152552F584FAC + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0686FFA439B029F0234AB5FAAD70A8ECF8D363AE3E1DB52AD3A77A880740C04779C25E2F33 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8E8CA3D6E8297A0DA943D207EC6FADFE75F77A446A50134228B26620343589391A4DE25D5E + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = BCE3D05355A35437860A90A9DD378ED723B1F29C7228B160DFDB074433197AB8BBCB2567F0 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0B162FAA766245514414EFA48D95C4FD2FCACB629F64F2C123B50CD857BDA34CAD4D482598 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 37BE0B8CA65A9BCFBE12AF7B6D9E9F97416B7B41FE74E4BC47CBA2D82D78E5159BC0083F4C + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C8BDC76D02F1F101920B37A91BC9F8D49A3BC5012B0CAE54DBAF29A8F1409B9C7DB801A318 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A1924CD8DCB71B9BF0B114D45FCAA994BA2167D7C76E80E7A40EC04451AC56EAB480EF1E1A + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2E4E1AB9C75000FC5A80A5768CD7DDB548DAAD4530D991D0B35CA97803F0A33F4A0BD396F9 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6017AA6C67E778A9979CBC4EFF6BB964CF50AAC2649A13D8F18F321FA0DDC564C25AE91521 + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F0135BA3D3129805DEEB5DE4B193A99B557C05C0F68D50666EFC32371AF3D34BEB9851B641 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0794A2B14D9D389E090B779275850F663EBE24E6D455F94BB200D404022A09A90D25231686 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 985EA1180C37D38ABB72932C0620C699BFD8132868CF8CCDD5CE4F97E34C86D084F3CC8581 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FAEEFCDF8EA3EEFA43D4AFD12636F9CEA6B5576CB74FA6D7EC06767F3BDFB2362CF57A4ADE + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8E1864848E3D92DD9512FB6695C6FFC17DF078FA71CEDF9F70203FFBC53B55C5CA4C0276B3 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 267F4A12F5512E5F82E24BBAE96E6DC6A79D8FE4F28110EE530731BFACFD5AF5FC30D91E54 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5E66A83960CB350E69C400DEA5D7DB57D876B00EADA99DBEC81A740E14B0931ACD133B1DCC + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F85B90E4D0D23F5707F47B7EC6D65CFFA7CE1393AA3CDF7BEEB1E6CFB0EF77C0152BFF68F2 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 5FC4826B64837502F3B593C289392A973D2AC71C5722BAB46E3932CAF476AA846E7D216F715D + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 3FAE90176C37AB7321784FB467EF57331275FD24A27D4FF58043BD4BDA9DCC7686208563F3F9 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 1E1D36B227CBA5969F26886CEF323E6F5272B7A77391B522406C6E742E8D1239C15C199CFD82 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = 3D2636B34EE5507A8F0A35F121EE74CDF8F6CD096C22548D9B27A34A2D47DE85482A7CF95A26 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = E2D5D6A4A6643FF2C6900E609C657EF34BD8E6D02D2CEEB6D3FE1784FE0CB8E9E896CCF2AECA + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 8D8EC4E01210D856413636986F75583EB25161A0F05C6348D32CB0628BE141F12DD1CBC714ED + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 15E45D14C7B98E9F13B787430FDFE68473F2D8FF8F9AECB230179CDFE1C5B29B4E18E3231622 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 773EB6E7FAEA1F44FDEE0E86F5709146BDBC490CF32820C82CD538A97F5072C4B3E37BC862DA + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 2D7F438C17EA189D63E6ECCCA892C30A5DC6AD8CF55BC207885DC982F159483C3C85261E4204 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = F76EBFB0DC3281795FA7D06A5CE2B74EE15ADC1AA874BD9402D4B8591A29FE8258E72396B579 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 2A26BCCC67D1D8E8CE69CB569F571D90175A2C503CAEC3F627B0D4FF2A0C9ED769F2B539EAE1 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = AAC979ED0C5D763501224B08C726F92A4A9AEC6A5DF02CBC1803960B585D1D90DD77CC6BD5B4 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 452EB3522B204DDCFD7FEB7740EF7B16CE92C8C143C3DCDABB878C2D33A879E11DA0D48D889E + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 2B04B52AC6180675235240EE6D9A1F642AFB21DC9D5BB0189F61BFE3AE93169D9C186E8B3BEC + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 2A525604AC34109B7EFB1D5F7558B1EAD1BA5D3F9F6081880641202484F6606D4FBD0627956F + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 4C87B46BE6EB178E591EA076AEF399CABC118FC2A602CF24BD3C4858C18124731DD5D6F4F20D + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = D8462DE0756588820CD242147BA1EB8DDDB24520E047217FE6B47F7C8A11F527DCFA88D69E5E + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 390DBF4AE3C92BD3747DF49F55C4917C9C71154179596F222B6BE901593FA7E9403AB93C5011 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 25F235255068CBEDC576ED4A3B8E95FF757421A8A65688DCD6C5626F31A48F93942FCDB0054B + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4C206A4025D71B4A2988EDFB865064A6C421FBA8D5C4E1E518DB19F9743B066C3BC46EE86A77 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4818BA127D8394B6B2BC787B5120C444934A35DE13BD8A65EC4152A122480100E58FFF5425E3 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 305D9CE2A85EF6AB8A953906D33D5798033C2145AB1B4990F959382232B79C5402A6E52E8389 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 5503B82895C79BCB9E895C34BD0FFE35342C1113F15E15B803BBEF00733FC0A6D8D04FC4A95F + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C6E75F053759F1037FCA880587F45B44321819EE2E5005381257E132099277436FFCF0584C25 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 55D9EFCACF60DB52883AB82A7D731CEC05A0CEC74D1702812B113213C696749EDCDFBA2E0053 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 6047835DEF5B98DA6A7609691A65F37075947A12FFDF797FFC3F57F5DCCF40E3433C55E8BDF7 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 66B19C6856DEC0A771FA117B1E4BEE3AA80B0A131F87F8D58C68BB0A836B1EF8296E714C3180 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2DD57F2961B8B277430783C604AB25858CAE8322AC4B7B185DBE03157195EA686E937E86D227 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5946351E33676502C725B07E1C153017E510618F4D707441531C8396CF33B053FFFC22142A5C + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 58390F4A6326414F535DA23A42F7C7C8ACB4485A3F31F6F6A35578C5B2004543D97CB81783B4 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F640108847E206256319F3B5FE5AA8FBC946CF0A49146848E852346326C5E0DB274A1B8A6903 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1E17CE00073B5E6F111F6B56A2FAB3BBB2A87E51B9054C86F64A9D7F615D733AD2D6988186A7 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 31416B5E5BF7D1555CF101B8B7DA0F1030C774EE8472FB5E298DF79AD1D3469932148AB996A7 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 372F56ED07A98F83C59591C46D8DE64EB376984932D4E2B9F89159E5BB75976FDAE09144628DEC + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 375745B3ED52BAA9648BE93CA35CB4E9859C1AE88C6643439F6472ECD771E75403F3F6DD6FA086 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 43EAAC515BE8489D4A6C9B1C169F53118430CF19AB32279EB633360A56BB4327ED16FE59291EB4 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 959F570870E40542C2AAD504692BF5FEFB1DA7E01A769033104859972ABEEF292A9877D16BB401 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = DD9135BB8899794C1B118FCD0C8141C46F004543EE73C18FF646670613EA4CB1201B96073F8023 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 38071CFA03EAB7F7B8511594FF61F46816970AA77C907E3CC0843A608F2B73A56F972BAEA66DF6 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = E159769095AC4B221730E3D02C5A0E7505CEE4A1A9CDD947A8E1EF544706C2DA277F17340E2E4A + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 2C676E11C36F4F53E5AF1F2D7BE57200538C00F4CA3DF05ADB1A1CCAB457F3FF16BE7AC850BFF0 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 8F7EF84CF998B35B5BE0D93DDE22D4D8CA8B9B007279D1801298A7C639D30F8A9F689F8F707471 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 18C796BBD0106E0B2B9C2BA40650CAE0FA99A07BE2499216E5800D8D16AD77CAD650255170E657 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 7C78C0884D2CA4ED9C4F3E33F7946FAC67A85E49C42E825302222667D33812CF30ED483BF1F02D + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 859550F2794B692B33C67F88EC68F9FD324873619B67FE012A9A047B6F37F202F9EBDCA7476C49 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = D3D93C368E98B45E609BACD6E41281172B34216701D735C4A41E48EC03F7B7E3108CE0C90C74EB + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 4BFB0993152581DF9742C54478A972D9A12D2C91BA163E844CD7525ED5CD3B404CDA90DEB2AECC + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 2BB53E9880007AF850D5EE4FBA6D86E0F01C9582493F6F59765C6ED900DC0E7D5678F6B026E69D + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = CC94F9E0E981B78ED2C03C3F0D393A6A743F2488A3045C03CEE694AB7733355F38BAC22441C5DB + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5766F58DBB9ADFA23016D7627EF22326DF57FA37A5E8D1D9962D2E4B68632060EC96AF16EAA3F0 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 62EFBD348B4BB3007C0A2468D5218A572AFF1DCBEADAFB6BFF236A586BCBACCB73F2B1CE57F6F6 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6E4B4D4E3AD5671900BC7F89730777DD868EDBF12F127DFCE28FDF5EA4D95BE94CB307A5CBF62D + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DF00A3D14EBEB2410A58B9D9ADF9E7D71D6C5B0A1B1BFC5B6AEBB7265C7EAD13B891D3E489E14A + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0E15E40E9A7B78952DA167508E053A51FD8C283F596CB686731B838A5CD1350BBB2403C28DE804 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 30C41612BB25EE55D395074ADD57AA57ADEF2E81E2CAE910E84536655F373320FD2E90618AFFE9 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B19FAB4DDE7DEB05359091FD613D706A47E1281EEC25AB8E4C95AF42BCF767996A86BFDF9A3828 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1699337240BC0DF09490B7872EDD133CD9030A1AC295C16536E4E924181CD8F68D6326A2F0F8D4 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0AEC1B4DE82A2C40589F277751950A5BF7B172A77A012F6BDD4F4DB45C297AE1CBB54CD8911303 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B76B1EC9C91A779E35270AF748501D4A23ECA97037626857A0FB6786E21EF8A1F7397DF8AD8CFF + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0EE0F8DA7AE3035E32613827843D821CE786036A389A13518904183E7BCB8034D51D72D8F0B347 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = CF0450871F93B92592C56783081FC72665E8232ACDD20E68EBBF549F8AF59A95EE233681D55789 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FCD241EA4270F6BB2D4D7E4F107D064D7C1BA2BC3D502146F1884DB766947F3FFCC93F2590932E + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 977171F2583078D10C62FFADFED83EFAF4FAE9C82D20A674983ECD7EDF90C2D856043B2DE51545 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 71A6AFC98216B4373FD486047BEF72F14846DD1FD471A21994AAA57BB06B290B4F5A83AE9B3818 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F4DCD183B1AC3023BF1FACBB9D4B9031FCCDEDAEBC460C69EE747A9A2C6D9B422F907030CE5348 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 32990B59C5E6A60FAF34F8D4C2F76EC024AFC648ED8C792690A4060D129FAF6479C5A5B41A7738 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = BBED36565FB21419D44AF5BD1D4196E13C7E0BF7F2B1A954B30CECD729CF966B859242F70501BEF2 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = D02265CA65394C81C4EA3B0196E188CD97847489BA0A2E516E4093ECD69EBC393CC32C3602915FCF + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 4FB5B4493424097284C98C9E480CA0E231C7116D9092AE7C585588CC2D9F38CCD9991EA2A0BBBEE4 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 8BD0AEF3CDC9403B90EC193051D853DA21097BEDEE1A7D4ED7F3DC0F56EE718C1BB1E14185398385 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 593D99A27AA9AA005C801EE5B51850895E52D196CCFC8893E973B03C02B70E661E5500EAE99DDF27 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 7EC65C7786235C8110D098971043656D62775E094410805255A3F75910128FCC38225409EDB1E3DF + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = E5DD87BD6C3E6AB888F9306C93690F010DEC86D79080426CEED291BDE100FFD8EBAEB2CEB4811C7B + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = B9DFF546BA861DADE2ADA631A32CDA641639196383F2A9E64AA93594F00B8D6F9515878059921772 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 0134B264009FCC9C95E8611B61CDA1FC086842998F9673EC657F8367F4ED7C4C59BE9E52D693D927 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = EAFA877C3CCB0844DE2035BD0BB4F90E7EAEE0A2A881A3D0DD0B94D798B7566502DEBB886FFC2579 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = FFEB29FDB200C1F2DC0FBF02DEFCA3C2F3CABFEEFE3AAB2CB2A4652D3D084454F3A1F354A726010E + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 1C941D2578CDC9E2A2FE93A7D1219AF33B83384F61F5569CDDC21982AA7A25C948CFF0A75D0B9A90 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 8C208CEBB7D9C17E0FF9586CEFEBEA18EF79AE63401F01BDB7D9E69C7940A56B799CA53F460BA59A + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 2DCC1D7092309E1D84666B2C09ED17B08105DF0E1DE16D31134CEB4B78DB878B120222C27E3082ED + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = A5538A401ECE748EB53730547B7C0EB54C46A505E14343241617CC9FAEA541D4C6B15AC84B78E88A + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 3E622A7DB6828AE4A47473D7D17CEEAC841B3CA71DF72FDF5DEF9311B74BBE729A7A26CC913B4DEA + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 147C521935014AE03C86098A81F581484989546E5B53D4B4F082E05DCE9B50AC72CC5D7F97CEB568 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 568D6FEF09465EA135B307A562A0422309240B9065A3CB2C1061C8C009080E8D9F64AD5FC9C2E8C2 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 539BCC87F58848CC475AA43FB674817B6C5511BA744F71184A33CC50725405E089BD1A4461663350 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B9389527BDF9042C82BCA8EC9891617F4603E3DE65A7242D4EB833AB30646090FA740685608463C9 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6BAC714B43C564296D4EB9DFCB94DDCA34FE3CBD6EC4282780E9818C9008BD9A10BFFE2530EC8E30 + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2164F8BE69F2A8E7615805DBF91116C8AB5E7A5E5655BCF565E114003CBA0413F4E5457A7FB7515D + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 16B5040BD362D3F816AD892B8C9A1621F0E0D89358D120960E202D106EC709C56F7429A8946A1B07 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFD959C2A11D981181571A1D9AC7C4727FF73D3F1F69960877559AFA1CC2D09E1DDC6518C47451DD + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CE418C3ECC5858CADA2D1FC96B3205560372D3A1607E8C117CBE09A9E6D74BB16BD1EA7A633E8290 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ECC97503825E8E600FEBEE3FBD76FA614059B726609BA9A2C42FE6D8D416BB7FA0C786E3D4F57D69 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 111399E561EF3471C65D48EDCD30780BD1C2C32D24CCB76BB0786C52FA6DBED33DF9830B42A37F47 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BBF2763ABC17D6454DB3BE3A46126C69AA3DC587C3EACBCC4ACFDC52779897BB94AFDF7D723FAE0C + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 94CE4A36D478C4A08643E9C1B56096CE8F92BF03BADB4DDD83DED88334282E9D70840ACDEE5260F5 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1240B07C77CD65F5893BCCA816D909F470A83974A8ABBB5370813EC5FC7F2BF9D35A987F9C49C43D + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 01E02E80A6D2C6F7BDFFF63AAB46FE7B9DEEC7D84733057C4A034B28F22EBECF5154115786C518FA + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 17AD7239C8736369BCA2E2B1B52D6EF966E613B8B553FDA717AA122911D9FEE4A0642D4E891AFC5A + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7B8EA576A021F7849F0FFBAD95B785257B9D642778D8F103BCD37E5F61B192564EA96950CA9401CE + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = EDC6101DAFD80953BC8F95F993027EA345BA4BD5E8FF26ED2D6EBA1046765239AE839DB2D1740D8AFF + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 6E8A9C5348728DC592CC3F58F73F96658119402F7E4504014186EF8002D26231D5874FE37A9AFA2313 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 1C256370B8CAE6DD9EE8B732ABE6AECCBABB876E392A42CFC956AFA46A21A4613B657951E446941920 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 43AC5AAFC00EBADC2D5234C251818888D9AA63A6FA16ACBCB5AFB7ADB2C2FE2F245BD77F4994246549 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = D4E50759EEF9ECE78C9F27D8981F32855255F284EEDC1C6BD5A74DA63053B8DCF5182506CDCD8F69C6 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 813F745D70EBC8C0D17B7904E33D7ADDAF15A30764C8B23C389F5A3EF859BB51063234C0DBCA0CB2E4 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = BDCAB37F106065A3319588A42FCB41439C02E06F4C83A9583F76729C478DCDA54F79B638FAE845BFF5 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = A3ED8795EB4DB7796ACADC49D6BB59184F06AE5D8A3B29CCDC436A68F62D2A1B09E411B958E8C29DDD + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 704984B64D554BF80B0A383CA8C46AEF4B94F581D53CA0912A41EADF04ED95838FB5E3F42C1220810A + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = EE109B91832F4BF040C015962A34A5D6847E62A0209429B90F0401DB5B30A3648D9CCEA71B6133FFEB + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = FEBC1AE5D92D2F571A405ED5A6CBAF84DAD9EAC07BA59B6162E92B848C2987BDF1B369E7BA516ACB27 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 582D0566943E1EE80EF684DCD76D2AC378BFE213C26BED590FAEDBD2ADD081AEF5B4FFE23CA92CDB93 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 1DE450F5BF76B588F6181AA1F3BB722F518B066E1ED174AE4B9714335B698BF327035D1174450A84A2 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 653D991BC5FB2A083B40AF4AB41438B8640F5EA7BC3290E2CBEBC1815B9BCCDC16486A012651F5BC31 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 2900E814A4D67C5CED6916CF4BCDF54C0AAB225F38A5142C46382A4713E3CC8043810769EBB1D3D68B + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = A7766E8511DBBE35BE868FD62BB58414F2EE5E2C1558A7BABE45484104A42881FC834CC56E26D15FEB + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9F1F769F80AA675630AE9F5FCED9CAEF9E7D5E6FF51CCABC135EC17D94805C89D0AF366FC83F5C9EB4 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 16384072681731B9780A8930770BB06E5BC601A9B81FE0EB9BEFBC76A068F82A1002000A475131F522 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7F79FD52D40687DD3BF2134BC661AC777856ECA833193832A512562085A4265F33291C223ED372611A + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 181B17149059DD82CEB7F8D31E569084161BB8D6BBF3A66812E469FBDBDF6017D68A541C39671420DF + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4CF5932EF3D2339577B39C415CD326529FFC6A920C621C069E333C4DD4518D3069A9860FA6E94DD6E3 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 52BA65E030E8AFF9433EA37467F8CC732616F2335DF870905B1A1AF9E674CF3BA75700DEB31B12DE85 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B678656BEFAEC72FEEBC4E425464C48831523A47C0FA7E97CCA7B7EB9B29D1AAF3F8A0A9548279167E + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 819589AF5AE6DF84AAD85A80063C32D3A5A2150604806CF4509553BA6329FF4C01559ADB3D56C3269B + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 36D80A75EFD1E09EDE2FDFADCFD65B9C925C35FB94759A67030FD2A6D5F42514543EFBAF89D9324B44 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A64F2609052D05FD9279EB9A60A02592CC8CA4F685BAFE0DB71C6A6FE9F858AD5252F674BAF77CF34A + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 167DEC1AC8CF6E8E952288E863395E927F43B934D72B9EAF52755A5011B7BA681D679EA5AEDFED571B + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 54D44FD56E1B0FCB8FE4231AD037DE7E0C046BB60265C7076C43848E0A5EAD0E1A8663328386736A47 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0EAD3AF655936C4CDB97C73530F001049B7C5049C43BD8443009D971E28F2DED9397A67954CA39DEB7 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C95BCD76C839F0B2DF1DB3C7566F609135C317CA81BA573C8CA1CA2EAA18BD1451815FB65933CF9066 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F18F205D5DFA24605B6DC7AE9259A19BDDBFE5556A0CD891341D43C35E570144B02C858B1CF52FB608 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2E3DD32824474D8312E11464B5C537A5E07BE37B28BE5AC096ABF1DE56FD8A765FAF6D159E09AE68AB + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 40FFEE56CBFF6743DF331717031152417A41D463C87CA1A2AFB09F596B00A6EBE3858A2FCD1DA6A349 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 81F5F4C4A453899BD1B7ADC8EE2FD0AA2200603AFB4273FD6F27BE68BDDC9F9205C6CAF752FB8972E807 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 6695C0B85C665904A08B780DDDD17853F3267EA9BCB6BEA3A022A64CD314C5E88C4EE9A1E1AF2BDD3B68 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = AB0373817C0A608B73BADBA3C5B913495E89AF49110D466988A5EE5219B81A0927278B0506C203D9BDBF + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 9BAFCAA01E664612049734D67BB0FC98162075966089421B8E547D90D5AD8AC219D8B39DF98662BF779A + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = DF11AEA5195DC43156B2DEBF9C2E8B7FCB8FEDBF1500D072BF8B7FB0A39495B13262DBB1FDAB968D132F + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = DA653CAB5CBC5C562A246CDCF00E8761E7BFA694C1F660FB61F3FD0754A9A79218369F7139E536445C33 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = B9BE7C405E46AA8DDD6EF515F2DE1C520920298F501A1C40AB42BFF2E30BDD808525496117E30B6EC73D + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 0B1BB3A7BC5ECAD8F8928DFFB4DB968F629C6AF115CE84596DF195208303066A26D32C25E3B68E052A4E + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 03F9B336D2B8B4B8BD5A454D67CF9C58CB735C50E2972EA8BD8C87DA4E5377F4AC4DC6E052FA8588632A + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 5CE6E68F3BEAEDE45F5EA178EE86BD52E6A148885A04F8A37D945A28DEA04707054AA939E02BDE53E674 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = E17EB9C1C4A3B6A107C4202E14F7BEABE6C0DB7E844C706151DC1E8748F9859BB76EDB9AA2E039773444 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 80A1435403AABD5D3D74034FD5AADDAFCE211FFB5BFE577A27FAEFA97FAC1FDE3E15BD837CECB2C6771A + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 8006E5B932B42C069E2CF3E7F5B1D7278AB9F7377812600049AAC3A838062C5F337574EACE53C2379E06 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = DEC516D4C7A49FBC547165347E9B35720C695E0F3A01FFF85814E6E40678FA1021173B40A13E2173BAA2 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = EE4937F71527ACF5F79FA7C628B42F1EB59B4FE976A8E9C1219195611EF5A5B79053D99DCB4F792B1E74 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 40651B5549F00E4AA600EBDC084DBFE22D44702F1C088BA3A673091060E2C8B853091A8CACA7928CDA44 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7F8449D09C57C805461724FB90FAAAE56E5270C3632DE11677296714568747BFDFEF4C4FA35580181EC8 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B2B9FC09D0E7E440E0734735713F5D8DBA1C0D54737A57C775B5670ACE753117D19AB1E23E37FA17377F + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 73B1F70AF74939536C8DACE5B5EABC2D1E182D84072361831AA9C9845F7C7F68785A6D594D6851B504FE + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0DCBC196343A258086A3F1900562C8235BFDEB46D789C56EAB5746BFDF3DD919219E4426D9EDFDFEDEBE + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B499B54225D61583556FB5BC24EF6A726CF050F31CB32F2490CC505CA6ADEAD1635CE07764887D1C55C8 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 694B1AF30B2B0E7B23E11902E72CFCA9DBFBF2F39534A1CE0BF736DAE509CCE019707E8A7F3089EFC6EF + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CF5B5B7C6E96C30828FDFF9A739E974D30D127FDE75B8DAED52290D263615A9E63AA581DA45B8E1CACD6 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C81F22A79A34B484AA37BB6DCDD38BF9A139B1A20C97E1F9EDCF77ACA5D809723A0F3381A56E291D7732 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = AF42B782E11C8113288DF8A23117C2E3292B814478C61E7DC4E120A72580C4793746C9AC4359812D5C7C + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E5BDA8B42F736D07A2264CB4D147B78B1C0FA5CDC0893B8FF2D49017D4A7CAC70F2D64091D71106E5354 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8EB71C6483E1EB796AE2F53874D1E77A7B8A45D02C25D694F79C190C8D527BD48A7CDC2C1F9BB9F43842 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 80FC07C47C5DD07C28475E55241881CA5C7D7182A4467393315F9FC13CF4B41F18E16784B18BB1BBB9FC + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7CFA4B3F9266C6A2598EE4684275EE2DB259B1FFE16C8F727B4BE30B6D2E44B4A30C3055D277780B7C4E + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DA0353C1742B56818403DB4DCD83B1CD3FC0EBC0ACBCD36C253114CE0408A02F7F35D0F3EEE0E0536C12 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D09D2CD6155924C3B7DF2BE65DDE2546B2049E4FA816129DBC5104F057774861C6D59E029DC43CBA8DA2 + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7A239EA0F1AE132C1B58FD65077B39698FB821FD0ECDBDF5FF4D257CA18F8B75BC534736A8A83DDE42FA + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A9E84087C2C91608D5FF1B91690D707A3C6BE4E39DB10D1B05B35578D5BF48EF89BC03C909A378773EA3 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 05F4E3F6CCB665BAF3843AD2F5069936164B843C8F1A517FE7521FA789975C729929CDCE3667FBF8F35C3C + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = EF05411BA67A2E7455089E87FCD3EECFD6749F6E342E5027EE11383FCFAC4DCCA45D74983AC1C55A8A3D13 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 01DCCB18AC84E5ADDA78CC797927BD7ADC7C1A65929A7729D7D863EDBC08ED9F0F24544C6105D4F87037F2 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = DDAA64DC9A1410CE44ECD4399E223BA7B8D70333FC4B5D3A94ACC069C272BC2D17ED8DD1A14E05DE1B9121 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 051D69BAF8E6FC1CBEE5AAD21EDE772EB0F4DA01449BE495139A684657BC16F35CAAC29913A4F13F3B5B90 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 90599C68C93505A6D2FB797EF68FA0F267A9CEE47FF32EEF8E24F301DC3853B5392B7A77F8BAEE4F4DE498 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 17A8ED855D5C43A2B9901F0A5DCF3B1DD2FB2434E71E4427031CE76CB8B92F815C1BF24F1CA577CAFE6A4A + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 5E55479EC3B8904E71D70C171135C4E6076456D15C63727622B4D2492BC872D3BA622028DC8A14C4A00DEA + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 5B0C9D1F42F812EA8ED7A49154A054483515E0713CB55FF68CD1BB42BF0FDB428C86729C199244F36F88B4 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = D179B029A9C4F3DE62A461E8BAB3EB5D0B24F8A74096462505340018B67FB93441FFC96CC1359C79ADC088 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = D8B4457516347D704083913375000C21F6D68FBD9DEA230AD1A328C0322E73BA9713A1C4A03B024C936C64 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = BBD44836F4A418032D052E7529F3A9DD61AF6CE149C6E5CC2093D554217B752FF10B618EFA7DE502DFB1BA + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 79438D46012BC7C87385C8D15B7221CDE706865A2D90A651F771A566CFBD22A16501A82A7723AC8A9FF47E + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = D894F978BCF780570468CF1A8A14AFC4A414EED960C5DA99F4E485C6046F8B323591084147DA7F0C5448E2 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = D93FBA2B18CF0E820C9542C9C4DBD9E3FCCC92200094B169BA8F4D6A05AC92BDAA8DE8E009982D2E938226 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 9A9FF7175E5C467D0F018EF37A9074AAB27E2B250A6886BFE9F3006775AB8B0AC03372D22834C0DE0AC692 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 4017E20B0B665FFC4734752C8699C3DCDB5DA5FA29440E37CF2D8AB7C8D912FEB258696AE8CD57F4F9159A + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C79FDBFBEE4B79341168B55E8E61E4FEE1AF10F358B26E6C720E813F72CFBE81CEF8D78F6E3BCE8F1F0BCE + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7C26DF33CE8AB573DAB843142D5A8BE79E9D93986EFCBC019ED9E3987690F556FF7B6AC2623094D7CA68E6 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = BBAC6B110BE8662F943A0141B43350659C200655BC97020C6BB043D7C8CCF07EFE898E13821D97D49EBBD1 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C3A096093BE34E0C5EFD4EC7ED94665A2CDEF6BD06BD71CFB3CE00CF38DC9C7FCAF16F3C5B369BF3D505A1 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 311811EDA33084D328063065EABF83885A5DCB4CB9FFA478043431F608C31F431B2C23C70EE3E6AA7B5740 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E62E4CD339DA8BA3CC3F994BEBE41D9101470CA6FABF66707BB4C1FA607B9E7ADA790393776D81C1AF1B5F + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1F4DE86F00101203D3F056A0A96E66C3253CA98DBB9938B8AE33A2F886317CED26A6615D92B3219647CBD1 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 08808095035D463D2EF3942C077F638C3A69C0A07B47C6DE4D86C16EDF33654FA8990926298CCD779BB16E + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FF3D60E162E9674AD52A202E9FCF7B43172D3DE62A0F6C0194EFBD43F669DECD191A1B785EDF7F6047E182 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5B002DD4A100F92794E1AC7556D4444F5E46647B2C77FF9EAC7DDE7E14619CB7B820920E5733AED8AE576F + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DE211C9D8E74C108EDB7698C44CE54779B77A000304F25D52646524F949E11E9F4D74AC5EE6F503EE2FD66 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6FC3F24FB680B31BE436CBE21DFC15E284F3C26DFAD414058E236558EFEEB79B77324C4296F50842988A70 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3BB2BF72F42879B8D7390A2DEFC066C3A27CF355E9FE8ACA0D555E2D6EB53CB15D1D3CC8F2B5E9C8EE1FF3 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F127DAAFDF8954A416862754DE0CBFE92850A6D2DDAA921F9C0D778BB4F64D1766F6673008C3CA897661B4 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E5E5981CD94AFA5B9834A5C277CB625E951869FEDE6A91A9F32EA3D4440D46B987BEA984C599A6B8A8AF2A + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8DD1DBAB0060FD994A3C90030419017A51F59D647403B50765411B6F0F97AB0FA1BB716FF65CF0A7FC94AE + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = DF6466461750F74DFD9782C77209AC60609B985D81581B0521DE503BE2BAE0F18EB2D6BFE979F27EF6D5CBCC + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = B95E6B427CAB953FB6BFB613608AC22BF3A425F01E6A1F1FAB21928908AD1684E47C316530AAE2A4D7C87731 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = CF8A8CC01B6453545E057C5FBDFBB14539341325050C2DE3431C0AF1C578C358FCB7CCD36E2EBEE292FE28B5 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = F2AEDBBA2DC854CC0CF42D0D15ECD4B80DAD78FB4D9F46C4319672F566D6469566B0BB45EBA98DBEEF813049 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 60877069322844C1039843C4BEBB3BD1D16A0E95B2673ABD8E47C42625886AF9F129BD8A195C125056A1A82E + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 9657FF61EE932B877F108FDC03E3543F7C65702148F4EA4EB84C7CF238F5069E43D760F1999AA701A8FB4401 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = A91FBA8DC667753202248FA136B8962503AD09D5399D105666F9CF9DB5959A0126849D08468A2026F5AC0331 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = E921D615C10DC29B9B082C3693AEA2E4D6CA6CBDE0563490E67E414632EEFE90E7FD1C2B49D666993D0240E1 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = C1933E76E12F778C68FB816E8431E20BC06FABB52874A179F88127BB9EF15486A4E0D6FB116D73A33B9CCAF4 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 1C0258B530257DBABB9EFEAF67FB544BD967FC366C8944C88937E040A7C883B3ABFDC62B9324CAE315BD662D + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 5CC2D6058C87A4ADFD957F884884C8F5BB0AEA97EB995AC44B3E8D8AC3E21CA41EB74211573E8AAD1D72A7F3 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 6879A2AA05E96D9B9566D7B4348B4718A6AEE8A3D3A3F6D43CF8BC8D0CAEFABBDC9DBBD6D9B541082DEA3050 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 31778534C8FC769C272D01BFC2FFBBBD179E2DAC566F5DFE8750098971EA34A04700C33A81D32756EB9A8384 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 7E20F7F302CB55D957378088DDC435B31534D5209AF08FA64AEBC373D95C65833667284EFFD3C72DB14F4A12 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 5344DEEA770F53161BACEC4EE804A8C5AAB795C0E57995A08AD4D14DA8679F2267CDCB04452263ACFC931B52 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = D03BA1949CC9276887DD4DD6B64B1F6DF48BAA2AC6F587B019A87CBDB2BEC08EBBE413B23679A4036A25A002 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = C229E9D0C7DA772029DC0C0F4A9257B9017FC5D0D4C45C0E769B20EB1B744AA21B4C4D80A48115A2CFD734EF + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 08F3F21A902D28E1C3837EB629EF69BDBF256E9F9AFAA04E7AF3A79738A3A13C835E44CFB74A303C576396B4 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D7A8D02511D1920153E48E65B7E234D7C5C0E4D2C99EDE86D89C2530F0CBECD902A4397BDA12A6D4EE45E235 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A2BD0B27A64FE1BD1E3C30FCF6CCDD2E99BEEE8238F869E7DBD2E69F3EA8D71173AF169AF1C13E1155C89893 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D9A91A1B30828D8B915DCB9E9351DA3CB79CDD8637D420D38924942FE25EAB8E346ECABCDB265006DE5BD96A + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4134B2515C0F31E1DF0AFF00BF86989FB1FA9140074C1219349431EC15F9659504C400B74100E8DCF93FDDA5 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 81AB398D120D8E490F37935C34E40EC442E2597EBE3346E8A70BF5683522F30A80F2E313DC4CC1027523C1F7 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 126BC1C5151CA7F67F31AC5C15E4E3B2285F28A2387826DA5F3E26B32BAF0063DB4BDF4AE57D046024A08FC7 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D0551F9592C076D4BC8F450B4163F35727A59D52A307E2D4D9BF37AC67BCD2097749BC247C74415DD71BDEF1 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BACE8658B20184C2535D8F989840BEB1E85394E06A8F23724F97E072EA2BDFF8D1D67D60689FB161F9465E6F + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 219D8C32E0BB96A5B35C254D6A3AC4CFBF030352AC5B1A59EE6091332DF42E324D7970BC08DDCA37887FA0E9 + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 72AC930BB3C3E030236FEBA78185D334434EA7B912A658E9B81376BB7E2DC4D357CD809441791D8CB4AB94A2 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D02D887B22765805537E1760CFC56EEB3B23765D25FC7D9981405BA2AE141D2AE6B2FF32CA280D3DD2B0A197 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = BAEDA17A297F86ECEE55DE00DB20005E5FA1720F9D57F7787F610F90095E5D85BF04868EC98A6C493E863EE3 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BEE00AA93935B6DCC4E54F60B080773E74DB6D32E99CC9809FF39E15917C63ECFC4E4EB00DBD9539F9365887 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 13C62EE6A96D6FDBF70FDB9533949D9F9E9517F0711157C2BCAC23143D797474C20097EB93CD01A50E51CFCC + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B7BBD46473178BC1598AF95E49671C5A7D28F87101F7767D564568A6AB683848E607F01D9A79048A467DCAAA + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 4FBCB9BD14BEFF24DD2FA755D50F8F2DF80DF49983531FE3FC150237F63648E07EB5B4447A7E38FA20F8D4F879 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 86A20414960776AAB9FA1D31B3F749DAA5619A5B30A24A3B95EAFD1A762B3D219075F888390EA2F47DF9743EE7 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 47654FE7978EA3E84182B69EAE92BBDC85D2909B97505BF2A238010251EF8293DDFCB5273FB4426694D10C7C52 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 26011F8CE709DAF6FBBA3A43A0F750B9F5EF137101E20025868D0C652CA759643C1A737D2606A8F8B8A5A3ADFB + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 2F20080EADB02BC9116C509C7FD0F32DE279F133BA23EC7A927BFD208A5B9EFBEA12F8BAF6199E0A822340011E + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 8EE87761C6782BD7CA776E72C173E880D47D1FB0736DC98B06C7F7F80571AA252549EF3924F27422C7E9AB89D4 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = CC48D7D1917532682B522E35BDB43805537802921C1DEDAABDC6B1F99E424F980A06689B0B516EFB29919A1F5E + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 847E5ABE716D49B4263C1D8FCFA7EFF82B637A4CACEF74EFF67D0E33D8388062ABB9D30EAB7BBBE5CEE3EBEDEC + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = A92550FC3C601AF9A81DF47CF42B3557BECF5AD81AC0ACD862A8FB5F751A1736C6C7DC243BFA96AC4478CC6F1A + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 2BAB268C7EE4616A58508ECADF51876D7A543AF80CD2732F2B08AE5CD9A931934A1BED54C8002B96D71B72DED3 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = FE1AA94FDF279F379114CECDC14655EA1B67983D4FEEAF70EDE87872FFFBA304888F8B2E793F5DB525BC0F3A65 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 1055E8B6110A0E6C91704B203D692F08FCDDB4E3D42DC4E51537B5DF1D9FED2BC906DFAC99F3BC2CCFCE014F8F + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = F3553F9320586E4237945A9626C6CA7659B8650B7592C0F2587FA9B42D6D648A8539F4E7430640B264B73E82DE + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 3FE9A53397DD37D5B606165E47837718E1E6CD18610968DEBE10D9BC2ABE272189C1B22D2C1674C0577E090BBB + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 5E304F032DCF2523CF64D991F64E0258BEBD7DB7DAFDBC68624BCA6EC6A1F5D2EF612E213F569E653C2B72F9CD + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = 906712C6357A76A01F2F8A6FCA05881538C8ACBE9A9A9C5E18FE016E55B404AB1ACA2311A0F8D2458F323703BD + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = EFCAF427C6C3BC5A40C836790195994F224405F8F4B8AFB51EDB732E8724A13D8FA28F60FBFD0E4D0AD4CC92F0 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = AE35127AFC6BFE75DFCA1FFB8EC88667093E361042D43AC6B75A4739E5DDB4DAC61F8089DE15A04652F9B240B8 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A081C0DAFFA043D4592DC0BA150F86B40B13705DF287814F13266F1CCFFEFFB781362B73CB0EC74B7BFB4033D2 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 609DBFCA8C2DEEE0E3C6E754D8FC9383833C02D322038134185C917C6B3159B1E93C51C81F6292243CB2D2EEFD + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 14F7EA1074B74E28F10523D6850CBEC5D52E967410707F88E2E4A4A75B9952FB9E38A5F7A4BC44B7D7CE0683BB + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 61CA06337C634FFDADE00F89B34CC817E7B970A749EE61E936C95CB5793B69C7477FAB08B8C9888EDD868BAE5C + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 173B7A932F68247353E5E953E2540123F0CB7D008FB5C6C521AC28E018E33368E737DAFCF27BE6D3E170B657FF + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9ED2E8A6DCE64925A9D7A6A133E755DB3C2C15695C544E254C48B01E20AF8DDD064A39059E66BE2F86292355DC + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6A363EEBECEF98C88E056564F5F0403686C5369D81CCFBD3A52A75794949912C070F6CAFBB31B0276CFF43A770 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 66A53774634446E00393110B4E8BED574DE406FB203323157DF3322F668B13255381A69FE53C9C8CFD79EB3442 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C77A6191C16E81C75D4CAC41B7F56278D3FBAB63856D8DD397A4F2AB1AA7ED7286660A4E48ED2E4C83363EAB34 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = EFAFA35D8B3F88E3A9505038F31154FDF8DDAB5ACE792263326D147F1E375344DED18AD372FC1EEE119B60478C + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DE6BD6378FE95E7378C84B8D1AA23AB520684DA0BB89B5AE9E4C2587E0440ECD7F94E4E5FC453E11DD80F2807E + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 58A229A7387324C714659FF3564AC1F3EE80714583CA2C6ECEDCEA3176C16186D1BF61837C5955ECAD02D0A450 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F031E2AFFAE2B95BE598977BA0673B7E900A4729D0E6F70B41298E8ACB65498F421E97D39E3BCC7CAE1EAFE31A + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7D1230E3FCC5C4C467898F23C63183E92E4FA8C61F187DAA7A5D2257D6CFAEB049BAD5A6928C7A48D1E7465D92 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C61885163BDF7731CB5D35F548C00A3D16AA7332655EE2D6F18726727B99A09639D5D6110A2AE7499D260D243B + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 51F2D4A1833F6DB28ADB483425770D171871F224619F871F619D07CDB868C7892A9C8157358F8D070E7417CE6D94 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = A654B900AD8C4AAEC839D25085603EC71D383553279B0504C53323CE6FB1E0E6B8D7BFE336402185D895477C2FA2 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 404D50EE73E5466D11265F658201C63A4D9AB5066438B741E91B24228F6C1B7D95E89FF07B55576D7C8148ED25E2 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = A951BB13C588FD79087BB9C84AF93F7268AFB2021B767670916C7AE8862F91C56F7D19A79B697AE458ABDFB41404 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = ADB1A2AE1C3998E777D1D0FDF4789F3872CA08E644F478CF3283E94E1AE3C4B9931FF7145FBBF6650DFA3B65EAB5 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = DE2A4FA444AD20F43273302F70F07BFD41E7E56E3903991739BEB8590DDE9C5004A93DBD0BE1B3A1A65A22F78D4A + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = B17D7E9B4A2FE3FA474D900C8ADBDDBABE8985B911E1580137FB541F525154DC32172ADAAE35F103F94174070F9D + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 689271679E4BC4E41964FC17F9E00B9082FB42CA3937D9B3F75A263EB5699BDC984E73441AEC149B1234E5581C0E + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = DF98D778D38C8BBACA7BD596B7762315D15C200FC6E9611D3F64DA30D396BC1648B0274B00A3C8DA7B97D6B13F67 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 2149D68E424B8C6C1EB8D9CDED3FC3DC728711976DB04F9DECFDC221606306658B45FD4E9CF594B011AD3B0578C6 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 62EB80586170A73F0A440B03CD61DDA7B3AC0604038158F16F0926E73B058EE58E69924BFB22B7EDDD82B62F3902 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 9BA62E608F82D27C37E62ADB8D610B00D0AFA9434143DE866C9E52671DE9740A35286363504CB431917871C87FFB + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 0B31D9BC0C575562F5A5A89E45C53F1819B69B34A325050641CC0DBF780B2163B6208ADE968E0CC55BBAF1447249 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 1CBC2B9AC054C1E88829321BF5F6D31A0E4E6BE577584E4A0ACB63B6BD9D178073EAEA40BC5A360A671B0525A895 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 9DF66C673D76625127E9AEBD82AB013409856D182E51E25D7D3DD812F4AAE4420D99FD543914CDC44A2CA5331890 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = 2118E7FE1B4387675F0479636850316EB8C7A9A1886112E0D8C482DCF1C7B19ECA5200E2952638D17E2C817B90CB + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 21C34DA22BA44F0D47762C220C03DF7D6384BF3D42D13C68B08518198268F76FF0AF90011FEE6AA496E7680BF278 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 60E01C596E0DB486FE9536E6948E0424B7A1F408A7595BD843BB0A6548D3C8E7882A80762F9558DB303C9569AEF2 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 06AC984D5174501ED431ABC6A4C5BA069D16EADB80978FA23F2A2983F6A0562B6545AFA9564669CFACEB44D2B1EF + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2BD10B5E808BA6343FDCA7699046E493BF6CD063F9A10D6C93C57E4774B970CB460DC25958F0551DA95FF7F0828D + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E524DCB91A2460DA6B663C08590C5EE857DD18C1FF82DD44DD090B2CBF1615BC1E08C3FEC10EA570B286713C2FF6 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 570CF9837BDD660D6D7D5D80013E120D2AA5474C563D8F2BE3A3462DC0B53A3A176ECCB1A75E4A7A66795FF312D0 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6B8FB311EC5FF4C7D875D82B79BE3606A06B4E5ABDCA2D03C3FA01E4B1243542D050EAF1BD42B9E9CD0D26EBA1DA + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = EBF85FB14E180EF602F6FB10B7BB9117A98CF7BDB4B6B3AD40F921B3706E631526D69702F21E88B2D2E2A0023B77 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 80641D078A25C68979DE27378258F13048ED1ED0B79684B525D7DC25768F6BA276E2E5CC84D294C05A65B631C196 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 766171856BDB401536179120E91D63FD63A4A92BBF4A28CDAA346D63349A9DC6D405942FE2132B74D23D6AC91CED + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ECFB9908EFB8B36F48F5E53C1CE20FBFEE0ECFD48AA603C715A029910511EB1E3FC514EC8324B26FB123684DE3A6 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A9280475A07B70E0225932E818116011EDF1BE192CBB87F6D6194206E7610A6BE040797DE46F553B1A7FB02E4582 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 485279BFF3AF11933AD571C8779FCF886B7D406827D971769524004CF62A4C3DEC6390C4FBA05CB310C0182B5617 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 607D49812DED10925D460CB3F876C92A45A6EC56201FD8770A27DF9BF320BF1BFC0C103398189EEFF43914201386 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D6378D14869DAE9275829D767881E7B85AFD7B40865CF0E2D158810E0F6467FDDF50063BEC5F8B8B893690F41884 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A96BAF0958F0AAB33A88E49FA31C6A1E65F958BBE5794D07A6E16AFCFC7D293D68596AF2EC0974A6EA47D2388E41 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 362C887DC0294C1AB9A61AC6159A460F9717D6B3843C87C465AD982A0CBA810DC64A14CCCC376DF1729CF73C9D1C + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 21CA6F37BB154D7E026D906ABBC087040B0B397D5370C947C992EFC1129A2416B03A46FC45D80A770E68CD787A26EB + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 68A6ED4B17F9B3AADBC2793F64940F1FDAA2A4268ADC530C00D0BF9A92A1B175C528CB949FFD846A85399ED6F439DC + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = AEEB0323FEBF2957096CD6EEFBE51DD791C2226B6166D8E5BA96452AADDCCB01DDAFBA3DBD482E1FAFD5C1907653E8 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 0B78AB33D8B79CF1B3B159AF07F92AF3110D26A1F581DF92D893CE6F9028438FDC5BA205084794F2A0491FF91D0396 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = B945525A7C05CE22E72337B93D299038D8B78F3ED2BB9B92E4E0734F610BA716B2506C00127BC589A08E22235986FB + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 576F137D98007679D7BC363102A5CABA783A05B0959A6F141647340A99F5C8CE902B7E0DEC280CA87E5B6A6E19A076 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 71556EE5E93BEAE81A59373A60BE143A323E8638728196B3F9009E40E4FD823DBC6E05588AF298AA1A80D92C61D1D8 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 4925148ABB8ED25ABFCE68A650753538E82629401938D76D66AF429DD3E2AA4A9FD17C6E94EAE06DD095ECDA932857 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 1C4A2E31025727D7667E08890542ECBE7BD0140AF96581020691F462228118CF89C9EB41CD5B625F8E0FF537D86992 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 626311BA7656065064B5CC72711D51DAD8CF88484FCA0DD7DF7981007118EEB2DF91A9DB5A9D14FA34B592FA7A4A84 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 03DC988E1689BF89DF08585DDDC45997BC6CEB760DF69D74EAD73573A88825AC52B970CE3F6C7143A84DBF6B29EFA0 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 3E9C01A34E4A3D8C34864E5070C681F62E309B46610E98C3108C073D66315F002929670232B5EA4412B562AA9B0473 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = D177F79543B35217B3D9CDF3F9035DA8D331AE4D56BA6E8F2F90F764E163BC3940FDAD2CE19F2D7C5F967BFE277249 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = A2FF008898B8B6374B03C568E5E9F7EB7949068A31E5B6B2E0161E133037ED927BF30DD19D858C89901A049F791F26 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = D15A167870C586C0448F2971D951DF7618D26361EB6E4F05BBB653BF3F045859443FA80C5C4F2603E22620714AEC7C + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 9E279D789E13F5308C068FE5370F29A58A49B20D626FC7EFE1B4EFAF1AE659DA4D3769BC273ACE43028CE693A58DD1 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = C1FC616EE2E0A81CF28D5CDA6819421802A21BFDA53BB69332D6850FB024840FCA7602ED4647A5E18A29A3DF3CBBEB + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8AFC99A8113A13281FF65171526F3E41FA81E14E9DF199F81E833A3CBE0F36DE7B043CB4763F6ED995D32E93110B04 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 34E4AD0F2E9F7CA8105B2AC84D30D2475B3BBE677DA4805F9E3045EC322A67B49038093245DE79F925DEF78AE48565 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9D30F6D39F4A574C118BB6AAAF211EEE17358D42CAA1F272F8ECCE3C1D605B2576539F6025956409A63A7BCE6C69FB + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8029BA300627DB6CCF0D476EF80DA7C1CAE3D4A540D42FDFB2BDFE181173E24EB232916918C468E77D8CDF5A355BC8 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 6B11ED467E765372422494A17F2B2CA5EED4D27074FCB4E8F0945BEE1A1A8CA2923C9C770E58EB7F0948ACC95CF2B8 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 76CE040045F63D39E4F5542895166D0628B6BC78C7954C49682FF169AF9E8CC6C7274889799D20A58744140BABDF5F + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9C09A5EDE71B70B3152F0602F380123B672547493BC8505C5EF887B784F64DC9ADA170B6D09119A0314FDA9B5683BE + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 44581FCB81AA304414F3F0367064D4953EEEA0C1CDDC1ECF10D50E5D30BB4B27EDDAE19B8DE0973ABE233B15BCD5E8 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1430E3C2297A26D8D01A15A4051BADF7E8EC558BE90E94D70D3832DCC8A4AF19531C567FE9B0C1A3C4543D0C4EF08B + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 12C946F3200ECA70616B998BDB02956FC00BC6E343BF86154E672D9C05D160911B8BB856A06BC6DBBF6EFA06070EE7 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 26BF6BE335B926B61F27A8158E76022586FC9400F01BE884B3F9AFCDF6FD84D78C586941AFE1FB0BB744732436EA0F + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 52FF5C7AF6E8694398E92AFDC006C7D6D2BEEF4F68F5F3937346DFF368C4D0BFCD04F24F1374BA3D0F094899308FB7 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3FD11441EF0BD043159B47481DB7F27A8AEC1B87940653019573F572BFB2C877B1B505BFDB296360AB63ECB0C25E3E + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DAE9F800ABEEB3E031B1A59E2835DD8CF503793CC52836EBBB02B2BAE0944662C378E65D30B0856284F75EF95ADA22 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = EEFCE4606D171C259CDB03050D7B65A506765F7C8270CD617A10D5660AAEF90FBC848B80E8B80F136AD4E5C7F0F907 + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DDADE35C4F491EA5211AC89B9A0F7AFD26384210AC75EB12D68C1F81BBEA0598FA9EB289D5433AE798F033ADF54C7B + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 269B387698DB3AEB5834F3F2C1DE83454C8238DD576CD9DEA705E28241B351B28827ED9F467C9991AEEE03ECB6A2C3CB + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = EAD315B2D324E289677485C3F6A6D0405FCAD88588E516F49B0FE47DE31946F127937378DE7808C7432F85A0CEDB9273 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 725C83FF5515FB4D0756E6C1C7CBAE365BDDE798ECA7D873928851B5A30DE736F2FCC3DD4036510F44DF47D6C8A27ABB + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = D0C5E2C34726C0D2201C5FA8FBF705F3C7370CF90DAC7FEDF4EC7FF7D1CA8EE0FC9E70D68DAC5315CDE9573CFBDA9679 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 14047544BAE9F828BCC91D6AFDB312E8589D510AC09F0CBD0A6BCBF9430FE1B6BB7635E97AB5FC9DDB196FE54D471C81 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 64B1026D7E185953040681A1EDB8A806F9EBAA02668C532A470A8F6494B16193AEB4288A03446B5CC99FE9B9E21B9DE8 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 99853FBF13858B144AE6C5E3BEC088E007A836519C9B1E2389F642F647E1C7E6D774C917DE166F8AFD43B1A0F80017EE + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = DFB799E528ADA443887430A7922D5B6CD9D4F9F3FAD3261943E761530D22F460DA6D09B6013D34E69373045CE7A5671B + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 90045D07C1D022972AD3147C4B52789608D2A18D8F76FC17848F1B53F4E6331E56C220307758107A0C9A3961DA5624F7 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = A4AB228F2C6788CD355511B9B388F869B67FF58BA7E9B9DC1EEBFE4EAE423FB188A59BD86240B425B3EC4FE3647D7E5D + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 02AC4C07305B0EFAC86B381CEFE3AF7E760688C9DAE907C3B00E528F751020A86188D3EEC8F867D068224710AA194A18 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 78D575CAF392C46F3C47DE4416DC6A7E55CCAF4A3B2B8C6A3F1D500C63AC8149D257D6CFCED108D03AC6A30AA472F6A2 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 790F73238262A96E988F62844074E7C410D040716C8D98F5549CE81BC52BB5224D3ECB5FF819E9C3BE8E4990D15BF0AC + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = BBF77C26F4E8E065DB866CE0FF36EFCA5B04550AC5B53E63561FD80844A9E429FDDA22FFB3EFB2512E5DCFEB786B2ADA + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 980B8AB60388A16A3A69CFA998690145E1AE8A923651FFC054B04111A59EAFC77091C25D7568311901533CF0267CCB92 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 7EA219FC1EC690ECF114946BCEB829CBA906AECB31844E8378590D9A5AACFCAACA4CB50EB8009BC5C390DB5C228C64C6 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 8593CCC4BC7A9D46ABB39FC65E106EF9BDD5A563E6C5A87D80CB2B6E5B27EC31D46456633AA2747564DAACA38C1CE77E + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = EF0984578B94C5ECD2FA775E16B40FE6B639550C1230D9B76EEA09BAE01F911BC6DB0D71EB49673D4BFF772C45AF69A8 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8840664F43D56B1DF962FED7AF42A2BB99FF055E785A962AD102F044E89048D3BABFC8792839AA8988A4810A80F11647 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 28AD9854D6EAA221DCF44B4201E9177D40EBA2B43FFECD1BC9D3043A019060C2A98663C3C7C8FA91F0561DCA092BFD9B + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 210B7B5A3F3FD0DF07754678DA7D5CF22C006C1D26A22FB09CC7DA37FEB4B91503A7B1F73E32FCCA923CCBD758A6039C + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7591ABC77C77AAAE3BB7F5F17B5BAC7FC880A8FD7E4BF37DAB8AC2542694D07C36A0CA9090F64799333CE58FBD72A0B9 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A7C94AE4873A8E9A6E0FE4984B530D28CF23B852060748E815C41492F9E3141B8D3B22E2788E0ABD4EA1E233D8F5D10A + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 928B502448B50B36EDB144B354C8936B28773726EE7BA8ACB825413A24D2377203546EC998D0E08391E1C70EAB316944 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 26B55733177CDF2AD3D1947790DE280AAB1F308FDF3B142D65693F9A6528D05AE4621097C2568F29CC4FE258B1B72D73 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BC208995AFB0B32ABEA38E4FBDC5BA3540BAE235A81AC71FD8D70D76437CD703BAEE85E73C1C522C3E73D7D3533B1014 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 25BFD80B0E4B2756EE80AC9D92CE2D65135190432A6DC9CF287699811B360717967F3F57D159AA1850B35A0D17D52E91 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2795204CE2873268B293EB399D512C6041143B7D934CC402827E07FD4C635AAE3F520EF0C441AC7BA154CEA01598EACB + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 2CFADB46345316C111A9240F1560FAB118A0AC50728E4B2E82F821B249CA7B33EFE89A6C66CA165131745FFDF0478675 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 996D03D3DD3044B7D62E25B9D260B7C3F21D55AEFA6A03429971DD8536FDAE9DE35FCC2AB35F0916805911F88AA91CC1 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = EBB40147A90815385DE13786933ADD34E3FD2B2B47CFBCE2C3339958E25D1EC1C2085E1E47F0B52246F411C8D542C2F1 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 43B9AD80477CC9B330478EA3B68B6856374818F1BBBAEA0D0A921705A9C5DAE7C789D78086F8AF354A6BB3CD10E31709 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B4167368927AA01AEDF0AA814B8EFD8C06BEE7C5123EF3D300CF1C92D1408911769FD5F550EB784583D5F651558A46E9 + diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..520d992 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m2_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m2_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm2v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/LWC_AEAD_KAT_128_96.txt b/romulus/Implementations/crypto_aead/romulusm3v1/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..7c944f8 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 9DAE2C6FA9692264572727DB77EED616 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = A06E348183FC4424F39C7359C872D5F2 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 853595C5F1146335F1533C1E9FEDDBF7 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 631FB25C9858EA7E1058A99F65D67A83 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 9706DC71E0EB2EBA01605DE182CEE866 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 8C932E997586A6A482D49C020ADE682A + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 0C4C06C0544D93643BA6E061FFF3792A + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 640C7F03930E936A72851F0E65C34E71 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 27BFC46153983D96BB20270BF85A043C + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = F11E3A88F2D803694922E7C5B97426E7 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = 85E528C3862E2E5CCDF3CACD4A610D24 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = A719212753B6755E2EAFB439941246D8 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 7010AF8B5B14902E79D4A3F80AF98E7A + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = B6E32DF9F0DDC5A9548244F3A4AFAA14 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 62200A699245B363D8F56DC61D923287 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 640929AFC7783CF9F3D4D79F714AEECE + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 5525969682EE541F49011737AB329FAC + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C9330E2E5DDE1603C7F199F33B98C4F5 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AC17C68945855CA0541DE37C29C22FE9 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C2B453F4D5344F55CD3C8A0548B0D272 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4DA0583AFB112C50DD6A88C5054A0A13 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FE606D882105430284146FBAB687CA1C + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 92789620B1D87C753A7760A0CFDBB42B + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D134B52B8BE21A8E1ECE39EA35D07B94 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1DFABD385749878DDD4640DD81786500 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 92517ECE8DD15C1B4FCF3B1BEFA5C2B4 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 70BF37A6E98661B1B2D586367B1233C5 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 80D3EF637138502EF9F0390539A092A2 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5767F28E17459EB8254ACBFBEE567A71 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 7747DD162E32EFE24755F9D70BA5A265 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1BD9F61955FE9CB202374F81ED901C6B + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = EE624B23394A250E6208038803324F98 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 4A5843CF6314CA97CD9F234C80DDDE14 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 90F142D9783BEACFEEB4AD9A809FB869FB + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = A4B6A330DE9994C77C146ED259102A5612 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = A14942AD2A8AD0782D6A84FC23CF131A82 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = 906EB8F0EF2CF9FE61FFBC8FA2DDFCE4D5 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = B6A099B675A171441E8F37B2AB832E0426 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = BCE3E8D86A83DB55A3F8AEB07F0F4E8A84 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 7F2B052BE3176B830D227904237BE426C8 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 015D56DAF5D486BF8BD969A59FEB77B1C9 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = 96C630D064579136193B3ED1D96F2AD560 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = E8DE3BB3A22CBA30931448AE4EF077C660 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = F042BBA9E94D4FC721DD328C3616689ADA + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = 6A30693792C1F9030D682E2BCF46D27F1E + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = 035AF96E21FE4AFC35987007F32ECF286F + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = 2F0AB16E05D23F0E3725CF6578383A80D8 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 4F30E6CFA3AF5F4C750A86393BD7D46A43 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 3CECEC3F6BB58BA0B1741841DAE88AF1B1 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = A2472A7ABCDB339B2DB832AD750A8341DD + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 24D13FC368618F830DE21DCAB079DE4E53 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 495C599D24D7FCA42D703B073BA0D24C45 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5ADA4FD8535F0F93A1564D7D67E1DA7639 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 058DD23B24D52E3BF8236F16507E1031AE + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 858AFD01AD94FD2D159E6F9A65A1452BE2 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 80F1B42E8D8A94CAB726ED9B5A05E1A53D + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A502007C9CD3B7D81E19106C8461903C67 + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E6CA0D820FA1AFE2F0D5D4D389581ED7A2 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 60248073F3048665B84A7D5E3CE043AA8D + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BF7DA59153AA8C984A37A4691CED44F475 + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = ACD1F4ED90041533653261D9C0DDD08977 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B4D0E44DD79D1B9D25A292F30D927DA8E0 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3D5CD41EFE5576D83583E21A90E8564823 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C3DFB1B98F0F0FFB03979F0B20A0F072E5 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0F8A8B25A9522BD6A8502B880CF8FE054A + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 68A7C8774A5F2642C682DAFF94ED1A227F + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 49002F0FF647B434EFD57D3044246F21E89B + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 015EE799144BA2BA239FF717CCB5D1EBDD43 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = 702913B7CB11CECE85F2682E73E87B4EAD4B + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = 1B0A7D636DBC0B079D8F072D32651A0DDFA1 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 9C27C6B03D3CA4144853DF8AAA24BE812C8B + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 23B2A8E23B2B5C5B9DC470EFBE569B3A72D0 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 452BA72BA114DED56AC2A85A85018B09AA47 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 1244B70A273108961F785A62F57DBDA0B2D8 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = 628A67EF4D5BA12FD9CF95C106548718AEC1 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = B6F3E32FE8AB3DD4D95294ACD48FE75F6906 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 15ABD399A01A45032951F303E09471998C9E + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = DB7DB444A3F6B2B9B3C40E4B46AB906BE7D1 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = CF3FB9D86D133E27C5CB96935FE426F571B2 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = F1EEF06E1D547F5BFE7DAC470A026DC56FE7 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 44F4BA43E139A54FF49D62B5A59F1180EC0A + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 1F838BFA36AA7070A50440C66B2AEF92B270 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8AA3F725FF5EF7F12888FDEAE3A2A9793B58 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7E9C85312B70152CBBAAF939E4B7964A5D3A + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C94303E80E54054D1E1D1F0C2F1FB940266D + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 76A09C0EDA30F69EAFEF52B44172626474E6 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0F948E9EB616F8A939C3E4F2DD8DCF447F38 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9E27022669AB8B6882C1245850AA539DDAD3 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6FBDBB881169116EF9B9B82239A484A142D4 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4AD8DE0A0E576E58FE14756094A57597B589 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 16A1208E8EE09D4F0AA635BF47EF100378A7 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D2649D5FBC1062E9EA8046BC352FD86A83E6 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 587F1848886272F9AE03DABB9F6271756E21 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 7832C615CDD971A9FA41552B771F05D6966E + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 17D32181DD99CCD4EAC3344D7505568241F7 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2F1245C067BAC326581CA5E690C093195ED9 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A8BFC893DBFC1349030491C7B07C5A1F05CF + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7ED6F0CB9730944A8E2794D29D055855E377 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 0B941929903A5019432524BB053463DE3DB8 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = E781E7B2C37301F079DC045CFB8DA88552D0B6 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = FEAAD63F9D37A3197B0A0771187EC34E4889C6 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = EBB49D13485321AB8A7286EE406F0624F9079D + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = 428B3F220513248E06A055F8E374D9C4F44E56 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = CA8FC93A039A1C1A94AEA9F4D5FC15D06CDFD0 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = 6DDCC3790F1E561C07B2026FCBE13EADB9B9CA + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 0A75B5CF31F94AED463A0061C6ACD19CEC8DB8 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 517C0FA6CB59783B74F932762A24FA66B7DF35 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = EA4D04792F5C8D864F1FC2DEB915B4789919EB + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 1F9E49D7E3CC924B08BD52D3C0F92109E235DF + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = D20E596F372047F1D9A33B1A76D98125DA5690 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = EB4F6D2F05BBB900A3B155A0DD1A4541CF3058 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 1E80021449F25E8F9D8BC62D044DF0C9F94B79 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = DC7385E70EB35CBFBD9D31EB08BD345A93A375 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = EB9A112DC850F239861AF4501947AFB9BBB846 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = 38A4D4D5200E973B43406CCDF97B9963C09B2F + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8C13F8F3DA281AE309883FE4A58EB4200031F6 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 1C9D60B7FB115A3D4F1BDEB23BDBF8F58A484D + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CDCFF45C2E7BF816C573D7EC8D4058D0CE8425 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FE44101891FB5CB00D7A5301EFEBB4C4AB3F60 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = FD11E555D9FFA1FBF25BAC81ED8BAEBF648FD0 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1AD5F2475682773C6933C6B0FBC1EA3CB86B6A + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7DD09F80A398B514F4B735D82B6D36D5EB645E + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 75B3C0633E543C31A842186C744F609BFD67D5 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 982CBE2F1FC8629F9A4EFAFA8E4AE37445A96C + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 190CABDE7B3B0AC4184321D18DB47353315EAF + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4027F7E0C1DAB8433D6C8B50462A187D12546E + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9D1F5A5E839A693538E914962C5DAD2FD38B68 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 812C56CE4E29731F057ED3CF82785F430AB86F + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C85F41E2F9902A3E710B5B713EA1DD80192153 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2EEF61186CEAC74270DE100495029760C6165F + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 44C55E2FF9D362F4D571CBD9027AD0CB433F41 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9DC083372358B7EDB9ED8F037ED1739752FAAE + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = A6291976B10638423346BABF082145338C0F59EF + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = D2EDB5E66670D7D11F65068A9C67A6A49C003AC6 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = CF95AC29FF53CD5584E85D5527F0363151C41D10 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = B0E4AEFCBBAD05D831C22F16877A2034C636A766 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = C084C594518148D95549955894D2BE136995FA79 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = F7AAFBB355D985D5CB760FC5D252D85F30E83854 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = C24E73B64302E45A4151F8C2F7ABAB442FF2B0D8 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 829973EA76C67B06345E9824E9813A650C9BF91A + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = 40A2B61445041E07D96CE64407226FDC8859EC24 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 2DA910B50A689F9453D6DF87AD7BF806A0726820 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 26732F5657E4D4E0DD7F3400BD5092CFA05E5EB0 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = 58F2972A146D382F1061A161BB0D2EA28EEE6852 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = 1E5D5E34290C3DBD8F135C257B4EE52A1AEFC03B + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 1835770AD5170BD547F308AB4F8D0668E89F58C2 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 326D25FAF722BC15978C9926BE079234E06769A0 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = F9FF2E7522AA65DE6539C960145FD1A4CBBDFAEB + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 013EDA090ACF76438E68B8DDB025EB4C635AB460 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 790FE9A972F1EB93DCC6A5B1FC31B032E59D5258 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D4E256F38255A15743A23C168AA53C7321B3AE06 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 8588CC3CA6AC0A484436B3C4FC19F847850D1BEE + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4AA9E91D669C1C9ECFA263E3A844FF32613BFC09 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 93BA3B23E13AC0DEFDCB0ECE6FA85EFAF0A39301 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C598C65E0A4EBC8356236C097A48F7F834625CFC + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E3C14061E356456958836167BF7DB4195A87C983 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 83A481A807C60BD23FDB6B7F49B7BC2B055FB8BB + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 853A202CA4EE103B38D18C09FA64956787BD813B + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E00F2109DDB35B63132FAC9A1BD512527DFADBA7 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FABC3263F830D8EAC9FC57B6BEB8B721AA42510E + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 78C9657D2B3EA2C5D686F7F3137E23A38094EBAA + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2B1F70E34873E3812E76E5B5EDA8DE6F850CD9CC + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BA2F556176FA1F301123416AE68760519111FB37 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A2C2E5DA0BC096DE595FCEF425CCD762AFD201D4 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 16AD49622450CE708C6AFDE41659FF71591589F3 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 0D1D71DC0FF76B0D631FB97BEECDA28ABDFB8FB515 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 05B679F542E7070E4F5C725CE7232510D1BB0A1C59 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = 660B4198CCEE838673A33F70842EBD48231EA7CAAF + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = FE2D4C46AB26D1F0B1B4DF4880420AF1A35C1A3931 + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = 6770D30B8C53798912E4907BA023E41D7F2C4CD8F0 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = E3BC83D80BBCB7133838162A5168E92D696129D649 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = C3C4010704952E3426A0E23D674C3C0B2E6DAF9207 + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 320A7EDE6195562C45140972E35367BDFAA95AACA2 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = A4ADAEA4ECE359ECFBE2782EBA4EF36C7964CC2B50 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 053E25FCFA3C90B135EDA590D64B4022B1362D2299 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 5DC1BF146E25ED467055B52AFB39C7DCBCFBA18078 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = A5DC676F98146F8C063FAA9F0FFD21AB404A6DCBF8 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 9C8AC31D5F6549FBE9FE5CB22540F471F443592A85 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 924C229731D932C664AB223CB8BE2453F02D7ABC84 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 4129684072F22F6DE6BEBA93F01EF80836C5DFECC8 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 142F849B01B2E2B451A0433C757AF3C619982A9764 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0E3CA9D9D323277376EA693B8B7F23A2D7AE76A299 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 40A735C32ECB9D7AD5423B6BA36A123E361D581EDF + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DEC80732BFE1DD010779C49AE625AFB220D5E23B75 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 33D7A9A1186494CAB4EC73416FC2FECDC98A8723CA + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 016810DBA112802ED1BD2C56184365676FA7298DF8 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FCDD7551A8EFDADB83459789E684DC1E51C12EF5A0 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 01708BB21C0397F5DBE2D8DDAD349267EA40F9E457 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7A720F85D68924895713C6753008351E73F7639F1E + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1213D0AFC959848581025459AC38CB373111E12E1F + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 16CA193430A8A50920FB5D7BB3ECC63C7B804104AB + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0F5D66A31DF1AF33312CC89D990F3FFDDAEE00E160 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BF51878D98C8B99A4D1E942E61FFB736E83E232E77 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DB3C6345FD4EBD1ADD375DD8CF5AA6A716F76FF246 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DC5A78CFF53A8AA97EAC21554B39E6BE66CD06A0FA + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6FE173ABBA440BF8D030DF330CC186B4D4FF916658 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F051718EE4E985E8DEBDFCA86293B6EB9ECB940811 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7D946F8CF85805772410191981B31D406946072E18 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 37ABD57DC5B7173984990C5659CF436BC8B7C914A0DE + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = FF5751B6A9286C5E85685C03A71E308AC37CF181F5F9 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = FFD5D502785866145D8F56C42A40851D2253BDD7E35B + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = C33B18DCDABA3F1A26CEFD44FB18C731CDDB1E22A9EB + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = 17032160C7CC88B86217C06FF6E08DA46DBC0EC65D23 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 57319683C805E997367374EB7B8450D712A3C54B921D + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 97BF1EFE28BD23E9F6D88CE93D318B413AA14C7A53AF + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 15BAA06B81BCDE2A2D705EEDD807948E151EE07F1C08 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = C5428CDD73ED1664D8961C29A1FB541F28CEEC5B34F1 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 1615EC1EAA4E360F3C97A8B001590D08C72536979C9F + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = 19A42219C8F236388AEDEE70A36928C7DF6DC1EE89D8 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = 1D387E53EDC7B768D5C82E2774CD7F8107D16C57E781 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 7A0AB96235760CE5CC10867435D030CEB440FACB9FDB + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = D369A22BF242FB0A88DBD02E6EFE703C18CDB880CAC9 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 7EF5B7954815AFE31466609F3CFA9F7C5B402D9661FA + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 62E897D1977F6CE46E9A37792F67C52C463F8EF485B9 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 20FB54812BF4267355D48BC95D3D31A1016C6F24B7AA + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 95726E27F58D8E82BB1F5F2592EB01A6CC2DC68C2772 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CF0049F113D5EAD9A6644608B5778C525E90A3A9804D + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 20203F46990500E57599FABB5BEA2DDF341CD0B873B8 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 535F42C719069DF99DC02CF310604A864B078189C830 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 267BA34E62E145559337F50D2B1D9FA8B67B2DE80E5B + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 530D6AD11B83E110463AAE94E11A97194F35B42D3F3A + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F158CAB656D19E2927512524AE7E873EFA7007157C24 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1DE9CB3514C38282A69F9AF3BFB61B088D71456C8286 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1CFE0A3F18268D6FD8E90206096D0F2590C0B824B300 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C8912FD7D03A89E5F69479B10D48C9F9DF1CC284754D + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 0FCB8E8F86E0AC114A65865451F7F77EC554BD8262A5 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BC982F033B176D70A7D2B7FF3B8DDCDE33E548749AD9 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8B851BEB8CC2D26B5340F21FB5AC6109221CACADBC2C + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D1C9EDABCB9EA93573EFB31D988B500D6DFD8A7227A0 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 59B237DAD4776F03818A6F5FEDFBC500738211854DC3 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D2E83DC105E803D5FDD63DD57D23592D91BC1758C692 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = CFC258CD4A6292D25713E9C5BE9438D11B5E34CF8843AD + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = 49423949D76A614166005CD0909C791C33345CD09831CC + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = 9BB1BF0755DF33D1FD5D6B139A56179D04F9F474A67315 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = F76BEC9465B823F64AF77D6B6560979C08C10AAF407D29 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 1743A38155066991602B0214E3AB9DAF1D5EFD1D733F16 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = 04847475A12C002ECBD48CEE5C0FFF03F259B5F238464F + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = A286D5534A560F3BA1F751A72E3224C4E19C2BB608EA78 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 0D49EE39F3B45086AF188804A9C3A2E0F639EC2F1D4436 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 34F5ACFF568BA384A817CB0911CED2C13BA4BA6B10ED08 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 5B006EC95585D66ABB47D71F3ACA326DE9532380635F5D + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = C1CB8EAC1ADC2886F097C0FFEC9B40BCDFF490FEDDFC1C + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = 91B0A6E97E30B762D626C79A1C037A9636EC4761A89CBC + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = A919710FEAF1ADAF4E87258CA1A2E6ADF3FEA4F1AA2614 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 41A6E93856D7543C2ED826AB206E7EF315FBE185E571B3 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = CFD47C7B52B81CE4D0CCF1A47660D45A7B4B57EB440C7F + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = D1B6699ADCB178367B16C836DD6F4622DC37DC20ED7AE3 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5EB7AED4A67D2A9A6E66D641C54370BAD1B83D2A517C8C + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6872F193E19E0271CF05E225DEFF950229EEACBB76DE30 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E6F0F64820540677E14C640A5F16D5084FCD83373826B0 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 314D093712646EEE248BDF6B14F9C5E859221214655A8C + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = CDCDBB8860541B2848592127BE7D5205EDFD1C44F606FB + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FE3969ABFFF2D1812186A1ABE3F6F6C578D32E558007E1 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 763C00132241CC365DAC9353D0403C933B125D9B91D614 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = CC80B39648F61CD89980020B4FC3F4D30211AFEF3CBEF7 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 57E556D686BB938ABA4AB5E89A12071F75255C265C4AA2 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3AEF04DB0D7889DB98296DCD7A8DF5946DDF689ED5383E + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A3656265CBA8808E19B94DEFA315CD00F586F842437DA2 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6AB97232B7B100930B800EC1C53C6D3D09F85E99A5123D + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0333705A6EEF7088FF3899F98CD0B3E9EC47B0C36C484B + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = F23F8D8D0B14156A4B4163E79690E44AB951207A61D912 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 774AC03D6639A9CDCBCF28BB18337745AA2F6454C84431 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 88AAC4CB1A924E5A97BCA7CE12543A65A6584352F0D7F9 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9641DAE6F8B33436FC804388F5CAA8B3F2616851E95CD8 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 11F338C84870385D2D453DD8E77AA69462A7FE6E863D98EE + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = E08156A86850B204985F84D0AE75ECF01B63B44D0CFE15D5 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = 352D9B19D5E7803435056C7FDBA625FFBD80FB7783F59B6E + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = 6BDA5C2A0620D411F1BCCE05B0CED24171F76514E93090AE + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = FFDF2C1B622593CF9F0FF153AB3DD2DFE975A120ABF26EC0 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 9BEEF6E409796871BDEC69D9A3792BE9AA94176938E3E582 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = E06FAF0DB86B8A5F4C45172206F4A6F7E49946FE70855093 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 36ED9EAAC290D5C573234D3D1D6A552F8B84639A1DC7CE92 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 2661C08F8D488CBF804E74E493348411889CD989B8AB82D4 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 1A6390D4B67D130F5AF8C569A9C5D9E15B715495DFD651DC + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 70EF12D29DD47F31F3C46071CA0373427A143AABA1A0FA13 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = FF388197F4CB125515744C6F4312C89B53620357D2705BA2 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = E434B4ADD75ABC98E26986B7C383C9BB7A3959751A6E20E4 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = B64A9DFC7C3ADF700D9E8AB443A5F389E82E5A3A8F3BF596 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 94FDC76D2361318FBAFBD82BFA280C2B26F2330B46C2EF91 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 86F825BC2059D5F62937A74D84651C34676DAC821C679870 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0AD84AB663C4034704EC156A3A6BCD2451F6ED419B662925 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A0168CDB66913FA9425CAB9DB424D93D0A3E700440FCCDB2 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6F0B7A200865B26B384A34ED919393CDFFB26BBE0337CAFE + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2D3F0C04AFC60207BEC835AA5DAC33F480C11816486275D5 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D809E2970FF7FEC167A08873B041E9DF826BA211649E5C57 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 45199ABDBF8FC882DF7EA2E9C4D862A86A5417EE3DF134D1 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E5DB2EDF5CBBEE50C50F78206CF9E78738E9E151E8C87C3D + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DDEC1ED3DC2B8DBE88F5574AB7F4E90AE9624A36A4DFA226 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4C772DCF54CEAAA46795F117FD04BB7D03116B26BC7054F1 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DD73598B65F23E16143D6DAE3D9C36FAFAEC5ACAFD0EA8A7 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D1ED9F38E2372B3FA2E631618ADB6F90DCCF57E1FBE0581B + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C09AEF667B4A0541CFDEB793AEF77E133D5D3F350A570004 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8545EE2906BC8D99D1E1053EC95C18E3088A20759E5CB2ED + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 49FA4D3438717EC3309CC9B01C23095AA514A37535A1E2C6 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 366CC2537EAB871A08429A076BEBF20B9CE885AFE3ACB45D + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 15797050A0401139743802B9758FB83DB869DFCF179BAADB + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 14E83F4B55FD8CD30DC86CBCF5103F56E090786D2800134E + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = C9314C5ED98A3120F2A790806CF99D0B60B01145FFFC4D12D5 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = C4123FF27EE987BE955820871C1CFF1883BE7A95840E0ECDED + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = 89B28009F1C1CBA4072CC42504E7E8554E08FAE26E937DE4AF + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = 56180391A85E8779A4E7B58D27E307F92C4C2DDADA9A29FBBF + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = B857CE646ADA138921EEF8800B41A2F59778749CFB650AD57D + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 454D9CD5EA71CABAF2E605779C53F6D3976314558E39071B2F + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 547E82E6AB7A66B924542775ED0D49056D742178D6C22DB0C1 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 64F3C8519D5A9DB68201D7C0FA1C059DA663994C8D4FC15317 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = BC6C4A10A99EB5D4FE82434DF0C1C8D99ED22EAD3D809E2020 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 05EA001E4AD1FF8002E922E92E897837F0B754B1C9EE9629B8 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = BEEEECAF065A2ED134B917055FC3CEBF50D8EFBF63122B8B1C + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 27FC0C49811D420159EB45DC0967F8A37CD223FF6205BAB3E0 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 161151F618B596A175C6F136AF1B5ED4E7B45984E6ABD6CA01 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = D3BD51D425BF839D5835993B285E096676E1C580F0A4515584 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 11662B1262E9B62F7A0EB13F8C1BEDF63169EF6B9A75588786 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = AAC5ED11E6EE0128CA1C95E8A05CB82A2A0305BC13D0EA5F6F + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3483A38386DB009B2A2259ACA218DC6C7324836AB87E00FE32 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = CABE889B0A630EB3E306DC484F1078D61DDD24F62D99C4E463 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3373D5CE8A1C6310F0C8E4678A710617519968BF6F404C2320 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1B769B51807AF8EFF7DC035FF3BDF2E9385F09A78F3835C0CA + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5857A519FC523347EE818FDB8AB445FA68E176D9C6FC318DC3 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 95F6827CD1472158F41B789D59624C49835F896AF32DFD49C2 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E9209816404D309D1D141C804689D07A36CBC60337B610F8A9 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9257BD54ACB13648BCB574C22B4243E63E7D8BE016130D9FBB + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A57F1C404ADB06DEDF5865434138A17E30463435474C50D748 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FF478EDE3CD23C4BAB59C8188F25DB531E60160BCB5613B523 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5CC80F31575457AE2B505EB3765CB539EB00FAEF2E2761D943 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F6A86E8965A4224776C334FFC7E86D44FA03ACB7BB2BC70B9E + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A627D4B1046A2E0593D89B6DF2734A215FC0FD992E94D44D6B + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 91964FC5EB2E5F61526F1F488C0414510CA65B11F9A53AA399 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = ADFDA3CFE847C332F20FCBBDF3E5390A71E5A0B2DB3F33AE1D + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = EF4E2BDE17A0F1395469279D0DB37BA0E3EA28732F8F7F6646 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5C2CE3811B7259EA279E228559B2AF55CB5B5F380CDB133F11 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 445FEBB943EC3E0EFAE2D6146FAECF4C614F2D06F26040968FF1 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = 50626005ACEC908F8E7463D45C034BDFCCEBB86BFACB9982F2D7 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = 81A54F8D3C1839D16DFD06052E66900D2B69AF9F6850B7B4CB83 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = 764218A15DB05308D1544621E8F980A6A87814A7E4587D208DFA + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 285CDAEE4B905086A0BB5B4543D8FB930200DD5E3E6D7F7F8AED + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 0B2513874CD481BDADAA069F0548854E9DA68F425D70BA65F1A1 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 2A0932DAD1133EB8477FC3E0E9A207A7C2C2D124792B95AE9962 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 64E68A5AC40D14C00E909FF4C16537B4BD796FAA6B7634FA6581 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 64A3D493607B3081190B37226C28FF8E240880D2B351BEE4E809 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 64CD61A101A78D43F47BC74E3D4D7A6B74F152649FC32AD36B19 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 42C30422C8D88100C880F062E4FBBD1E1E06CD6E730880B0C14C + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = BB0E5F6CD865EA5415DD3A90B5FA744D37F0D3D62E8A100E8227 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = 3B8D37F581CA9C9B22ADB0CC012AA80580335281D5D231F038C8 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 4271E70502D40773296B0771637040CB5E336BC6A1F74AC78C4F + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 33EF0086DB51F2CF3ECD5D739390D1E44D36EFD6C6A0AB0D2C8E + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 08C95734D86657FCC2EA49120D490F317D9C31D978CE5CA22A94 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 14463678AE38C87D3E73E812154DAFB7F417B9437A355524BC47 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F823F5CC03A8AF96705D8037AB26D29414A353738B55BB262AA8 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A255459EC6E3C5384BD4A6FCA55CE6C577451D59F59F11A79280 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3FE8AB588A91D22E8687B9DA56D2AD4A7578BC30475CD7653A70 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 55EEE17310B2F232DA925B6A07F26B2B3836D0166CF4CDBBC7EB + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = BECFD73E9E2A23227B76F3680DA9DAF9E822447101E8D0B8F75B + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 279253263081C78C2F09F726476AFA6F347A2A401A4202DB2E8A + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F4DA8B3C7D8EE2FEC7B71F099CE58B8E809F260E6F42F3FE5F14 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2C388249EE7E061433E95E806BF12B4A58281F705D810C6FB869 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 15E6D5ACC35A668FD0337BD2C50844F1452C4A35551A8A21AE87 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ABBA3A2AFACCA7774CF8BBB308E8831CDB9C66EBBACBD011F6FF + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 45DAB9BE131FEB88C87FABB05415B6643356A588F2E791ECB32F + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5FE7B6D98CE5D7736EB987BF4876D1274E507BA74F1BD2CA1293 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3B95EFC341A522F634CDAAAC25A6896A5A8C77FEFC812229C5E4 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = EA0B152372F8CD1D48ADC8CE5A3611332AA58B413D85F9143B29 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 32BC2968487C5B93D0B23E66A2C1184CB6C42DD177C017DFC594 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5A6ECDCBBFE9CB144AAE15FBE2BC4304A6777D5EDEEBDEF532D + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 43D32E9D6C70FAB350CF25C9979D914A42000AF1BF752A01A21731 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = 65AEFE2E93AFBA1262247C0A04E40BE69C245A2E71AAD3A48E95F5 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = B3CE217D534EA670F36E01027C40E01D872E0F445B3772924DE0ED + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = 542405EAE94211E2B675312152A4B535646597C99670B402DB8C03 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = F4C7A38B6CD89C79E0407FCAB35E140C14077AEE093AD9D8DEF64E + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = B3D7D1D68483A5C958A1ACB4999820403DF32ECD97B6340F51A1D3 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = B63B345110B87712D7E39F6FCDF7454EDE9A39C2A19CEB1B86C602 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 768DB3077EC0D51837ECAE3289EC234E1DC3FCC62112BB154564F7 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 2009207BD724CF4971C73A30A43D1E9359E0C7302B87330B455110 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = C8F8DB56A8E300AA70084FFE0F2CE8553DE818F273300332AAD3B2 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 140E47DFBFF3017946F9059D68BE5225592D24E237BF799EC5B175 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 5DEC3E376FF18BA003682F757C85E80B39515A22B692FE82E01147 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 4659B52BE189B74F4AE2312E8942F64FDE8D2540B69958DAEF9948 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 6ACF7171FFCE60E495842BD7E837014436229807358018A0DCD919 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 08F56B5375EA28918A3E63F12B0DB2AD8BC10B2CD29718A102ED8F + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 73B7FED0065BB9BA65CA91C0A268CE182C59A2892014777733F3AC + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 56713BE24E92499A838509252243622D0DF541FE683B896433AE51 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 812893DD77C92D981D87412C429124BCC9E41573DFA0A39D4ADD89 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A411B898DC89A575F685B3AC4BE0752BC21C5BFDFA29F2B0F93C7A + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 78E6BBDF3C6CA3C24BFA44F35E2C5AC677F18927946F4C78145954 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5554FCA49A5BC15DE9BB2E62BB465C11687F464FBF49012CA6F0CE + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 6A46714A9AD2139B8179A8B6D4D0B7720793EDA81D681AE9F7CF41 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 97D207A02E2D2C5F534F3C102C7080874FE24F6F1AF0EAB91A398F + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 71932047747EAC7E83DE17E034FB1EC0D0C0842782E6C2750FDDB6 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6C0C41CA5048399E91EB94B883904951555E140EC885AE035555F6 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 83BB6BC3D77078C2AFCCBAE933264231556700F49B7CBE71840F5E + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 10F2279367AF28EA859BD6F9344D11DE25740C9A7E07C317C323C8 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8D983D2EE91346E5EEB6BF4C8178D49C651BA9BA9CA9AD54BF88B7 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = C562E5E21CC667CB67C59E0B1FD9FF5F62683E8A37686932B2E88D + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DC38FE235019E0BB4F2CB6935429C4B626C456AB684E53282CDB96 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D127DA13F5D5F58AA731FEA54A937A0DA71E0514DD57B6C1382079 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8845971D89A9D74B4174AB7CFAB8186EC81C4B26BA8C92968C1ED5 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B3BBAF32D9F6B69B47CFAA10E51A9D84C80FA2BF265B5E77D1C4F8 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 9D0CEEC13406C356F50380FE980E0DF5D073EA7F3AB56C1811CDBB5D + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = 36ED875E89C8A5B91AE81A74F3D61C4F2B4B7E5C65EAC7555872DA5D + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = 7DC831E08AD58E5CEA8634B0C905305934C8199A849376D958A9A3BD + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = 2AE41949706F4D9ED42AB684F4CD8494FB0A6ACA2DDF3B7E6518335B + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = CA05C5FAB4941D7E4C3CE94045B126E1C5FD40C87C84E3BABBD79A42 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = D5418E614CF46000B2EAFC29FAE4C9A4B648B325AA66D4C9381AB674 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = A25B3B41EDB7B3A87B4760CDFA64E86CE795DE4ADCB1CE674E382598 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = BF2A5AB66C1C4009D93231034DE194F13B61EEA6BEC3CF1ADD1D7AE7 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = D9E1487A0D2DFFF70CFD166C9A644DC853C47E5601A93F209DA128CD + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 32CAA223B65652536E70D850311C5F446C61FE00D825E20725C360D5 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 7D55869CF6F4203DAF237CE140995FE6D8D7394388CC2A72225FFE28 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 625D3EAB2E28004042CC5FC8C4366260F2E79469F7BB325F831EFF96 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 69DE63E6F26EAA03DAD599774B1A98F94EEB8037371A457135D19FAE + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = D0317C43BD0ADD654C4CFA1529C6827B54CBCECDAAD29CE08214764D + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 1D96E78B7AD258A04C57111C714A6E4611F4932DA1E657A332D7801E + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = A85C86B49C0F4C2CE6971055989B701742B2D7E6CB1017C89DFB9ABB + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = C1FC005BD2896A18BCD75B9362CC3111C54D12D598798080BBD6075D + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4F5E2892A3A4C5A676FBFF9E7ED0D5A56F602CFD709633DCBEFE07AD + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 444387A0036B882834A350D13776DAE0073295ECE64ABB25537891C6 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4BD79A60EAB3241C25F7D493DF97EFF8D6FE5A3C4F31B5993C1E853D + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 010D01B5A34C493DE57CDB0007C568ACF6F71CF35B3AA1E1467D04E4 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A0AEE0821E869AEBD35F59F4F247A5EB2BA974E3EB16CB40E85C6D01 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 235CCB8A6435C4540686ACF25A251744AEC9BF13B8A67C5B35AA18DB + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 586F42D014865E1EC4E394E945A4D4642632BD9578C0259C07255B31 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 48D86FB12452DA728B8222F0297D9EB34D8E95FA9375FB0A35E5EAB5 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5A85B43079AFF537ABC734F8A4FA9886872DC8E3CC10CF5499F80E4 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E2C53E51788A5E54B00365AAF91C24787226026FC5A78237865068FA + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 87B92B613F105568E65A10BEA7AC2248A433B4CB873C4979A5B1FDFC + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 18C6C277CD6EFBDF0A52762F262361C1A4B4BEAD063B174F73064756 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B4E5CCA764337054AF632BD57D383C9167CC64BF1070636F77D1F915 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 73FF668D6E73166E250A864A4AE6AFAB1D5C78C06FA387CC1CB76264 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CF54A5A361D7BB9AD104AE4EB7CFBD5DB1B93F55B7C6FD0AC931E56F + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 20286A1C951BD296EE1805EA870094E89E1AF4F41FF1A6C1E0513F17 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = 6AD3150B71383CAFF63770FB2C6504D1FA04B4B8C96D51BDF32F7078D7 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 5C88C2155D78CBAEC9C88D69C4EDE6998B680223869052012FA7BE5656 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 874945FF65B0D065BBFD838AD72F4E800C49A8E4315F4C8C4CFE9C9B9C + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = 65A94377170C1218118BDFFB1A68F5C4CC2010D6ADDEE1E539BA0A718C + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 7393E4A10919CED6B84250A008B01F1DE4785B55C9168FB761DD505E97 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 90BE76207633141BB1F682DD14F7FCE44DEE4E5952367CCEA177CB64C7 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = C0B1210506F33A71B6AE6FF889EE8B2F9D7EFC4FB54AACA4345C4F0144 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = A712D3F692F59A50F7D34C393B7D2F13FC22BE07BBB1BF06D0B13A4C1F + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 4DAFF41B2380F1F326B3E4B6F93CCB3583AEDE3FABE3BE7AAAD59A3445 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = FCBD144A8DA9671C0F86F45B378C3559798BD11D0463CBED8AD26C65DA + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 1631A52AC4AE19D595B799FFD4168555EA22B9C0457EE52B6C12644E5D + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 17DB1EA945136E3BB4C6E0FA3A3F89101D84860FF11C8AA3605FC56AE5 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = EACB449C2765E0CB151851FA3FA66F56F3D1075A4AB834173D8589AC0E + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 836AFA9E640D0FDC7651AA92EBCF20225F2740099A52229C58E209FFA0 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = B9E610722FD2BE2FE785A91D383387E49D5F30F8C0079CAEBCF83E5493 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = 1664C39B76942028F14D6F09013C44E6193866319DA599B498BF06B107 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 1BD6864114319781DA7C4CBA2C7664B93AC4F554731620433803C32CE6 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = BD32967F4A7DFD9F2381A364F5C709108AA12496CEEA918E1BA79C6EA4 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6DA2491F3B24A0F32A2A679CBC5253A1097416FF51E36D5DB748A145A4 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 655CDB39BCE93BAE2055D2FC1005FF3601F65E31FCF36A36DED48E2792 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 41530597052F7A11CC6E30C1E42D406C2DF32418C594542FA59657C069 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D054C43BB2CA1969253C891E1CA300C3E4CB0AD6CA9AFA7873D891B075 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DDF13556626CB7AAD21009DBD3F7E27C8AF7C853B285A7DBE0073FC96A + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2818D6DF1F08C3F2F9B66636A93F8E87F9F0B9B5CC0EF82A0B08A6BFB1 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F22239ABC1990EC8972EEC881E0F610C997AE1BDA5BC38F35A3826FB37 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 51D1DF3C7424093E12D752A75E3C2D7734DB8EE230504F24BF8A800070 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF9C3F39A86343F09C4AE1E8A8E93C6386709AF4C990E419E6A65BDC61 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8E79900656248FB17AA3580DA0B1394870F7A3BA6E3DAEB27A2D828439 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = EC02921A00DB8BB7A8D95F7B05FB7D679B2608221EFEEE14C4998804DA + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 06DE08E4A8395E185D5A2A3EFFD1D24AE846C386BF020ADC9261091579 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DD68C51177F302D63443F101EB19BE7866B65FC80DA09133099BBD2146 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E348DCBE314019BC2437FC9CA6DD0B92A272BC9697444C2764E7923B70 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D6D507470EFDBA64844CD7B00154EA81EA39C27F33133D21B551568FAD + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 8CA54B346754141BF686D62AC9E76D4AAD739C6646DA3417FD4C5B991702 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = FFA6B156DDA78A2B1D3AA98A31AA771EB7E2EE0FA1660580694482772AC1 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 63EF01E05EE1F2258E0986EC63E65207DC3A8A1F2C09F956B79892E493C0 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = FB2E3E6257F1AC72FAE4C6F0F1AE4F74EA554F85586C20BDFFBC652FC566 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 4F27EB3B58CB13E3E79F9E2985747E8AB38C3583E809ED94B9DCB3F16B9F + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 6B7DB53DB1122BEC5B6A1F2CFA87E3FED6ACFDD820F8E6AB0FFF4EB346FE + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = B1733F53E9927C16044D97DED1C24FC7A7171FA96F81D4D58BF3BAABDE3E + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 3488F8A572B9BB8590B134E749E2573AB7DC98E41C07A29D8EAB3B88D779 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = B4BD42F934C29848DA4E11C9631B6202C7D645765C89FBCBB549A738A6A7 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 2CB23B198BA6634534ED44ED61724F85ADEFC5069DB593E6BDB1DB866B83 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 0B5FF587C59795E09F0A7E517C2519C71F7BA6ABD4C28E36A6C0A7612E42 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 8F1FCC1A8CF19455BF476FED73948C61205B402C08923E7F1B5FBDED6AFF + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = FDC8B0825C961C6F965452B1E999586ACB071022043B3F1E2CFF5C3BF14B + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = CDB7D9187C600639C803ED870906711357A9A125F0FFBDCED9227CB82C2C + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = F1E49520289CC5028D149B25FB889AE36036BBE43A8D661672C397EC12AD + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 6C13802F6057390E18D0A7CF1FF0E439B19419F40F0A433143950584A46B + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 89BAC3B8AEDAE1C8799547D69666509DC4D942002F67952D678326AD1963 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 56B99D148658B1B23E00617132A296203B13F4629F124E6BD34768A7C78F + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6DA9269F2BC5B4F68FE4CC057926C26B2B4448B969CEBE2CF23E8DB96CD7 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 48B8BD1BD13F686BE6B45834434BC6619BB892AF7FD6979AC4F28B8B8A25 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6017344C7C77A296DF639B7FBEEF15CC4F9F35426F97ED7DB7173A2B900A + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 680F6D98017DA0BF865B00114F6F077D28872CE168B84A3485FDFF4BC8FF + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C2D898930023C31173F562E2DBA277C213645E95FBF76EA5073F645A5765 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3864A2690A70BE80773BDE100ED984943EE5522BF4A5EC6DAEB841C04182 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 14EF418CDA37432D0B7452C12CF7D956163587A40FB8D9503D30DD1757E3 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F3C4BB3D7A372AB8648F4AB86F5BCFCEA6720C0CDDD2294C00A852CFB55A + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = F08FFF2B4E7C6457D95CB879A8757178109C2121B493529665410E992955 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 20291EE6011F4FE090963BE5E16346818B2DD45E580BA9DBCAD8A3F831EF + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A414BB4A2A8A071A583B5B8B96AB5EEA4936F64FCCB47C16F8214E2059FA + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E10C81858386E75E72A5195F66097AD257A0546C738003DA43A22A139A73 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B6E3A1C4ABD320F7925667F6029478CEE2CB83CD94EAFA26928D6E6C5873 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 65D22EADEAC9F4B0B34CCD5EA80A473FE6B15BDC5CDE0976E132F8A4FBBE + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2EA73498D15D7C8CDB909C9327886BD353D0FDCC616E9C9126B81BB91D27 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = B5E1B53FFF5F82F1EF95973B136A28B68AF94645C6858E30467AE3C78FDE06 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 5D5FC44C728861A97D07E0A94207DA58733D5DC9F7ED4855CA6819EDD5602E + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = E796C6A2B6F66F21C68CDB70F6CDE57BCC6B37EA00AD7E8CE3AEF4C483949A + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 4D9A13FCA43B34BAE719E660D26453D5F93949B3CD37AC70E456899DB913DA + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 20C3F796BEAD6E14D7490996D20FEE7DE304B8E67763F619134B3A74B8C90E + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 4B749A9C90CC006C9D68CB16613A5120F880A169FF2B2727FD9403046927D3 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = F79BFBC80BB49088857944BAC53189FF457077272E0A2837E1E5733B07C4AE + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 9E7CDE2A89B2E0A4EBCAA919379A5336907AE2226633A63CCB7B71044BAB4B + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 4C3C3D37BC198B6FFD9E3BF9930AF11A4CD75DB63AD456C7948E0EC0ADEA0F + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 800BFEFCCDA5D5A4BDA45CCDA0BF94F1ABB90E0B7E3F2E336164907B83BA3A + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 336FE0B60816611F375B82C024CACD5DF611196A032594E6258C05C82843D6 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 83D7AF4FBA37AC8F7E2B727A297169A90DE8648A5DE118F8FCE0B9192ED5CD + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 34C6994D315E7A7F6C8CE487364F154A5CDEDFE17E706993E73C8CAC5B66A4 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 2F00819B05636C4B312662564F5B6ACA674EDE5E5068642F17624B780B197F + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 60AFE8B885C89782AD4760C71408B87A72CE955E959BC9E5134777456A0562 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 4593461252AC43058F963494DF78405D0576CA3D67656935EB614680D75C70 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = D6D888EFFEB6359C71E48E36A36D087D155D9B7AFA3C77C39A959D6DC9D00F + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D1B616E3122AB8DBDC1AD071C84BB934EC1E8397D96891CF87F27DC6B01FB9 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 89B6F26D326C7256B18BB42E6A21F8A8BE2E844332374D9B9E7E9C042282BA + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D8AB9DEDB9C43635DD0ED855E5778BC64E9D59F91CB043AF0818F1DE1DE587 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 30860F65715B0A084637517E5F001F3AA2785531F8E066D9280C5B8F8FBBFC + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 75ECA72E7DFEF898D866CECFB18AE96130C0143D4CE2860C45E484EBFADA98 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 259A5A81B97821E7CEC148D02CB6BBF033B9728CB4B2AE2060609412CBD8F6 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 97A8198AC25714FF73FFFC04F033E775C5995542693F01E5D344BB2CAF1A3D + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = AED703975776BC29CADC177E2D0767FFDAA8577E82CDC524BD34BED4685399 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 443EA386F41D181058A60A133E12592211E01014BE0CDB1B59D7E9527A813E + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A21C9B862D7EB4F519D53233CCDC387AF784EC27A5FCBDB9375DD177477242 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6F90FA2C0273859B4EE7D5ECA8CAE4D28023B2B70959BFA82791D640577EF5 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D1D4E3D53AA5E4DDC54E524ACA063356EE22E7A5716E94CD1FC57DB367FC32 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0D70D7F414ABAC4A770981AA1EFB753A5AA7690CD892DFDCE80B3E4D1253B8 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 38A0791BB61BCE50A3EDE9B8006D8BBC484ABA2692F70495171112CA405BC6 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 57B32943F51A3FD568BF43AE92B94EF5E6C35CCD2BCAB624E8C5C5D6B549A4 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CEC94028569DFB3445E0A73B688F5B6A85DACF742C49365C46727687D79424 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = E9F8E9D6034A7C34390EFA1F9E314C4509B92149373C4B72DDCD78130E5D98A4 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 0F9A2CB9EE4F09435D471FEEC940EDA1BA299B971DFCA456DC5837EABF7A3F3E + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = F7DB3980F03424F5B85C66425936F58683BDF7EE623C6F3F482DC208949787DC + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = EB14A4AB7F2C12008E6943FAD32ADB6657DAC4EAC34327D64FC7C443C86E9AAF + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = FC0C525C32745F88419538F4D7679CE3DF58F366014685492CBEC5D359F405A3 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 8013C91B00246308F863519575613C7CB030133490DEFF04F3FB038A8DFF2034 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 574EC37765DF3635DD3667AD9F91C431CFA67258FD47C023336852A436D11581 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 48F85EFEC5099ABC25ED6011CDBA87FB1C7A6FDA806E71FFBEAC731FEBED8395 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 6C3DDB0960E36FDA25A968674BD9C0D8C2E2C4FE731F32C6F29F1302D307BF6A + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = B40D6B7FBFA47BA35F670A34D48E9B3A5CF609B211946A495A9117F74E02F22B + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 945FB77A39D360C7142AB534558691E81B587EE19D62AC2E7B4988C404439A6B + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 1400DFE73EFC28CEE39956FF594536FA77C6B4F15DBACF11ADD8972151C57B48 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 933C250CAD994F3D6EB15119184F2FEE3E856FFEDA7BC32EFECFBCF58121A5A1 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 1459DE801D6352CFFC35942A57F0A879E578786E9367721C529314466D76123A + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 2EBD05C23790DE78E42CBDC57D780C02B816B1FD8F3BC0EB52A5268C39075AE5 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = C6E8E6D8ADEC510529C25B3682B2F4EE821A4C3E3A9C267549ADACA9C2D9B596 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 79E59B12BE4A420ACC321531135CC80192973A29E9B4AB433638D03C335392E7 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A4E0E91874D13E64F4B0395F7D54037DE6D3C4E60861C555B753C7AAECF49B7C + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 99D99F0BD7047FE9C1AB3901598950CAA0331260414C3A3D9536DD7D2F84148C + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FACDE81B6CBF86533A849B60DD35D8DD85D4319301409F3CA92261AA7B0BA3AF + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 550CAFABA2F8B2B0BB504D20EA08E1EAB19CC9165E57BB9F66EF6ED59C5A9229 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 429E836D19811ED3723D109CCFD75B39E2340DF53841E0845C212AB402866E13 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 39B1039ADDF2E6677DF80997558171645DE6D125E4DF77C26A1876DEDD45899D + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C2923582DE7D8889107363B8EDC744DE81F039685DF75E9A37A25CA14E6F5F91 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D6697F831BCD65268AE1723CF8F8356A757086EEFDDEC4AD7DBC2A820B235DA0 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = EDFD492CD48A28D6A52403971D97436B620CD071EBBB75997F8BD9480525B28B + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7B3BC38401EFCC849FF439AE7C16742AD8CD61E0C759E9101177862EBFD76D44 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = CE6708970C3C5677A4E51B73E58FC190D58046605666408E8AF862248E3CFCAF + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A4E6F13C612625B3088ABB4C89E4338F41DD616609E12696135C5FA34A061B32 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FDAD2714A4246638B73318D75A2D1C39B1C286F555394CA12D6B5D4877375F0D + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 010765F4D671DBAAE2F6B2437616181D87BC3C50218455D3035FFF3863B9D611 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 28439C1AA1858FFE1095024548BC932AB6F7D03CD8E8D8857634B6188CEBB510 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 48784EE91FF696FD1E83709E8E4CBB91632B0D4B2DCFD2FC8A31705E9AE977AF + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 15D4B331DE79229CFE8E1EADDA5F3743354952658C0ED40B8E84CC4DA206C0A90A + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = A266873942F57FD9A2C7DF672593C5561DDD307F8444F258FDA222BE13DA60265D + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 95C1BEAFCCEB9527659EEF58C1B2796F2DFE1189ECD45A296CAE8A6196B14BE21A + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = D548AC1383B3586DD28ED9D6386BA1AAF93FC5012692B1C18D10C998588E9BEE08 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 96F979F78A06D1D6DAF142E6C45F5214A1034938B9A05D4E35360B7B7D7D0A6A5A + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = E7AD0C1AEEAC0E8C1641144E792DE6F6E60AAFBB58A20D6893FE253F302711A335 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 51F34DA56EA19135A32215058A424BBECFA074D5C9F0348F0376F6A720DC83EAA2 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = AD233A410A19ED4D05B0AB59B9B57EB61DB89D059A98AABBD46E1D1366F303C4AD + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 17B0CB6629579C7A71976629F97249D17782121AE19B5FE785DEB6CFC33AF9FCAA + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 6926FEC8BFA5D68EEE1A1E65A438447F5B2467BDE4BA30C26125DF20DA82A418A7 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 447FBC7243DCC2429CFD9D4E24D19A66D7C3C1C7A73B8BAA3A48D058A037D2EF36 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 5E0459A5DC00DA3A369149B5AE9FDDB327810524FAB4AF12FE5BF7CA2AF47CFF5B + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 99996613C4EDD52F668E0591861C0799A7D862C4AD7E30D7B567E47633D6A2F290 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = AC6108477EDB1B76EE284932598433E8E5C04E8C95100E90E2FF832A93016E3BDD + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 322B22DA781ED9989637192E57244C48E6E07ECB323D5955AC9894EBA6E0907BD4 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = E8C2E5708F294006ECB7C22667D420A7419236FFF0B35F897B776E8F426D44AC0F + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 2511481CAF78A0322D111C81B0D998DC771B9488B3A3997E61235D33CC48BF0FBB + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F1EA186F442F114BA11B0E27A55FA964BB2042BCD5E0024D5CD4CB3535E9EE94DA + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AE95D0BBFB9C40FB038F513B05C728FC831888BACB2454176A693BF04C0F4E9814 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D1890451A52D6568DE2CC0AA684F2B61F9C9669A5904C39E2A5FDA29F4995A4FC7 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9E5C3BCB03D0AD88D71BCDB548DECDDA15A51679496C53053A2726C13E4F0AB33F + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0353605629BD840554D633B3A5FE10A2EA5C1719D249A6180320D69DC7543E9053 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 10F975392E3585C093358F5A7EE90C57636DFC110F37719C316B5FFCAC399EF747 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2C30C16066FDF2BDB4FF71517DF8FC7694244A49E44377C79A78FF6661DD2A1201 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4292BA4BEBB9F5F24CE70CF1E2AB5D13325FD0791F09200DFF07EEEBA2C4C2C23F + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DBF185464B34DC7C81140AF67AEF6635411C87BE115A23A13C31BB03E0748485EE + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A0E02BC7961C6DD6F0CC5F1D6F5E88E0CA5DDFAB20218348096748815329DF3F1B + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 053218417482CE224ADC17BE8FE669D9400188D0B69408C599170937A93EF74C88 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D6E51173741A53FCE20E72DE5FE53D302804D624CEBE0FCD8F7EAC6F90D5BE1C66 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E0004CF59643D318AA55469A22199B319E1B39A77D5CF17254F1C36339E0D08C89 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B0B4BFCAE13704264574804687B7F62685BB18DCCB67B4FDE46ECB31E8F539936E + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1D5DD853660E4EBED0F2E39DCB53A23276E8F1DA77C410790FF335C0C996A6FDAB + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F1A7AA3D43439191C095B174450CCECAD40C9111454C3AE5F8422C3D907F3CD3EE + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 887FFD7591441AB022D99E75A91477D061E9E3A1D7E4591BB1B0C4C6B96044D7F53C + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 04E7DD6D1519093D79DAB8180D0FF05FF53674E610073654C193833F5D7ED248C2A3 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 899D6BE319D9B8DBA8B4453E505720A53BFD8096E8EA8F1B147AC08DE55B37770095 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = D74A776BBE8B29F9937AFBBA9DC58CC3D4A783A16910F53F49B090164A822E68C902 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = F18EE69B54DFFB967CB4D05CB5C165AEB534A2B4B82A9CB7880A1084B7CCC08CD89F + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 5F198DA533C77578F20AB706C800A602B8FB4EB30261F64F8224D70D6096A4C22C33 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 0F99B1763159CABD0B1FE0453FA5387DDEEA68AF3EB0C99546F8ABE9D5C1B894D76C + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = DFFA9C7BC55D9BB119A40BD76A7FA88FB4189071AEE119A976C5EFB4583F287CA145 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 4A218CC7C8F9FFE507619D730F26015EA6AAD6D3237D54582B6CA320D51A55B6EF28 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = EE8BB1952E56F56CECDDAC9C766668BC5FAE66736B0479AB3F3F8FBC6D10FAB632D9 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = CFC33078BE0E432A29347B279B78B0C74C0F773ECBF8456316353D448870B5042A17 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 758CACF99CA48FC9C813CCF2AF113FC59B7119DC0C6A2B55C9288279519C78FA9E29 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 745A28AAA6F09EF8824F3880CA287D18A83839D7EC81D2D8F1A34DDE13A88FF7426F + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = A0DC42D37267E2E3535378718F472FDFF86FC22501D88D07D6C3870CCD107CA7CF0D + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 6E2A72DA2927F8CD240A727C03FF9270A503F7D661AA8F3828AB68859350EF8B1B4E + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 1893FF7BCF0D2050F3F9E5923437F0DA26C893376815E9D327756F007308A6E2A7C1 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = F52DF6874C6362F5CEE22BCEC93D9662991875AE6A7FFC57AB66068B0807A0BF8147 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 2E630262344FE74F3A0EA03B2146B8237B39FC9FA10C4EDEC993F5D2C1AFABC536AF + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F38BB1D47BCA9698E4FCA36EDBF18738FF9E937A2D7A7D07F35E8B8BDBBC10CD95E6 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = AC7D0F0BEA88235DDB1249C5EE6622AD8FAC28645DEB9A95319EF29AA0734CA884BC + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = AE83462892BDA12BDAA125DC6EE8FD63B0E959AFB8D56D0F471D776758F28A4D92AC + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 286F3215B36622302171A9D5819DA57C48BC5A2AD05AE5C8AFA0CEC3ACD92C00810D + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DFD1F44223EDE331799F1DE2C1833F8E8F2F2F68E13B68C9287E824F52A85C91BF70 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A340D06C938C54F86F3B47C2F334D9DE82AA46BFE675B3E1227696E8A6EEE052B912 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F052189D60631FC5DE352E8FF45201EEAB40CE5C2F89FD91AC890DA66DEABE13E0FB + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A70A3CDD8C3999B8DE175C82FF40D1B29CA72C603636AF015465911DEAB4A1D957C6 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0996DF9EF7E98167CA442B4FA93289E9B0C2EDC28EDD46C5122B1F74E289EC5E216A + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 7A631486DE8DFB64D23EF566F77B0D00595E8ADD31A2949A22ADBAB2A06E9CA826DE + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 196673EDB1A92405D4777E7AE6D0C7DFED8D93935BD284515B1D242D216F5C0F62D6 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D6C2FA683BA9ECADF92F67776AB6980D625BA827EAA4DB62FBBBF05B8F11F55C89FB + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = ED896303F8CF912C9EE8DF43A757FEAF69F49ACC3F1835250F52B75A5321C404BE7E + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F1B9A1D4BC992E4F546BE1D90B278E0A8B1C1CFFBBCA69EBEB76B1B88F703DA12015 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 593F73328CE9288A760F47DA959DFDAFD37685C75C2DB31E2FAF5CA0AC40682B720D + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = B817175DAE917B8F812C92D4F54415110635C519665295CEA769A396900AC6D48D474C + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 77BF222A4F65967C5D3F0F76D3A8B0814E8EEE7BBC89A308E977B6B92A044767A20DB0 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 2641361057B9C51E291E4D5710165826FC319B6AF8A59D9826E8489F2E6BAED3BBD737 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = AE5FBA16D8925A56097653D342E94281C4ACD9DC13757039CDC5719E1B62594185EEF4 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 25DBBB462E70BDB8C37488640A7DA267571EB8ADDDF57851CAB9AE23BEA107BFB6D682 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 1FF2AD20B6E3C61325A181B7D8EF00ACB4EDCBE6B5CAF9EDD11B8F7E58A2E12939D3EC + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 0548EAD0BA5F1B07BB1728AB0E704CE5FF19DE48EB6A691CC8B6F07D1C95F23C20C09C + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = C160BFDF80A17F37B11A4E853F09E8A97CAD40E97A2059A1C08ED4EDC5A3FB6DFADE0D + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 8266D9547A8FF920DDFA0480CBE6FB109AA31107B821F668F5D7F2C0A8D653726FA936 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 356E0D6CE0E78C18BEA00C67A7804C0FDA3079C674AF887E428FB62AFA9F493F4C131E + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = F24AEF136411CB8AFC36A7A0FFBDA1E806C0568061AC58ADA29FC10791DD5BE860B6D2 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 2346DD465655CDD11BBAC84DA5E106CF09BBC6C437AB6EBA83603307D65E8B854BEAD5 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = E042BB74B37919446DD28AD8AE534E2FEA8D614CA05879555AC2AC8908E49EF14A546F + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = AC7181327343DC7D650A128C9C487D53B16A0CE0FB92EE23A7BE1807A17F285BA6C58E + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = EE98FCCB6C1D1AA8B423EFFAE18C5BEBD6A368F7B668EE96D6F890F3B6D63568F3ADE0 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = FFBA46FC4B72161A6BDEFE4362B6D6899336BDD71F9305FFDBE934B743B46B0EA60E2B + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 59BC165B17DACE57FC0D808E76AD79B16FD1E23CE7E12D0B175E79ED0D0F23C3D9A55C + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3491B29513A61025ED17B4A126338B3F277C39512FCB813644D6AE9323D9E422CB5DE0 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A7334068425EAD54654D358D5727D9E6D9284085DCECED016EC68A07649D5D95D3C229 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DB768D643D8C207BE16986A1A50BB6C4C6F83C33FC6299B40A68F32D61F3922F619AEB + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A2B583401DF0D7A0DB8AD109060DD5D62A58F2489F8E38BC549B70DC5A12C67B9FBA1A + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CA32FE3EE6F86F48321F7045120551AFC8815A4E4C2BFD8B53CE60BB6A647D609CE6EF + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 77F3F9CB1C3207A4DF1C921CE6755B4002CBD4600F19BEBA6D8187ABB33686854B5D45 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B9CCE8F0D24F9A47ACF087140D5299EBCD4DF3EB5A1CC4661D21FA773CAA29E502DB58 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B6D17DE84C13E9FD3745E032344C5B90BF716457C93A7B70BD6EBD742F36300DD29625 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 412D4E0E2BF45F8F5847F6DF4144032DBC982A1F1E32ECA15DF9B04F25723C7A48600D + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 745315418686A21A61CE076B530CF8BC8E23CA9565BA2CADC6F596F9FE11ADC3634026 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 7EE2975FF6F42B1F0ABC78EF46DB13DCC142AACFBB2C2306998DE328FC4153477962A6 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = EBBFDBA5461FB02DF7002827683562D122C6BB03ADBD6B9D868BAAF8AB2AB53F11DEBD + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 15426D6F61A88814A1BD1184149E8CA096901E4ED26AEC46E178C0525BE52F99A2DB94 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2B38E7EB3E3D937D26F7A6C3985A8DD2CD941B7E1336A185E968737B372BE5B93D15EE + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4FB5FC71D05685CB3DF6F153FB599B96BF1624960E7FAFC13B371013091B3A245E84D4 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 03969607B238B46EA06446CCB141A8D5B2C696B2CC7D7391A6C05BF6AD6FF0618AEC7C + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = C7FB15C00E59D59178FCDF46896B994C3252F15A3E266812AD2EADD02DE07AAF8ACD669F + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 3A432D124324807E875015578FF1CB4F6B84CD88CC7FB8804D566A342633C11D9C0269D8 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 848AE290562DC7E02FDA2ACA91531BFD0B0AD25676280DB325EB52D8B6A432D1B08C9C04 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 1EF7B5558A13343E43FEC87A5EE749E418B42B02B2ED1A2DC56098EF2FD095BE2FF110F9 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 13A0565EC3B0C998482B4E9B8EC4513A54F46CB5DB811EFCA813EDC766E4457C2722944F + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 7D681430870B76757268C1902D9C9B0141C7E8B38BACC61D9C61B74D32003AE87635FD18 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 0111D66232F0C2ADD6C5A9685B0E132845DC881CB2DB0FDC316EEA687C9B25338240088E + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 0697C73D6243AC703E5CCFDB218D9B057727D91918BDC891D3AE9FCCE37FE599BD4034F1 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 60B9A6956618FB8453C00DE22B65A109F43A342AF29C42EEF0444F5E0AAFE2C2AB73C01D + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 6F58E447FE7839308F5DB79C15DB4452B2469B60D8E30BBCF1ABFDE5608714E23FC15B88 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = CF8813204F117F3CD6821992E6CCF463821130BF905B30509D6A3646C0D1D0012554D1A4 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 8B083E2C05E7A01C73DA5A7B3BA2217C8C0D2AC072950840F427D69A6A730AD3168F89C5 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = E02E2A7AE61BDFA9770A74E9EB01381AA14856A8784ADD26AAA7D578403C7D5962018F3A + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 235ABC9682503F7E9743F94DDBF7301C6A5F4B56C11BF18DFF13DEB99A987808E2E7FEE1 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 0BA6E2C592333E162B5663AA7184457BB38817A8BC6B3C6616C8B68FEF712432AC1C1D11 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 837F5E508EC6160C905BD229BDB2B6C3DC876071A43B0FBC4F9A245CCDCE91581DA87B8D + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3DD3A285B5C00ADA716E0616529A147A4600ED6350E208C441344813DF7F2953150E386C + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 0B4C7751FAF347F7BF65C1BF2506F1A6AD3FD5E4BA7CA6692598D04CCAA5D762DCADA108 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DD174CA4A4E34DF6D28BC55FE4934A719297696556D169904183140B12E7907FC87F3E5D + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FF8EF4B5AC12A1C119EE6EBA7BA7DE144EE32F9E4CD2DBB128BB155BEC02A281E7655F8C + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 18C012BDB1910D4C2060463D5BB1E4060FCAB03FFD9E1A96D52B70C95852F3159D440BCC + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C4A1CC7F28D45A4F2D3C47CF4D3C57B2CA4D90E4090128235BEB1AE59FBBAFCFD69863AC + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9915E87ED662E1E5A9354F51B6B449F629DD51971C2C07ABB375AA8DF38E6FEC823E00EE + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 311DA43531B506DF848AFA6A3EE366518816CD788CFF342F85FCD78F371E9E383E57A9C0 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = DBDD2B38DDBE7B78866C1932B82F82EB849287D9AA7043D34B1B1AD7F9189F1581557044 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B07403D78BE197D0BB723513F9AC56EBD8B262812D497DDA8DFB9C7ADD0A81D2418E2C35 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CEB39EE134825CD1B8E0C6BF2FC5ACB2E4FF6ADCF167AC3A3B06304F7B6749DC35FF7F4C + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8F00F0CFEDB709C6673F9B6827F2D374E44B1406491A7052239D7C0CFFD30BEA3BA295A1 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3EFCE56DB357906005FE07ACA729BF182EE1D53ED087420EC18FE5B4F6D81D9505D425EB + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5BED1BEB41AB5E63FFB59C052D6C3DB37F1013BEFFB8266ED3A84235C9D5848B75C22D27 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 854EB4466F929BB3D08B4E77BE0E94033386FE52DE0952D2DD892584DB8896C084EC71CA + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2C55D8886CB52507412A8A5187272259DF7437E1F9DEB199C103D845B2ABD8EC74384F19 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 97EDD36C3AF5F607682B0CA589E23972B41B37B7C737E629063F9FCAF00B315C6F9A49B0 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 84D0F10D2A89EFDD6BEB965BF1CB9EF861B1171062E5BA91F3FDD74F9F2CFDD5370A6CC1F8 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = BE78DD7DE6C9331220510881947E9BA025F43E9657CB6AE4E162B6ACBFFBEF717637F321EC + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 64DE8CF5F1B38C57445F4239ED933C0D5108F5EE30A4654279C53E80CE5EEF1CB099156C49 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = F4BE23592B91CAC1920A88C752BA26EA6FAF99AB560F0BC434E3D49D23C455D0AF7B22566E + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = DCC7521459EB91926B8FC0EFD10A4DDB7401925CB45641F3E906A92ED16E2A94037A2195BF + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = A808B9AAB794847CE471687723EF9F4CAEDCD51D503EE27B662620088A25EDF610FB8EA7D3 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = A532CE6C5DA0579DF9094FF2FF627DD3422D748A0C81EAFFDC71B16597C854ECB7AC3621E4 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 7CB1FA7307CF5E043C6AEF8C380CEB97510839FC50A75C09ABBC4A7EC9294EE494A1E49041 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = C36788F9C218FEF1C6E5DAB7324088849884C5835F5FF715A372A99F2A9C98245F2067FFD3 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 6C88996E3DA37CFAC080E95AB755E4E340EB8CB839207D3D0A6F7DC37AFF643BB7DFA23B72 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 777CBEAF32087BDEE133FC760C0AD6CD1A830A92AFA7A54003F6E432EF4A7839A9B3E90E91 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 9020CB499103BEBBDA0A4FEFEEB76588991394E56CAEDB141DA3888F5084CD22B53BE45B37 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 151834BCC5B55BB154358E0C3D6C66B487292318620848974C52B65887F838DEBCE9CF5A49 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 539FB25DD8792415B80DD780B36F2528B9676D5E1CA6DA3DFC269D0A6001753FEACA58508C + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 356C62EDF6282F1B838EB4FC506E7C72E9D2B638CA06A0857CD92AAD227CD2A49215DC9C44 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 42F28F2FF5FF8FE010249DC8DC6C44A33C849D23710A23939A518EBC56E3C0BE1F9821D864 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 4336F4C9A2AEF8E0A23A64A87D6A48A78459CD3FBFA93E4CD258F5034C2425A3F7348C968E + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 84CE5CB2DD8D45684A0BF4658CDA62248DF8485923C57E721D09D9D017417D909FA1DD842C + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 42CB49902B9B78C8E5EB20FD265D51A96EEECAF997027D1AEEE47F7E94C1BACDDCD3C0E042 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = CCF8783B5ACCBDFEB19E2D33775A46BF53E62D4B484CD26884247A002155E4564FB1123529 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3543FB1E0E65F0426304F9F4FF0D400A2672584025A8EC09734240BF8C8025ED4D39F44A17 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4CE43AE4B3EA439E1195181D94F78AAEA90E2B1511D77C957FD556ECEFB94366D3B2A2D41F + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 53C1899741EF2B2A6607E4581E231F5B30B0E51225D4628B5DE42073D77B15072960561503 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8794C1A81088C8ADB17B0BF0AF95CCF941471706084849737B80618386A47D54369EDF051B + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8CA2906FD97BDA2D076A55A2B5E5EEE3BDD5B4256A0F0FEEFED830B2113BEC7D5BAF13208D + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CE15E3901FB3CD454DB747F998642688678F74D760A5824A2049A8F236D29DBEEF9030ACAC + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8F6F0E9309469C746EEB8D0CCB87FA53F29446C9FCC7769F01A4152FE2A43F621570CEE406 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DCFDE6A951C0AEC212EEF7683D0699EFB6F160A52A664BD8788F7FF3B7DB5649221443955D + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 910E38872318F398A84E1769FF5036BC359391071B4462DCFC917AB313E007777423A296E6 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A40E601E7697BEE8D0200C365C2F78D25D2DE646A89D6A78D531FE7B5FC283786F1F1F3947 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 686C068F9FCF52F28E7E7A6805B94539F31066D514994CDA9221EF7689D4D742DF135D387D + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9C6CD0F96564D48AB4119EB20FA6B7DBEA9CBC7BEC048731875F8A3F4EF5B048ACBF089925 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 03856237512F662F9B0C6F53C170A4976EA80B6703F1CD14927D14E51AB93DB53A7B036A0C + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 13BBC75D48D38D12769DA25C5A51C82244D4A2E7C187A3475D225374198B6E2974132E9DB858 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 5526DFFDD6073A1DA80568C9BB0445820C262D6EFEA8CE36A96471036D542451B6D65FE305E7 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 6CE8273CF3AA48AC9F38AA05084F4DDF0FE9820797A9285D93289B5D1DD5C0BE6A097CA94682 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = B7BF9BA8EE2A3B007E01D6DE277C735796079DECF55AE0EBD8C30007F702876C2A8D6DD6615A + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 499D7FBCDB2C66247A5DC0C01B9DCDA4FE8D84EBADB39AE64CE9F63844CE9BF524C6FBDD8821 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = C8C2E85D96BC4F2470B563800858D0FDD18CBF391DC01ABE86556D83EC053C70D24BDCD8E81D + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = EDEDA45B72AD8BE89DABDF04AFC42AD3DDBBB29E561EE3A69DA93C53BD161EA61F531E9528EF + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 154FE1E90DE2EA34EEB2C30310B9C65F5EC79D44A50BBDD35193DF94E3BEF5F6BB746095D3D2 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 9832269C2DCA2E941B9D9D033ACD8182DB43DEC284C34A3D79290713398ACBFC0C5AC9FB615C + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = FC31A5AB73A1FC0F64C85EED76FFBB0F49E9C61DD253FF639BAE2417CA9D68CD26F294DFFDA5 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = E24285C42C3FBF4F2B3D80E88E005B874C551232B18D899854CB64652770327BD5339C25B19F + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = DFDEDD1ACCE937ADFCA6C5C3CE7B91EF5DA6AE6937797E6D1B144B232821CE7836C26EAD8DDF + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 1EA21409F510E02D95E31893C009CCFBCC0CBC1356F19985EEEEF9EC3D72CA539EBA67C7DA6F + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 13522F8B5BBA5F1CB441B851BCD9473C92BA8D9BE5242BEFCE2A94EC51048E31706E6AD29483 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = C8BB8C5DEB893FFEC83A8C6E6C9F53F625B7418C36FE8C8E09F6543B0047A24EFACE58088F2C + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = E3122CAE8D644672BE92F55E73AB4902B339FCCD42828976D43332DBE68545C915C3DBE58186 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = D3F9EF07E28A97ECFB2D104C4240F5A8D29E01DAC37EBE13B06387D71A8D2D00375659C5CF56 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6B7F7702DBB4937082FA301F59BFA5A41A70CEE2E5AEE70EB17D30F35EE80EAC89D3F14F973E + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 92292F301F803274182894050B88A5E0025529B1F3C32C5F2583CA2045920673AE2935FBF249 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C4DDF1D7E7E97C34B53FC35B45DE6184E426D9E1917A973C6345A672E7866467A75CB4ABC211 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7E3CEBE48CD5BF84CA9CD319FACDC19E71776D8D78A28316D77B8F9FA666C4F13BFD460F9219 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8E3024C9DDAE251FC47EBED04EED22B086D0BB9EAC6673D7D180275E24FCAFFF36005B3DE31D + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 1133B8C2248BF411F6E8F5321B87868F3D54C810ACFBBD11A07AA3A72DEF014C9A464F603416 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 13AB093B1944F61C8F8EB73433CD2AEE10025D5E6ED5C4D869D08672A607F36D76C35944B38A + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 48DEA3A97063BDABA778D311EED5CCFE946C875F8A991D5ABD2E512E94F10C1577E3FC9CCC83 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FD5221142D5382782F88D1767D72971D601004BA70A3C401AA364A8956B20E7279949DC5FBFB + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = F287050865E8F49AF7ABC227A9643CC9EFCEF36ECED0A162920713A41C5F2CA4D68383DA0D26 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C98C9937BA667C1BCE88222DC115FB50B489EA5E297AEB829E44AC3ED183F8CB22F8C8FD6F0B + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 08E65C9DE8A42DEC873FE31BE62043DBD75D7B88C51F5EA2B05D6F3EE390AD2F43946E917462 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 070C71AAF4AD80DBA3D2C1A8794B155E180043460FD7FCC0A489A1C871E0420799871C1F2DB8 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0E6E27CAC8F9049A9845351D666658D80C547F85AE15587850DB5C4D0C2F55F6EEF1673E4E7D + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 844872FB7C4B1308C440F6A954C3C258C33C25E13A92ABD6810A2F4199CC92773CFCDBBD3B9E + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7B01FAA3C371A20C08DE6025CF1F0B798581B0331776AE222B0B007B3EED575A12EE4249E52F + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = F20546FC5F3862F784536BE0258518A76766C3FEA448AA29DDE544BFDF2E538A6F4B512F15822A + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = CB7B36A210FD15574672FE73AABADB6AF6D548DC18AA3AEB6D81A556DFD37DF9055AA316B63F0C + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = F63A25FBB6D5213CAAA47CCA36F17FB50F7E5CEE330A9FCF7BA1ADB115CDB308405CD74BDAED5F + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 2975C505D463BD6F806D1050F92D4AF64AFD53D397703592102D762B5ADF685ED46DB990878FCD + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 051D24836AF59D34E580964A19629180D2B32C245E0956937E1E737096B7781B020CF890D49495 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = FE8D68C295F294DF93A3D1D35623C87DDCC28893EB5A65F84B9B678E9778474C120A01B129C86C + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = FE69A77FA91484DF8B9E1F960FA78B8F7F0ECF3314C711EDD5DC268967C0106C52B6D97CB7E511 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 4468AF42A92023A9BE0C580798E79DD4B862DD2A11BD01809F8DAE728AD2942C5939A0871DC5D7 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 2D9988FA519D835071084AD89FAE9308BAFFDC652A8052E62F170F9D4890469CC68B3A9D2E53B6 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = D520961508C345354D33695F95582B992BFBA25C61A17847591D771579FB71F7BD0923E06E0A91 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 6EE3242BD9F45F78B496447D41D237E812201A7B2A6BE4074804CC675FA8498C232A31F2271FCC + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 06C54492721688130CEC64FF58132C6314B32B589F2608088987C314730EC6F4EDEF908A0A2F16 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = E8B5CFDB0497DAEDF0C1741E15EDAE65EE7BDE3454C4C5E8B2535F2977032CD21756814B037E05 + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = DA5B038693107370C2BA34809DF9FB69B100293BEA88405C28E9CF59D70EC3E894CC8CBAF53BED + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 7FD13B0C560EF3CB2AFA2A2A6E60186858C4BC4DFF2BDA9DA757654993A664663C6D18D03D857B + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = B5375CB7E4FEA281E579BCED5A98F6D6201A7C99CD71AF11C12E1717E9426740860FBC0E8A022E + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = CE2B614820B032CE9E861546BA029B37E472E06C0C4479D711E6D24F07C4DC678335F07FF33E4D + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 772E6AE7B38478D40827C144288B6C5BA447C94DEFBB9EF14CAFF132ACDEBC7BE2D361F2D8FD6F + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5F33C5A6809000C9B51CA5C8DAB0463BBCBC29C131FB6012D7B3688D351C2B8499D2088409D7C8 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 65B70479103A9EE1D9B80EFB44E52A58C763DB42A3DEBD66F71B42C6E680E6366B1C6ADACD3592 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 82083BEEBC77A45A668B8AC73D2AFBCF321C6074EB38163981F10DAD91DFF886EDF94C23D99C5D + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 93C81A24D4F70C0840684ECB8B0A9409143446EC2BD9D1433149EB480DA32147FA29A21BE4AF90 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6A46719F5CAF7B3E0E5233D9D01E2055AF8F571A7BE043C170E3F4C574169718A7602869DF0FDF + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A692FDA06FB95D57B67108BE24503780CFD6ACACF13B080A3C39D21589F0DBF5BE786C92625FC8 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 38F92310177523CD0FFCBFB2B90F417D0DB78049CB5BDAA85D8B9712847D3622332E00D81B938C + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5323640CF8E5303546B16A98DBC93C24462A4B8C72E9633D759F11CEA6151572DD6967EC46B7C7 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 918C3FDE053F91A53ABA08A7014362E912C8C15A4CA58A7C9810E5CC8548398952F04C7542F21D + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DAD64511A817C8211B316AA0DC6EE1811A1434D07B198B99BABBDD80B916D5425A106D574ECC67 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = C56E29FD706694334B47E7FB1ACB759C73702713FEF1881CFC09FE8526FE9A2A48DD531C3B121B + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2E1A047F0BCF2C80FF5463E7C7C15A3AD16DAF0093087E2F6C322334FAAC5ECA19AFE263D556C4 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 452C24B6D1F23ED0D896A636BEA86D29830D83CD87640B9706C66144CF22279D06062BF9858CB3 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FC93BC579F12095A2AA3459B5EC04A6FA2AE339E3622DFD86DFE5268D01C0FB4FD1554C2595FB0 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6E6C0AFAE083FF981D96681450B30FF8DABDA3723A2E2A09DC8FF50BB544E2900D9FC287B552F4 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 06DDF6C1C256CDFBC86C6D7F8BD104A24AC1DF158C8109BD52250C352EE5C1954DBAF6BF1B6BBB3B + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = BBA317D05DF7E8117DFC415211257F332C58D55177146B1A319FC4BA6D5EDA37E45838C1D48A1A3C + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 59DDECD3B2D65A8C6C26B04274E69D7E91AC457AE37D6D2D02F6E8349F50F71D0D5BB618DEF35CB8 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 9EA4C9F9D2CA10D380AA63C81C0880A32DBCB82C9D8C7542ED377AB6744495D970D1708319AAED78 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 8474901E6B868F86BB1292440CF2B1C4841BBA8E39E322CF62402186D578F7151EF749B1A8C2E0C2 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 895A94210C0FB93F4A5594CE600A423A8157522FBC546D313AE0DFC4EDD60173BE6DC58CE0A9082A + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 7FE34072FC5BFE860D4500D7D9DA82D661FE5DC3F10FCB2AECFB48E49ECBADFEEADD5C5A12FB5A48 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 3A4F3FC0FE31340C9C8AA6BF6D981858B8502783C8564FA0B5A947924FEFC9DF0DB59E8580B4C6C3 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 95DD37BD13835C96256279D46EA42F77CFBECABD8E9CF281427A61C044E1A0591415EAF803A1A0D4 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 60E94CF26D2A79B93222AAB019CA127C25B0EB7D41D4CD27D410D5E8592838BDCAF62F8ACFCD0A91 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = C519DAB0B85EFD4C3862BA02B8A5270F38D5AFD5FE2AC8B4A0348D540EA790B21ADEC56E338BDC83 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 2030CA1D3E318E0C840378B1599DCD9DE80515DB91F1654136CBDC662FF07F524C417D8B370FE234 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 1A67A160DBC9D165E1EBAA20D6FFE93FDF1C08A12BF5F85E0FF8E7D4B6AD9FEDAB4F5D2F7C4D60DC + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 3DE6741F8963F7A8CF050E802ED1A8F72915B39732BD429DF2CE6FBB15FDC2D488E63E0AD5D0D243 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = D457EF025ECA77933D78DCC6423CE07AED617CFA794EFE3BA6B8995540BA5DB51CD59E214F1AC795 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 8A25607D464E1F0B6E14AE1E603BD2AD329775AD053CDFE56E3D61E19BDC857F713BC6CD499FD0F8 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8F1817BABBB093AF3DC215551F22718ABE1E6A73AA6C21323270DC5655C3C8EF00BF146F142D89CF + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 0BB8E1F321B98AD80122286A98789EEDF6054DA1C0F25657CF2D93E97F1F4733CCEA940F9DC7F01C + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = EEFAE789886CC2B7EB9653BB730170757C624D00FA6747754899885C9932C24F65FB3D9D98EF870A + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 22039A8822545603056FFA75BA464F86FAE7C057E359C5A8470DF43C00514E2A4EFAB9EAAE289806 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 634CD8B431FB6F78D2510CAA1B644D126B5461B7E9CA5B3765F3697B91B4E6307A899697EC211981 + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0E0AFDFF5E5B1538CDC2EEDE984FEDB158D0C591D58FFABCFD0B4335821A8120524A17E5EA582ECD + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = ACD0AFB7A405BB77C86F5E4A6DD707621B9EA77290F0F5EE10EE16E70660C9D6BCDB0674FB1A1850 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B0A4C71E1F38C276541CB301507F915279BAB1E7B84E7EEFB0BBAD8BF65373DD3F7485CC27C31681 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 71A7E6A49E9264534F22FEF9D6C67B7A3674FC411A8896815AC36090923B51D0740C6E5BE1740EEA + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D84CEA9E627CDF8F8EAF91DAA38E2D2A2ABE5C43D5EC431D0909257CC0973A55939C16A13F1D23E1 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E0E63D0272E3B9A44BD6FC1DE00F0D7027ACAB71D5DF32A609E9F1C205D5099066DCC3DB7F88953C + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6227D8A2454BD8718AFEECF0B48EEE3C23EA53CE88219098FE923C59E1F67F492AAB511D97AA18FC + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D686D18B6184DAE4175D34FE449433EDAEBE266291510580F69B6F927A7FCA6FC068CA0B90926983 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1929CF898EE6BC20F08E94980515E586A9AFB9884DDF61ACF504F844FD3CC9B72972E57154E8B29C + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = AE75C1FE069ED2323B5DF3243AD2D22274D2694D11106C1E6A483DF74C842B9C2525A6B22EA8211C + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C08C85B780FC1E6DC737341A244BF4E95AC05ED5B86992E1FEDC2A0E1AC59E7D582454073E4D4B49 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 258B2C198B4033A2E453529CD53F980E04564D5A25E02B5B9E41D9E09175D8467825A2998A50B759 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 0AE886F14EFBA5C366C3A081096E40F250D1119C3AD446482002513DEFEE64E35C458C60327E51ADDA + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 989CDF54DF5289C091A603ECB5FF1057B0FB27D0C73A92D24D816DD1ECBD742F7B724C49AFDBA4B0C3 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = B1A8C43D6410679A12805177CC5F891F5ABB7F962AADFD7D2536DFCF65EA17076A9C6910EB862B28A4 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 24946106F880A1073B1D76D577E8155CBF274A8CBDF36C987C0B015694B8DEABB6F2827F3153AB9577 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 423F6B481B21483CB174F904F598E461BABE0A63ABFA6A010CB1BA45912A3F4F06D32C3806E428E4A9 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 12CB51ECDE6D4E0E27166DA1D6305713A0608BD50B0785BAAF8205CBF3D3981C6B862FA1C088346338 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 9131CD54AAC92E560738C394E2BC075DCC56861437864E1C88155F36BA2AC6D317C6E0CFD9CEFD888F + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = D18B8337ABA7F131B27CA8499C8B357D5627E093CA0E07EF43A126FD8F7B273E6A6CE0C400DFC70502 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 5AE5F80AF7088B658C262F6E6617EF383BF13B4FB277DD9BDBDA954492474525F97FC37DF056274D4C + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 3AEDEC3D86DAE0B481FF60C9BAFDBCCC5A27D426B06F424BFB5281C1D38B0A7C013FA6A2394950181C + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = 0EA8C9B0E80BC0E4D928A74DB93417F5B3DE1CFE2E7213E1E4D06CAEC44F24AB4E3534CDA68A7518CE + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 92B18A6F0C68EFD7C09B7A52CF29E128CDCC644455D285783A78700EFB0679ABF8495AE45CCF3E8BF1 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = C737CA6C10F022BF286D847F8D0BCDDFC85A1818B93479C95EFEFA7DF99DE30DEC10AD2988D120E8B9 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 2C8997D705C7798D7534CEF870F89F2DCB7F1A56B7888318A66019EF373ECF12E7C7F7BA19928A8EC9 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = A8DEFB524E5A172216B0DE3114069A929415E1A82C22C0398987EF155C7CDABB3A5AD1752BE8CBB56B + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 36A206B2C8BDB119E39347716B0769A402D540196E2E4FCA5E7DCFD7D94CF5212217A3781E21E2BDF6 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0A4F111AFA2745185155FB592D4A96F73A9300120E2FC8E3E57E606E836309810E236DC730E50BF737 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = F774E93C178A8BF62EDBECFDFE8923BB82D699C5499D427DFA5111CC309519A3F09ED8705B8828B8E0 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0FF0F1826DBBF1DE9510761E8E45DFA54D1CE89ED96263D1D6606F06646D5775C84D90A0AAF048E744 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F4BA9F0158D2C8333D7B8B7CF09BF39856BFF07358610168C510084B65E300EBE16D087D9FCE6B8879 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = BE2C5801A779A3BCC61D684D276425208D89CC50A077E5424B60DF74831FC8A18DEFE94B2879954EF9 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 970F4E3921CCF6C774DF47086AB29AD5939C019C3EA5093002A36DA7EB36916C03B7EE590D8A7384A2 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 39184FD87B277ECB6132FB6CA9345E62A3447BE92E6EBD1D34A8ADDFCBF53287284AFE5E09606C4458 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F979EA9C729184C39333BCBF4FBBE26BB0BC70D67B17590FE843DD91CE3332D6822D5A62349FB520FE + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0EC1E63E5D32A8C9B1BC057C8F4BCF97C037A6C0E7D3DFA3C618F3DC064A8805CB6EB512AAB7533A3C + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E2C17380C5F90E53D7A7BEA2A674481D7051191410F5AFA69BA9908C902DE64964C5E32F50CEC5BB0B + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ADA9738AEB7426C692EAD4EE4ED8795042A53D0FF32F59958E11AAF027ABF721205776F69F0CD5F87E + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FE3FEC0AEB013C810D86EDFB2BDB6BEB5AA88FEEB4009EF1BFC298F2384EF879B92871477ECCC10680 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0BB35ED95DC19A559258311675AB40832E403D4F982C3EA8E24CD9DAAE47653621736FBFCED7BA8CAB + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D74177CFA5E79D0E262879EFB920BAC6E575BEB8C4331E556794BC62E01B4FD94F6D1AB36C5E240497 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DCAF4E946021F59B842DB39AD26FDB226E53B660689861E9845A8493B659BCEDDA8D8E996ABD4D959B + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 17069B1AC4377B2461383489CC719F29BD481A55085D2065A65027FBBC0C0AAE7FC766D3A7F5EE64B2 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F798273A7DFA98F62784B2F345DFCE6BE843D51CE71480125BF5B37BF08958FC085BC05D82F434C889 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = CD8D165C336A8CDA8AE1598538E6DF9D8264873E26EA7657FD6CCF791E6704AB85C955B97BD075E87DB5 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 3EF903350821D879A66C731015201B110F7D4B39124321C450A220C29AFA7703DA87C459C2967FD5AF4E + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = D67FB814FBAAA49D4D6A5ACAB00297C2234C1E8253000D16BC91A00CFA46700BA595B866DB8359A201F9 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 2848D8C973313EE41B1A5C65E5F04578C5D44CD95D7C2F4B07A8FA21FC49B1555CEFE128FABB4F82BF0B + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 8C27B019909DCC4BFECC54C0AF091FEC5FCD02740B078319AD6C3915A7325CED689673E2572322EE86F4 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 9D4FA78533F81348A004269E3AEB87EAFCF7FE1E888F612D969B5E693404091A577E489722C120D6AB21 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 9CA84410F08B5571EBAAE8B16867147686A2FF482480977749179BF2464CEFF423ADA0B93A7C3B23ACF1 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = E1A3E34842DDBC2A3CFDF4B7383DA466B8C0E6E67EC771CA3263483B85BC4B6961FC344A249369B00363 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = B0BF9A231A075412DB69F93311AD678A926B4B24493103A1E78104DA48EA2595D388A1F3F167F5CC33B2 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = F85F1D8375BF2766D006BDC708A3142CBD4FB7D8F38F567F13410444FBC5ACE67D80052F521C607967AF + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 1DA81D2FB6C010EF953BC6EC3143398F5DD5EEB6317CF6D329131BCFA944402B92777CBB6EE450FACD61 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 18EF9648BFE9FBD8B29D5706F3474546D5585F67AE3312C1593CD9770F3E0B6846641B9E817328578D7F + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = A6068F5C60973934DED379D318114294CDCAFCC914CF28DB85F1C5DD8698BF4FC45850D68B8CCD454119 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 9956ACFB61D4B10F54CDD1135C5464B1CF78E4E62977D142EFEC261A732CDAE520AE60E77F33BFAC1288 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 88CBC40D6F3819BFF5F0B2C9DFBAA37FABEC0AB5CD8DC2DAC1311E51AB2A26506263DE4B601AAE079963 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 259BCAEC78253EA3BC22FACBA3F2645B3A97A94F39CCF1A771705C1E8B3D574F43D680022A4239066585 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 813493B084329E06EE69260EC39803A26C19DC89C4EB3FB2D36DF29E0CE8488D5F49AAD7CBD82BF87998 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 26FB2DAD8AE2C7AA5F7A20D42C68283D99A0B2B9C927B2178204B867DBF6A65BD2FC17460966B54FBA6C + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = FCE65B3DA22523519E079741004AAA64A279C0AAC81C6F8B38DF684C56F85450E3BEC9972A8805D948B2 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D56BFC13F17C20B6CFDF219CAFA2B8E49871AC62E5A7241846CA3549B1024977FE52C37202C46BBB401F + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ACF7579E62177D7F7B9C27BC85BA527771521087B9010F8458D14BD69237FFD474A9110C50408224CFEE + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1EF8AE3FDB938837A36004F8A2842EED759B23EDF2E78278BD51E86CA8A350B79E20D56E7A7456309F98 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4A43599A322FCD8991CC37CD80E42F5B7670E37883E7B13B6807B7AB939CE7E2F1A507C89E9DEC1631F6 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C753367A830C4CF28141B8CE0B4811D851BC00ED727A84A01B578AC93921B59B479BA1B08DF92079F6CD + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7C2F561F89AE40F1F1EABC6490E1A0B0EFF837B28D67F94C7B66E726C305DE320A2643AAA87D2B492713 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4F44FCED5B08294D1CC897843DD44E19DAC84CFF08D3A10C058F344F0E438086AB2D923151836B9917FA + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 448354BA65EC78D3AB8144A73E4A716E708D6FBAC28C5383A37136B4C6454EF1A405A49D1AA0880BDC18 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D12A34B232FB3DF5D6DCFD545E7A5DCD3B33BF96FAE09C263405FBFD4E30A219F068B77D1F7F4467A611 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BB798778A2D61940975D4999EAB993FA3C3D957681F4296CFA7A0D204FE58EFF9B7292431293E9C95EEA + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5EFFCE8FF2498B1B5983A667EF5D1B21741E98B5A8F8824029A4FBCE3F2367CCE83A50C22E1A2646B446 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 7F41A4B9E3E5361B4C07740A9975E78A96E25A5049C0EF3A88984A5ECB86DAA126865D9B95CB38227867 + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C13D8198366CCA4E3CCFF632012FC5C5DD163DAA1D734E0DA54E8C79F1BAF9678BCC430F37BB73C6AC1A + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5DC45671FB51A96E396E09CC65894B812B8CBFAA2CD2BF9BADDC48C49647FF0A12332016140EC9A4223A + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 3F4E917FE60C00634ED3E5878B0319F1DCB67EBA962D45A2599A9351AEDE7B1C29C2F230BE0E5FE2442EC9 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 16FBDD61F62734F0D237C432FD653DDB1E6385F81CE1704684D873333C938EA4CA4680462FE0F306F8A760 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = E9D15E11164C8656FBE2A9F3B389A0FCF57C7C761391FD51C5BEC6F103DB576FAD18D914384F260E1FDDBF + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = CFFAF7415285BD3CA494477B0D6DBF4F76AD5AFC5568B258DD5D01E128D218F1B54979DC472BE250FA8502 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = C86399A2F30C10CABD42CD7FACEB859C73C8D66E9131C821CA741A332CB72BF026BFB4872079CA04564536 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = BBC9AF190A4C9DBCA7FCE43998009A7598F27D219C0523265BBBE8984EA1696C1EC0B33AF1DF4E30914949 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 2A920B8390F8EC2FFA374DF621720A542F9E59951A3E7890B563B7A1478EED66FC64A6EB29F7275FCA3D9B + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = AF6E2DFA2BCD2C705F2C182ED4A9433E1AAA30E98AD31A0A01BBC578F959C270D608AC251BC0FEB62883FE + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 7F51A2C105D41B2AB8E75855EB01C27FBECF1BD1EF28FE294E2DCDB68116FFBE361C855EEB5D6AD3039E83 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 5371F86679AF23494441B7B37794A131F0A74927E93590BEF2AFAE981FB439E80A7DF02593B590B258CFBE + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 441AE0867C080EF66DFEFF9D534977F13C727D76018A7682482F1C26CAC4EA544846C7BB50E4CB53AA14BF + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 2198ABA8533DE5A929B8B656154E143218C7B24D631EE8EED2DC9C2BAA9FC146570F39060B1DC2058F736A + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 590C4D8B74AB3CCD6F0004877C3758C6ED2EC54F1F21A0F3F485C3F617C76D05E95AB8AAB67D1BCC8E6477 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = ADF8A54271FEC3C40D980BDEAA9D134075E7646276F12300965C121A4E87DCCF1CB72D263CEE9646AB66B6 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 7C7C2E06952FA9A9DB37712D0FFC9D66E54F640E8884DB52D10DEDDFB3345C16D8471D575464380156E57A + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = C1067C221ACD7FC831A158C3F75E503C55E243CCE0D85DC5D804F013CB137779496C87C060181307A9A472 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = A701BA5B1BBEB19F03B11D75689C146A714276368B40493037693855BC45F8065FE9E45F530009F5F1B837 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 98879CA255A433074924B98A1DE56142CD31393B6CB16C550D3F128BF610AB273F2558737C2F4842C02B07 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C4BD098BAAA9F2323A847B8ADEE759E4976B3449FAAE10E18A0AAA0A5DC8CF1CEAD263465A65685EAE31C4 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E1F11DE0552C9BCB55F12605FFD0584B3A33F72A4838FA2D51DF9F94FEA780C873F3EB486736BDCD07C813 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = FA35CAFED8CCD075D3A077BB0FC9A6D7220E7BBE9810E473BD145BB553A030FF9FAFFC0F6FE1D79D5772AC + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CD12AE6C8C3BE721D9FD2C178DFF2CE4479E3BB01D6464A56427D24584471F86EE4B46B1D5BEFD3E0FCB45 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6C40F2C29848F66761286C7EFE2F45AD2C85BD2242388A8DBDF01B9F6DBB65418BB896D07E89284522FA3C + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D1E66CF8933DF266295A09105E8A4B3EE22C282688C47597F0BA9DAAEED5640EE8F435ED84A7AB345FB36A + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1A9C8C3E262D7C5DF967606089BEB665A00618CA3CD0E9DD3A49770A44E121ACC9B2A86C92888D752E139F + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 624AAB7E63EF74152607871AC6EBF97C5CB9E614A865B9A96DEC795DD3FEA662C98D86D38DD0441EC5DFE6 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AB142DCCE952CD685BDD41DEDB5D36A17D7904F9C936CC7F6A5A2D8C98B335182ECEA00B45BBC24ED32947 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1E36EB4B3CE575863086E3502E05028D630DA46A8AC6980EB534E51EC53B4CA501EC06ACFD8418F5DEDD8A + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DB0D9EE72709798D512B623B8F7EA466D1EF647C1928B216198502F423FA9C7F2CA3C952B9156141C3C57B + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 967302BE454D6D121081534C0DF6499212D2C176E8E0CE691C1F186E962F990E6CB5B40C546BE1B9A25648 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 01BCC2FCA36E2E07D45CED3CADC4CAE65DEC0C143A73EF5E0FCFE2C67ED2CCDD18A8EF27923AA35EAC3B57 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5F85BCC6DC75CB1BB5E09B816525DBFFC637FB6B037EABA7EBA1434E2A189B61945301BF6B0DD537333F7B + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D5A89187E3C278654405F8EA1D4E713C88D829785C70F4B04D398DA74DC6F21FEEFFA3D218FC28B657A454 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 3B7C471ED1113868D40798A42C0CDEF5BA40466C2C6081F17E3775C119966F1A64AA197F427EB008E32B17E7 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 31A77758769E1ABD6F21C99F7DC3EEBBB550E1BF7F022FB8A167608722EB35A93F8D442A5E0CEE562DA61628 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = C6D5A8C140CA18CABADC7467788D3EAEA585A3AB35A986F6540FE4FEABD7180115AA384E8426B6CDD245C29C + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = DBE1F1A6689524A606F8C41B30D274B6CDB8C66E6C6BFAB95A75FAB7AAB7DC31DC6C5EEB267D33231B97D1D3 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = B42DC87D3CE70FC91D5BB8D183FE7A24FEFFE0DBACEBECEAB3AE0F0B6A069CA21B0142C9459CD458E4AEC8AE + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = BCEAE6B2910ABF03A30175255C7111C357CD6AD09F2BD14792C3DFB5AACB89BDA0E86EAD062ADD7968AD004A + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = C6296E71FF2DD9902EB4F505C08CDE8BD9ED766C618605C91C88B10245BEA5ECA16C5E52B4148F08F20173F4 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = CA3CD8FF10FAF1249E5DBDE5DCA7C5BEE02ED904CDE42B7334C819E353A937C58667C5A1C7A7C6977795A2B9 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 9705D62216A72ABC58475D18F5BE79692C98088FC79421967D15CAD06FE8720DFB60341E81550D319DDF6F53 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 90A042EC42226184E748ADDCD93778B3CB99DE87436616B2912A2D2947E964FB91E12C11BC987657F41DB9F5 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = B80412059211015505D72A18F7016BF6167B6B26C6EB528900145844F874247FD7C1D4E5475978BD8FC72F9E + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 5506984785F1A29BA184E60E9B6C36785F631C7D3E3A1BC21459876AFF2F595F363A128B607A9992B7F501A6 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = CD40D58ECE1AD2130ED09302D335577DA23E24A0ECFF4636B8C30573F19DE53C48DBD7FABA98BCAFF5EF6F29 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 49F260821DE6CA6789F59DBBD3861BAAB4BA10554F81B9954C96B7EF1AD7D71BE25A131D91649383382EA00C + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = A6A3D27345F96BC412966EFF699029B1B61C83F0FD6BD9ED73155D9289B4C3E4FC5E6FBF1FF2321E85E1438F + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = 9FC8546C52B8BAA2E3CB11B8C3A13AAC9FCCB9C31D31576D7260EA8C215002DD00B0DDC20395F7E09448B587 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = A9F36A892FAF4F0105D82AB9EC42EFE976005412205F8B36E60939AE1580AEAC3CE29CFF19D11055354CE6B4 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = AECAF1C811FE0B813C26A689FDB731009E118312FC759DA7A1EE3B1FA9FADE9809C973E8B3669EE2ED66B1DA + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 731B5CEAAEBB7D181BD03A1F7F151C7C2EDE82B350CD17E18D5EFE68A2D159C1111307A05696E32F9916C3A4 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5EEA5E356FA4A7F893BDA4D2811505F89EE3D0FEFFA6BF031D666F533ABE640E4BBF16D202C17A2EEE4A32C3 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F0A6D5950ADD60A937646BE3E4265C4899D8841787AA33B5F18A7AF8951555C3D72A83E67B2A4BE1FC9C6E54 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F77E732E38417185D786943E6DBCB9782285996B333491F068C8363411CA9CD1B4F029466474A536DD9BF8C6 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 834B7AC0EA5A55BF41E56020B15059B086D63EA89131BC19C2B7A2FDAAF383A702D616008116A2CA4EC7B8B3 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9FB530D0658F0B52C01D0BFD7532493C74A0585408864D3F8A346EB262E5C0BD4975FF0BC54F63A66471DC0B + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E1682CB058E5A6D4EAC77EB98C8BD1833F6BBF7DCFA500390E873880AEE99A5B5582291EE7FC7B3289D10F56 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7A41FE17C46147071BD8D76EFE6DC816E5685FC68908CE4F6B15CAED64C153DB8B8880A49868A603BB4397FC + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = EF00DD1D5E35B05994FAAFA5552568E16B6C41087AEBACACCBEDA461C2C7B619CDDE8DDCA24BD95C7565BEED + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4B152EA862A71E3622777D256D65228875820D12DD821BF7AAC73BBDB9A36C8BDB52EDF5F975F68C987F3969 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 62884357B4278B51070EAB79C2F578B3A8DEAE498B6185D9F246A17A148F0739107046BF84D019A505283071 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4319E93C1360B66B6F9FECEACC03F3A36B6F1D2E680AB1687680C39E1B4109F0B51DFDF80407467BF764FAB8 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1CD8DE2E2C17C767F2892CB0BFC4C521862F82119D51019E2518F3495B1AA4F0DE5778AB757DD55996F4272F + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CDAC4F8B28F40C3C3C260332306A1E5BD0B91ADFD228029EE388A8F77DE42C25E94ADADCFD5C66294C285D71 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 95B812FD1447DE7CD07B016C2FD238C5F744DAFC6DE89B535880FE1D82FBFAA801578B98EC2E84108688ACFD + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = ABE67F59D1343F4DF90089B9046E5CCB37B997A4574987E0DC9EB9588CC297DE47E94187E690F137B681B6D4AB + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 02BCE0A645ECFC99C8BDB87B8DB2818905E80C2BA2319E4736034EE86C48A1D1DF071253DE1DC2BB3A484D20A3 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 917E8E497499965702E8CD2D8BBC2BDABB7677FAA88987E85049BBF9E77C49A6DE5959A0998D10AD9D8EA2A3FA + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = C0F37433B96C8636B65DBD025816B76F50904EB09505CC0F57EE72810DA93B6ADF1DD6AD71E185A9CE83E9B5B4 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 3C8E6B499B81DDF01552B570A244ACC14D635E14B5B4FD1B55D1ACB9B64C8BD5C7AA47C9B7DA5F07A8F6E2FB17 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 6E52EB94B2BBE0C9291AC579599B641E744894A6924EA2E3CAFDB46A3C4D1E915F50F6C0D862A334103E7D1221 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 2B7F5EAE4C36B192A08050190B987765A2F0FB1FAC037E3ECDD3AB72AEC10C83062EBA1D85540ACD64E7B4ED6F + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 5FB3AC7BD67A227FB34E1F283AB727882CAD766E32B43A1FBDF9B123322DE6240C3294308635D95891788DC578 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 5D086B6BFDD7420353C1C29A0D6D142A0A39985F73E0AF43FA1D5D435967DFEC026697E9C4B309B8A2D8036E68 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 68394EAF77477CC2D91578AA5B59DC5E1D0BB492E2D5731EE803432E785D587B42D0720C2F9C83D1B0758A7ED2 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 5104A6B4888377E7CB1E7206F742FF8815C942CDAF65B4352CF9EBEE3D3D6719B2A7507ACED32B2D4107C40537 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 4E7D9E49284B70EDA9AE5F80B9D2B07716AB619F389399A668F8ABE720AF07D71DD9DE88744818B663104FA58A + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = BB7F56CD3067FC4B537F5631D61E082ADC7210BCB1EB349634D4464EEDFD3FAA761890A5657DC34CDED854D4B7 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 36E7DAE3B7E31D8A3D1931089B455FD63FDBD5E74EE128FF0E51ED34863EE4CE0D1BB538E4524C2ACA7FBD4B5E + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 1EB7B51E4EA85965D085A4B7301C2DACE7E2A4B4DCA14199FC530BF4AAF57398400FC5EAF740175E576063007D + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = C2C1C152091C6352929B31831B19F3AE25939DBE320589876C1E240280C346FA347DA71A47A60EBA8524BED936 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 1D4F57008C85D875C3F7C7BA832957652932313FD8FD2AB6AC921842ED1BF85CB0D2D33A0DAE8674F4D042DDD5 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 24D17A4515CE447BDFCE95B9AB297FC0C4BEEA75FE2BD7E4F9337D2824E68E93241B3C8B44C060D98EA257156B + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1B438B1515F252D09B9260367DEDBE4302FCA4B95D0E905DEF4DE9E0F447C4E60456DD509D78C71C0850A03207 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 99393216CB8006F762ABEE93A1AEDF31BDAB5755F616410290F2D18E2043C50DE348218562349FB0162CCC17C2 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01BAB3A0B9BCC0D4391BABD662CB00B3B8CF9DB4E0F208389D1C5B389355C1C07039FCF29F2C7DC03D43CDCC8F + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 32079A24DA821DEC5668D33AE152CE4C0BE7E7100D61011477BB0323DFC279A184A32B86F84774A066515FE0E4 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F8B8753D7418962AA44C3D746D4B56C68F19D3DA9AC8F581282B7323F5E1E9BB096B4469F3248938D3DA87FF06 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C36CBACA72F486B579A7894927C6AC269B018BA127FB3329E7E2D9373015E50680016C11EC45F3D4A6EC191D45 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EDB280D3E3A5AB0F4A52DF0FDB3DAC25C12495410C0252C7AC6F43C906ECB6BAC6CFC1A11AB85C32412CC20310 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = EE29DEB13056AFD449AD1E470ECCD614968D3C7920468EE5367739DB3015616DD12227F7B076F5737E6FDBEE46 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 636F1D69CBF6AD880D826873526F7E51362821AEE1B0C1637E424A63E53606E3B80E48B1E8AF69FE4DEE0BE3EA + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D29182D978ECAFFB10EB2B1B803E96A8553D395D6B8D23A8623BAB71074A803607888E263286D31B047BB6EEF3 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FDCC21ECE528917CA48EF01249154327582D8784AE94A65604757BFA1A6D3C85EF96B04AA97613CDC27285DFA5 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 328D76A1A94355BF212867C4A551E7B56E945545DB5B9F11FA97482A7A8C66AE3F34E5DA115CE14287327DDB17 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 878A91514C2209CF3594D617B928790DAE92C7E88E96A5C537E6B97790516821FF096910D52635051EEBDD1CF0 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E1646201F9EBCCD5EB89409350302C84D89378EBE913525E3260668D8F05B4FEFA6E21BD4AC9ECB7074F1E32C6 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8E4A2B76BC6864D00746249C2513DE78524612AE9BA618EEBB06BB836AC2DBE453958C4368FDF16577DEBE16A7 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 8512E744DA43C460401B6AD55B2CFC10B623A9F18C091E1545F6DC4800B4AD02569DE85BBFA99748886733280A03 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 709FF930654586ABECA72CA683C4D8B39799A1892090B5B36897B4123631A42C21B40DD1A6FD84F514103AF1CC11 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 8B145690450B9C577D4930E678C3E1D95B621A88F4A9C5417D83057499CA74F2EA1E6AB11183FCD52A8496C8E3FD + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = FC2A67563982AAA28C4281DF436F833A6D09B60996942CADFBF028E839DC0EABE7FE70718DA1F2A5A414F0B11A2F + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 00FA428C0645528E8D6695343E0F2A05EBDF7B756EAD334D4804D1E5C7DD40E39656B05B16D400358C508F97CD98 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 45B926732DC82A8DFF53936608AF53CCCD5D783A4D70303F30F7E8B2CFCB6F5EA34B8F8B739EBC3E35F72425CF84 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = C212720A1C06FB0D5815F1CACEBC664824CEE0EBF9E68529FFB9DD9EADBFDCF53FF995E1613FF265D25470783BD8 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 20BCE1D78DD9D8B5DFD0C222BEE2BEA64A1FDDA6FAD416DA49C9FCC7BE7DBF6BC416B500888A4B86A07E12C5655A + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 37EDA73BBD6D857BD0BF08ABDF11B854FFE70F4A46E08550FEE7F47689DC84FEB3FA4964E98787106E57D77C08DF + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 04115FAE61C8197D9C2A40D42A45FA32A7BF59EF2B264209D03228A016E87F19DC463CD557483E5BC5FE320CBBD4 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 27E4144F3E9D79E2D17CF9012FAE25AE079798F5313C03742A84C9FE363800CB834934910A97F2071D8BF3E07557 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 37D28F328EDAC22D99B5625FC6C36CB16A941B318B9C33FF29C62722B5A787BC754E3DF55C782EE13CF4044BB3C1 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = E5BA2067755C5922B1A08D141F0BC3EA05B36E4DA1543690324E3E4B3406D09C9CA6334E865F884B28E046FEEE00 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 5FE1A97EFB52C999F1F477D4AAC4FFC7CE2927EF0C1EC2AA0C827C3BCB7AF5712BEF9FDF936B9EE148D722148B0C + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 70CBBA0CC718C9AA9D2D1917974388A9E29E35DA866C47036D99AAF3FA138F5A77BE683AE7EEB2179F3247D74C0D + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = F5DE344F005CDA5280942A502C9F3CBA202056700D1C87C4249CAA0CCC2681500431FD366845F203BA554909FE46 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = E03B7019A79FCFE9C1094DEE927294D5C3E298D395EC3F5CD5B73DA0911167D69C6E9F7E779DBD2A93A28E03D159 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9AE6D76F64C22DDA56F576CE6722998F76974CC1E0FF507746763DF03340166FEA1C093A5C0B91F0C6E783E65531 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B5ECBD6C2D3490012FB27F59A5643C10BBC6F0B30E4D27280A6DAEFB04D38FFBBAC29856B3C9F67C257653244BAF + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51749744DE84F6DA3B4F7F272D95B31B36C2AC97523D08A1C6BB0BBDBB00E41B521878BFE90FD837A08EB262BFC9 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C9BD345CBE254E85DC5E07FAC4853D3974BEB59BDB27177B4C80C9DAEABDBED43105522B5C1A7067A4EFB57EEC68 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 74D99F75C242DAB5A4ACAB2FA85A247667FA8679C96386D9110E1FAD2022D61647719AD59B03BB1DE9BCE4C0DE9C + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E66C1EDF99DD781B3D758F0804E5CFD956E04E128B943653106D3946BBF60DF96314BC76D2DC6C55B5EB02177773 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 746E27FF25D342BA34D128A23EBC7D4383D4F241441CD2905C63DADACFB29EB700CAFA9CB3E8F090C7631E58A764 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A50A548E25E69E957FFFD41D354B6C7F9F4C7E5CE5BA3F821540F50FFC0236254CA7EDDF8A4D8CFE8691E415750B + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4CF575B21955F7ECDD3B7E1DCB8DA3EBA5EDF22208BE829B2050FCD57D8F5E19BD030DDAF043FAF3FF986B341C42 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AD38FAFDA5EFC0EE25B39E5FE684AE528BAE02CF4D8743A09858BBE7CF27D26D5F7A75561BDF53A7A29FA004C845 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 863D9268E12EAA71DBC2E6AD1374D87A489176CE034429C99A58F47F1E84EA75FB586EFC612EFD147EFD767F6BD8 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4F5E3A759DD4F8F8AC1A84BC8402A8124E5096F79DD7D2820BF7F1F5A65175E2AA06CBCD9A5CDEE4A283025B6641 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B05566C3EB26B52B86AB7D150F66CD9E81477CB9E1B2AB3455DA94AEB37A422B957FF06B6DEF954D68F8109F5CD2 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 34BC47B2309F615FD351F32AA86371930D5D6DC12599E441442279E024CB4EACACFAB9C6DE9C9A2966BE9E76F048 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 42851ACE43D49B23EA11A945F6FB32C21AA8072AE96EA9C54B7D12CA35B3C5C2FAA5BEBECB0976442106F162595F + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 81FC35D9FF60C3A9AF2AFC1A901CF27FBAAA2FA6C13FD6F64C83D357AA396C9D5AEF95ED089E1A042938DA6B0810 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 153BED1C06B6349D1277FFE7BD64D9C0D4E79AA07382E47D3007B1B4334489A5772692E4934DA9228BABE067C27227 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = EA59E5CCA20CD09949EA3F9A90907E2245B8CFB453FF85571A40C901A97CB25A51A413A2081665D63DFC0970021DA6 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = A37E9E4CF3832B62738A26815179B70A3CC35897D3342E5EF46E598DB7128985BA262DFEB62DF4A5E2C44F451BC63A + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 4BC7F5F4259B88A9B9A79F349E3388C8209DFA7522B6BD8B778CBED95C75921821437C5ECA7A66FCF03AD31784057E + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = A828BF292AC722F5880E6BE98EA636333B6754943D2BEA2DF940CF925DFE98EC8206B261424D09B9E06ECCD869F739 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 911A6EFEF96BC8826B4E56D487BD16FF9484AC417ACBA2B36A1717367CA6EAC9314E8FA0017D0A60E762ECF6926E18 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = ADD0AF191BED7C35FD85755B58F871676C9B6818B7FB5D3366EBBE70EBC332871FAEB3C6311D03D97DA8800AC3E31C + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = BE2F283566022D6FA9130063748189B46A39B7E8A9854017C8AEFB87BFDDF5082BD266348B56B29854417D2DDBE824 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 9E2981695CAFAEF5B4614DDE90BB0B4D23929E4F3D61F93F7BEC52CED40B230E736CCECDA6B2C7F9177182B231D64B + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 20BEF2A9F3E89EBBF4E86B964DB946EAA50E0F3DF58722EE8561C33BA074FB3A55619D089C733A84A332DEF5FC88B1 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = EA049D88084A63EBEDBCFD2FF5614EBCA259A7A4871CBDA0E2BAE6FC5FF791709221A0725C33E2597AB27C258FACB8 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 7F394A475F79D92CE6D843500B7E58D03FD61650A54B05C7613DD01ED5DF615D149E00F187F3121C55600CC7B6AD76 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 976CE421D4A63CF19633DDB11429ADF983C5FD19F26ECAA767C8018027887C651958C0412C07D24A30BD266F706403 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 53CBB7A3D31710294C2344612EFCA80DF94B4F684AE75627439E16CA8FB7BB2EE688061EF2986521922B5E208DA10B + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 4C5D090D6A411761447F66F2C76F44682C3A943DCD87E538D62971BE9DA9CD2C642021227A808D7ECF31B1573A5655 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 4B11516E933EE1676E692909B9FBE4B59BA60C85E859895777F3DC2DC44754D5EF1ADEA430A6CF661126AE2E87992E + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = E09ECC66AE09CFD60C6525796FAB160C4E52924E4C893953F1B25EF05146F21B892FEC7FE07713EC9E9C0E9D7037F2 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 50DC667B5532ACDF4A0503BCD626792C719A09E95641F9AFAAEDC2C69988EF42755E6BA6A6155AEE4B2E5D4BDDBF2C + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 597C64A50A84DF2224CB14DED431EE86D04E7CED37A482C9E0D1DCECAD0D956106ADB74AC0BA0EF27E121598321DFF + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 237FB3640786CC3980DAB177CF432A0965402D2A702006166C957B09619F3B122E2718441EE47EE5E702BDC0486EE6 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9FC8E2DFBFEAF392ADC1721637DB9D4B8AC250892AEEF18195B6F050A5462FCC955480DA75795CF36E54DDBB437EB8 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 68C479F2D3B6E4B55E5546E1D0384CC56F4BB5E6DAAB675F82EA6799101C7B50EFCF889456A9FF8F223397D9F5AA87 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FF85762EE4015292F2AFBC180653CA328F7B48E6642C0154CB9C91F6FF8B42B306CF42E30FD3AFE819DA916ACB5BC2 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 495F73ECABB6379D0DF3C2EA1872F996B6BF48856451105ABB7D8F15A2F46A90AE3ACC0504483139FD871AFE3AF2FF + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CD82714C41267A8EC1F38E32163743704C170CFC70EBF28F6AB1B6085C4F874A1E9C5B4AAC0AE52903324188DC1E91 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5BD9F9E46F31B5710E9CAD9B4FCB700A79CA6CC9E3485606B424173783236B0774524BAD627510103BD121372FF06E + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = EA4F800E850471D8FEFE91E80D8F8F12DEB7EC8B6ED4F7934495DA7D70ECB06E744835CB42FF64B7C27D3748A2C6ED + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9F342EC8A473151F9AAE44C2E9C837A036817091CF9CBF0261DE54328098FD26CCC85138D9CA1F2CCF2EB07FC6E6B7 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E87115C629EB550C5386B0B7C9C7A0D23A9D2D5E290392116F1B46A547A01C84AFC8ECA646B9C0B287AA97C4C671B8 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3D20B05FE53BA142E5D4B309151FC0E7E356A4C821FF0AAD9E69C3F6BC7C07BCBE817F0059B572C848DC05DF67F77D + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6996F78CE412A88B4ECC56BAF9679FD4F06FB4866BEEFB04353BC399866B61A10520B706BB036D5921E2790B130E5D + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2679D780DB4A7FA562B8D1CA824B66AD3ED8902B2C1EC7997A5E433C34B99E3B088FE2FE3FCD54FA0BAF649208ED2C + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 1B76DA52919A34BAD0F2C869393C29D9000F47C27C306DB72893A05F11BC66D1FA50588BCE980A1968C45F7625352D + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 2BBC24BFDC19E600FAEEF125D57E22FC2F7A534E184B1F33E277706539FC57B69C2A1A2FB07CF3BF6BAF5A3F33A427C8 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 9A1755FBD3E79F16D2F3D3F4019928C18BA5DECEE2603020B153846056755C92FF7EA76BD8E32989FFDAE98161F10979 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 4D98C92E79CD85FC4F32DB7F6B26B80410BE15D2D2563A27D422E7C37D4AC1E0F296C3651DF8D1745413C2921B960AE9 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = EE1581A711FDB731A2F9A2132D4763744AC17FE8572E3CC6F11598937033F69D66F5D31736C92AEEF0BAA39AED9F52C2 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = B5C3192435083231BC336DBE111D09F009E9A0C8431EF1405405B2CE1EEB4489291945D0475C208797DA8B2B3C7BC1CF + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 9A3094C681036EBC3C783D5100C63343B46B9BD778771215E5F285E56E6A49DD64B2EA5D33B80FB2EE9D4BAEE5869DBA + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 8CF8D88C6E60D0FBAB6F7DFB99F15545E63C2B0B7859D55781FB332939BD750D655919859EC9957F5C0B65A5BA982855 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 55624E07DC74DA221A1FF594C692397D72F7B12A0A8A81CD6B9FD6F21CF968797CCB3DED74EED7BB2D5EA3E5D15AAA7D + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = AC0600B25FB1B313FF4B8280D928ABDF66E1DE13C65DAD373DD8667B35A2BAB7D8EE01A1FE8637D3D09E07F9152AA2EF + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = A1F1D58DED0B274EAC0C7A0D6C79B7DD89B4EECBBD844F08077A0E48B957867DDA0093D805B7AAA8C807AAD669F8F32C + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = FC1571FBD603A31CFD8B5EDA26A1911BC3E9D2A4B73D4823D058DE88F2C5CE6A019212387CA5221CF5244DA2423410FB + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = CF1B310CE6A6E4A300D4EBF8A229C07EF69F8473F6D56C52244C1EC3712EFBC140B1976FFB933BDEB5958B6E7452DABC + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = D2146062CB4D45FFD347E0FB51860899EDBC5B1E564F8146696D8A638AFEC6BCFF120083087693BCDD219264C6C03444 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 8D4BC02EF441E357F3A582076E80EC18AD03A34EB61D63713C0A3F62839F7FA2DC3D69C7341921FC964D5B1FF94CA2C6 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = DAA8812F4AD115FD1EE02C04BC2A97D26E028D81F7E35EBFFEDFA1C5A19D87F9D1910FE8CA28809AC9ECC9947B88C1E3 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 27D3630BF7CF649326E71F50CFD7B6171D60BA82C942495E21FB3CE564E0E8C5CCEBF6024E5771C9A4E8FFFE59064415 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 104F7091EBF05D514F39787A0E976F1594DC9BA95A5B7079428750F57EC29D513721C0E286C8CDF9D3D0FB15FDC1F332 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9899689EAA14A5B0D7C8191D973D27E65530B3054FAF3EFBAE3EB06A0D47747415443496A82E8EA0A4C4091F4588157B + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = BDE0C78A7E860C1CB6AE4811E8C9167004A728A8430CE3B0C5FB00C3F367F73DC4A5CD4F90C59161B157EA5645D48A4B + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F2131F3CEFFE009B86FABB498121E59A0609E9AC4045905F9FDDB0C614689CE458FF1CCA15AFC60A8FE266AC47A400B4 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8E55AD2E4BF0083905D339F79649461E008CCECE14034005E305F6F37FC7FB3069AA5B7894B6F40014195CDE57D740A0 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E3643536DA55BBB014C57F8D3852702D1E157EE36C5E91011E7520354C3855734D5D58237E127C912210526E903A2DD5 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A7931EDA441E5C8432C96AD907824763D48AAA6784271D1313449DD6DED4512C9042EB8BA2C699DEED680F6BA65473C6 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7D6DE76A4C54792997F8BF2A8BC12E12A22129298D5E9248F9DE572C0711CAA6940514B2E92B3E7028D787DE29C85703 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E2216387A9DC367522E7D35B7527AF3A68C43AD69328F6361B6C2CECC2154ACDA77431CE9CDCD026D043F07D5142B06E + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C6EAF51ED6E9C09F7698A4F8B07A9871C173BB3B6230639E2975EC1BC2D0A54053E6ECF9493910AF37EA985DFB586FB4 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2C1CC49E0F99F1E4B49AD4969AD04F19D03060DD0FC81611A78B45B40841F59CCD09AB9AED4B8DFF5BE02F31CE811365 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 0E38192F718CCACBC1B1A840B49BB0837211A33A9507459CFDF554C720EAE62A05DFCCE364B5343CD6E7FF42AA4C2F29 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7BBF1E556DEA24063D28D290C8B418F1EBDE24397E2264B6B3DBCA876FF8A3DF394818903C5E93A53DA18F4B829C276E + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CDD99ACE4050E2C3EE61999C7590C6F7FB862D7821A10F74A9B1D31424C4A8C8186822BE9FE954607AFF6172170F6B60 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 33CF5E21B86123513D4A442A3713685042CA509A934371AFE4964C5B6A9755EA65B8532E813FEB0DCF9FB2C8DD468953 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CC730C21BF523DC7CA252E8E581730CC92311F538F9C6795073D69A60B79055C3DC1A916701A612BAC48790F0AC98223 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 91088A8AC46766AA94B94DA53C1BEA09E414BA2B8D8E38414119F1C1E2B07C75CCFE0E9C2C4DB9FDFDE0B189648D5DA4 + diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..7e0c676 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m3_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_m3_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusm3v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/LWC_AEAD_KAT_128_128.txt b/romulus/Implementations/crypto_aead/romulusn1v1/LWC_AEAD_KAT_128_128.txt new file mode 100644 index 0000000..4b26771 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/LWC_AEAD_KAT_128_128.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = +CT = 5D8DB25AACB3DAB45FBC2F8D77849F90 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00 +CT = 2590094BA7DD1CDFF6BDED1878B0BD55 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001 +CT = 4937850252E6D938F72E2B1FF82010F0 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102 +CT = E7DCCDB0D67928143E899ABE363CFEE8 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203 +CT = 2D2BB0BDCDAC9654A3963D19E009747A + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304 +CT = 2C0C713C7E14D20E10CC1B4F53DAB25D + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405 +CT = D8187667C1012A51481B6F59AD035B03 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506 +CT = 186BE82956155733C134EE9F3C610B40 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304050607 +CT = FB03DA497168FDC76C46EA493128FB21 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708 +CT = 816165DEEAB6C80DE8864774A49072E2 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506070809 +CT = 3E22DE085B28D78718CE4C5E7C1204E8 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A +CT = CB0B3FEFEC9BE98878D986A303DFBE7A + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B +CT = AC0CA2C2CACD2732C43C43C5CB5F86EA + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C +CT = E7C5F6D0C7A8B9F37CA6C30D363631B3 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D +CT = C3A4A90F657EBEBD39D453FA70F33F95 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E +CT = BBD0C3A7C4A83BCCC513DAAF3BB64A14 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 475DFEF7D5E4DF7601A5F5328F5B3202 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 76BB89DEB0612755D51D434D81640CB6 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E3A6CA1B8E0085A23D2AB246582AEF69 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 65B90C937A2CACB77C49D22E77714C40 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B2BFD659B0D754B9669683DF9B204771 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B72E1A9BE61EC88663775B6F3A52C687 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4B6C6DA866173D7A31BE33DE30649B6F + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4D272CEF7E2436CBAD05EB840ADDF50C + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C5B2B5129BC0FB1F631DFE5BAD13617D + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F9B1337FC80AF556C629CD1A3CE60289 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 51AECBF4B5FD04C28E81BAE33C624782 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6B365E1BEB957E29706E1A6B4D369B08 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3E94DDAD9B54A80A63E732D455034F44 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B95EB2054634122D7E21EC8B96886292 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B21D8F9AFB9AECEFE2DD1A1D469B30A5 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 912B3867BD1F7FD7D6F748A57132D7E2 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3FFF0D2D366D022A7996B16FA0E10E3E + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = +CT = 896531796709540239DD66621B504BD255 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00 +CT = CB4D354361E0B2E89B7BD3375F5547437E + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001 +CT = E5848409AE5E6B818278BD2040538F5BB2 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102 +CT = 806BF4587AAB07F61BDE79BF9145ED1C68 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203 +CT = 9F4ABF3154B82222B2BE79CAE5B1AB3D51 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304 +CT = 1DD99011A4D7C2F1F124875416F2D28F0C + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405 +CT = F593BEE046974B2CC11D02EF653D0DB1CA + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506 +CT = 3EDA90F7D2759E6F4214C2F230FEB252D6 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304050607 +CT = 15E8BED67663B68E0F339AA42CC4F2E0FA + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708 +CT = 39C835814421D0B83C2CDEAE889CF24A43 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506070809 +CT = 49146B139EEBF3CC8EA7B58A4B1A294D16 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A +CT = 8424BD1C5F613284F41020CE5CA3B35727 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B +CT = BE8797C1AFC2D86DFF138744955561CA37 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C +CT = F27C17F0824684707B7A650C5EA969A869 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 2698B02CD3E31D9CB183AD0A79D0E48730 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = AC4AD9AF378D1CC394D3D4B6BF58345448 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = B52C077CDF95B0B1042DA4416B4993EF49 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A39AFEEFD207F0A9244E605717E89D3F3B + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A34CC912FA5979ECFDB301405B4FF2ED0E + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A88DF0A0DD2B3EDD93433FB55E91624EB7 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECFC8E80537C0CF49F81078D6BD17A6C54 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 50C1B2D557F0BF8A412409DC5866406330 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A84611C8A12D14415E5137041AE4093E25 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64CB4C15C7F683C9315FF1547F9B88592E + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9FBDF7230BB71D2FEABB4B8D30893318A0 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7C77DE69DB5E70EF82478A5359C427AC69 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE611D3BD628C9725BC52E9DA75E13EA2A + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 583574D0ADC671B4F415B652E1429AE002 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8EDD383FB7959C9521E725AAD9018B2D94 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CB8E638615CC4DDBDDCEFFDFFD94410EC9 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A41AAEC53B9D24C2935D81F90C22BCE93 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 917DFFDF4B653B7074286C6005CACFBACE + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 644FAB331F78B6E33CF33A40DE2BE610C0 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = +CT = 89A64DF193A360AF3E6FC48141B6586E3B1E + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00 +CT = CBF1B80E483D9EF0F57253FC4DD0A5AB9FD5 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001 +CT = E54BEF623FCFB4F52F1517AC988701AA4AFB + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102 +CT = 807328F525631E49628D522C3BD9B2C7C5C5 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203 +CT = 9F3F11B71DB3373451E5FB912B2CDDA8BC65 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304 +CT = 1D078CEE44AEEB8F0E604C910453EADC240B + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405 +CT = F594B97B57D45213A42288B2F12D3672B170 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506 +CT = 3E59C0A5879DCC8DD0FCE587A737C45F91EB + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304050607 +CT = 15D3204FD5DEEBA4340D8CA17449FD37E44C + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708 +CT = 39A676FEC61603470BD45CCE896B657BDC02 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506070809 +CT = 495F8F7E68FBA41C90FA78FBF4439C6A3F7E + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A +CT = 8435B2186DFD36B919055062F2F989CBBAE1 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B +CT = BE5717D62C51F51DDE8B636B9D8E5F2BF88F + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C +CT = F2E6D9B7A23D70F1DCF52EF76DE78C149755 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 26BD89FE25C807CD7617C10EE791F20C433E + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9166406EE05365B4450BFA3939D5505AE + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = B560C3E6FCA2D45C84B7521FEC7AE70C683A + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE06AED6E58402984CC6CB5988D17F21E + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A371B8B7368799620C41C268A50C8D7A4307 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A884DC7D2F6C3B39B4353D45628BB53457CB + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB74117DE14417EE7D3062604B327DAA55 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502C7F2681565F747DF466235090C63795DF + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B0036F16932E6E0029CC06ECA2AA37408 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A7CC6150FDC5D4328311939BAC76601870 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F09D2268B5A30D390EA6AE03F587B9037B6 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE73113B374B44563F6CA5BEF58DF9C34BC + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C1D611E319C2DF192093B1EA1879EC319 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5867CD78FC3FEDCF5F74D8030C10A5BF1756 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3347D2EC3C4491D7E4D3B49DA32AA8B406 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5825E3F31D5216047511956A5032BE70E + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47B197412D5480C60F969D0173B4DFD703 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91991F00D8465A0EDA19794F6455BBBD7AF1 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BC2FEB86350C228B4A9C2CC991E0DC296C + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = +CT = 89A6BC83977A85A0318201CCD82D7000C630A0 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00 +CT = CBF1A87612DE2BA707DCC4A048AD947F2F2094 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001 +CT = E54B7677F7F06905FDC116165B1790BAEAD56E + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102 +CT = 8073F501F34C01B9AAA76110E03224E53CE06B + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203 +CT = 9F3F60F4DDCADB0EEB780215525534907ADDFE + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304 +CT = 1D07AAE80B44EF2756869A51D0573BD421B337 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405 +CT = F5941EBE1793796B3DE284EE47B1BEE699F6FC + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506 +CT = 3E59841591349FCA4E8EB52346B8A02C0FE4EB + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304050607 +CT = 15D3A5CBC45A837D85C92F0DC004FB10200011 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708 +CT = 39A67B7230DDA7EA57D3CAFA5A0452B0216717 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506070809 +CT = 495F891769CFA2A3AA6B5AF51C77F0D043DF18 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A +CT = 84355B2400CFF6B13FBB58D8A25E6DF13883C0 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B +CT = BE57E3EB0D34916A3D9F0A432A090E00733555 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C +CT = F2E67F826B7A07D562E952B75395515097637C + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 26BD5476E060A04DAD6A02EC842117B0D6AD37 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFC08A365B4FD0AEF0122E84687D352CC5 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604D0AC0C837A483FEA4C4839BFC4ABB620C + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6C39516D216919AC04F2A6BB5AABEE839 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FA2A75BD400E7D7D84625FDBFE51EE170 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844F1AF57963CA4AFA6FAE068AC5F45D0BBB + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638D3BD19827A7313ABE1ADCE7AF400F09 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5F43FA8BBF9DA8901DF75D1EE7F647CE1 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B713D48ED36C9D8A0E57AC2DFDD2E1BE76E + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76EC0F741F2988D882667541EB1FB93DB6B + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EB59A86E8FA8C71CFBF3D3270EA7893A3 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BD2D1DC2F4EE3C3546875671FE5EF50BE + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C442BBA1C6455ED97D52F4BDDF7BA004 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670D71E17C9B52B03EF6FBBDB608B25A658E + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359A0501D6B729A20856E6FAE9C27E7DF0F + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5ACD47741A41D7A26735808109F2A21A68E + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EFF70847EF3C1A9B3D12C91680561F9DEF + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B7246CED2BA5C9C238CEA095E56D82E58 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF20F6D6E2C14D590E5E5C18EAC51B85DB + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = +CT = 89A6BC50C5231E96E9A06F662291F50541343A21 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00 +CT = CBF1A8AFD542DF241765EA528A660A008214DD10 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001 +CT = E54B761ECB1214E3B4840BE1F78E8B1A241654CA + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102 +CT = 8073F503CF01D899A898B8AC0A0086ADF9B10DC9 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203 +CT = 9F3F600219C38BA35749779C85AB185F8D58D716 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304 +CT = 1D07AA1D2CEDA0AE4A5CC86D8948A0BAF1FD228A + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405 +CT = F5941EF44248AB6CA452A775BBF6296B5C3D6875 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506 +CT = 3E59844DAD26524DFF5E2B09490729C2B5AD9B0B + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304050607 +CT = 15D3A59134FC14180F76BB1EAADA3BDBC2F9D452 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708 +CT = 39A67BEA301210D5421EB58242A63869383997FF + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506070809 +CT = 495F89652AB32FD2476D37D9BBEAFAB62104D720 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A +CT = 84355B90E2D8DFF037A6C6937D1D03593D4CFE08 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B +CT = BE57E303E466E38065B2CC81284482C2E303D55C + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = F2E67F04BDB59589CFCB3A0B6EC837A1E2DF97A4 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E37F280C725A54A67FC324DCD391A997A + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB18BCF6128B759994FB82215BE3703D913 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF35AA4A34A87A463B1874857DB4F962DE + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A3567643F03F7B36BB429EA434CBD1186C + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF16631A092D139552726AAE3353BD2840 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE41C029DE90B1D4265BB3BDB9ECB6C7BF + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB6385EC68E5767D77E8498D4D78493B39230B + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9379E3C9591B0459F237E06B4C2438F58 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B7100BB7EE6E3B708A3BBFB3D11717C9ED1F0 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E090BD453C59C5D823A23E7798058490A8B + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE00DE05B81EF8EEF3B5C7CC74272E90114 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF21466DC958D7B5C1BC8EEC7C1B5818879 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2108923808B6077D5459ACB9ECCD50272 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DEDB3A866C899C875ABB33B29346ADA9D3E + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E33595679C049D63E09F1825702080211A6EA6D + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E357D81CEC1EE3A4C9D2A7AF6873D64C1 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6D8137AA45DF262F3DBF5BC39109F3947C + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B955D8733D8C5733A966B75BFE2C7C9FFCA + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8D47A2C0D41BFBAE751C37F584119223AC + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = +CT = 89A6BC509C67AAD3A5EFFBCC98336B63A07B527F5B + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00 +CT = CBF1A8AF0382EFB2BF936EE6C55D90F62DD169F472 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001 +CT = E54B761E4A7B6826D0D57CB16F93FBD8E37C9459D9 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102 +CT = 8073F503267C666EBFC2ACA2F74AB38DECFA04D1AC + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203 +CT = 9F3F6002F8D617E6EF9C02237105E509C424DC88BA + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304 +CT = 1D07AA1D70E56AE9662FE300FE4FDC272A7812A8D9 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405 +CT = F5941EF434491C2F373675A69E09D550574AEC7EB5 + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506 +CT = 3E59844D00DDE437474C86C3C391FFBD62BA210BF6 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304050607 +CT = 15D3A591833EBB45A53AB6B966651ACA7DB64F3B1E + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708 +CT = 39A67BEA2B2DD643AF84210E8E7F5C5F3FAEEBB31D + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506070809 +CT = 495F89651BDBCF34AFA4CCE73E809175DD8A5AA557 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A +CT = 84355B90FC96AD5EC7BEDBB3F883253F80CB75DB5A + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B +CT = BE57E3035FE7292680AC70399EBFDCE6D62634BBCE + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = F2E67F043065FEB165E921A35FA0FAE6BE9D647BC0 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0E393F7C2D10D85AE5DC41849DDA30BA15 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB1047EA62A44DDF4B9B97E84A6D32C8BF25E + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF952A28CF2E9B3996A2F97E81E8B1693758 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D0791C3EA2740F0D45210C613FE78F7BF + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5C6985F9F5DD6AC93EFEB55CDC949ADF62 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE4724BF8D5DE5457EC5260536842C4A9FDF + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB6385038F6A8AAC4068BF9061C1ACE347085A88 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6C16C14D006373B6B033FD49190D4D379 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074AFAC543F4C1FB5BFFB424708BD1C2D3C + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E0931601661BA56D3BDE826A72AF91FF4DB11 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04E39D2D95D3D3A0A82B0FB30F5CAFB5A72 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E209ADBAA4867CA1AD63E4A4B17908DBB + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAAA0B1734508E058378F38E225683C576 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A8423F21461DFF629ED1871C3D24300A6 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569760D6B2EDAA58CA752B872B3282A58221 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E70349D65556CE95F8752B25B50A15CD742 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B9A572E2D91D4E5E2AC6355AF9FE2C1 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E277D8FB4F7C4E89C71B3DAA3C7D9F11D7 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAECE7BFBCECFAC4AC6D4E02941704AD26E + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = +CT = 89A6BC509C2FAFE883D718EA3F5F57E38E272B77D25C + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00 +CT = CBF1A8AF0311531E76CD7D5A5C0F193F16DB95633BA9 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001 +CT = E54B761E4A8F7A5481E94FEF54CA1AE0415DE60EBEE6 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102 +CT = 8073F50326B51A12A721C9F740978A08EDA84893113C + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203 +CT = 9F3F6002F89F03F1649909A837D362FFA0A17AF16923 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304 +CT = 1D07AA1D70FD93D8AD81C92EDB62E1BD2060E447ADC0 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405 +CT = F5941EF434BC19515366CAC1483BCDC362220A4F42C8 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506 +CT = 3E59844D00E14DADF939EAF32281367E1746ADF98FB9 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304050607 +CT = 15D3A591835709D5565C3730DA132B03D85329436823 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708 +CT = 39A67BEA2BD6D90D81ED955D8376C88C6F11B1960CAF + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506070809 +CT = 495F89651B34FC582DBDE637D560A03C50D2602A139B + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A +CT = 84355B90FCA6B7C672A8793E786E0DD765509EE26F49 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B +CT = BE57E3035F319DF8C9A266D028347B4B7564A4DD88D2 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = F2E67F043069B7DDD4AA08D9187A5F77E8B08789402B + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED967C9E2853313F569D149C542C111B44E + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB1049535079CFED2BEB61C07B2E57F022758EC + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517BD1D054EE697F87E318B941ADF98793D + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4297E17AB1D4995AD0232A524B82373D43 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE0D18EEE11EE35D240CE1CD9C82ECBFB0C + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475AD01DD366B7A5DF95993CDE37EDA9A1AD + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C5A69D62915DBE4610A0E506187B455627 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61792CC7D63763627B59F8B33C6949AC8 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074775636362676B385F4052FACBDCADF91B9 + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B9388CD9E26D43A815609EBC162946AD + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA8DD7E6D74C5BF0DB5A5540B82896CC7B7 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E7218E3A3D96DF3080D6483D7DD0EDE8F68 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4B780B27880BE1C515C290244D733D2D8 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A072B115E3F32D9E0F32F373295475D8BAC + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E33595697706EC5B15B3E2BBDB942755AD0350D9F92 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706CA807B2486D1E3CA7810694AF79A7B859 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17BF40AC008B551E37823BF51A187322FD9 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221BD7995620D3519F76C1029125CAC9CAC + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A31D8680989A449F2E58560B49F2D152A + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = +CT = 89A6BC509C2FA1FF3F4E0AB9C88687267DE87350261075 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00 +CT = CBF1A8AF0311E9BD5B64B5DFE06E40BE30D204028CF036 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001 +CT = E54B761E4A8F0D37FACC5DEC04D2A31C7B96AB12928278 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102 +CT = 8073F50326B592A1EE20F00DFE3530C533116919E61B65 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203 +CT = 9F3F6002F89F5CA9A1F7027050810A065F7DCEE14FCAE7 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304 +CT = 1D07AA1D70FD65652D08DB9A2723FF22B693819CDAAFB9 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405 +CT = F5941EF434BCE811951B4E6696711CAA3B970AB07D51A8 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506 +CT = 3E59844D00E1B3ABE12D08BFC0C94A65B732668A69BC93 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304050607 +CT = 15D3A59183579562B9AAD9D8181D5C865B8C67CDC1ECE7 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708 +CT = 39A67BEA2BD662BDF9A57E079E8E78475C4F469AA33A8B + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506070809 +CT = 495F89651B34602E9821BEB5160FEB8EC3967B843FF5B3 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A +CT = 84355B90FCA6CC35FC8938ED9B13443C7873F1B29D2329 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = BE57E3035F312165A5BA118A8DD563A5847F45A6EFD745 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = F2E67F04306927025A70A33143986457D7BDC1D8C712AC + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A943ABA14D2B9F8DE867081F685ABF1946 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F8A75BCE7374CEDA18819B7F13457FE75 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E31B6BABB9E17918DB17E00FB21B32EBA6 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D42452E818C71B1F541293A1DCC309023F2F2 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05A8FE616983B390B0AA9AB0861A376A06A + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B26F62F9605D466A5305780BC46438A5D + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C55987EB4130247764492D9C99C070EB8290 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A6440354E590924C9D151A649E538ACB7 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A5C4BD6F1163129B788B9C6EA8492DE60 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B46438C5B6359BB7A913345ABC45FE41C8 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A396E12AD005CDDFC4533911AD713BC09 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72ADF20321DA3D70AB6FAC7E4DCF9366F8CA + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C616257EC249AE14EDD6A46F6DA407B116 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718E408602D57C9B52399421CAE9D5504F5 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A998B2154EBE1725275067B8B914175150 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C381C66BF4BCA7F95DD357A37BC62BF1942 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B531465C0092F651CC6143CB7C85BD269FA + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDD146A8C9CC6A5DCF6DEB0D900F11B8EA + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A005332E5A90D15F6E284E614170154455E + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = +CT = 89A6BC509C2FA19985D311F6C23A1390FC6988E50507AB8D + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00 +CT = CBF1A8AF0311E9921AA571635480AB54E9FDD9283C9CCE2A + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001 +CT = E54B761E4A8F0D1DC7578E7B54A2749B6686E16AEEE18CB3 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102 +CT = 8073F50326B592E50A18B4CC7D509FAE42922A4240933916 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203 +CT = 9F3F6002F89F5CA221DF6F6802181422C9D58113FA0C1F8E + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304 +CT = 1D07AA1D70FD6573D467D9C06A2F200BE279E534614A0E71 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405 +CT = F5941EF434BCE8E3D11701B6ED6F8615D9FE435C334C80B0 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506 +CT = 3E59844D00E1B3B1DE488E2024209622CEBFB416F2B049CC + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304050607 +CT = 15D3A591835795972446B68ADFBB5648BD562A91C282C561 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D7EB1EC8ED0236A6C6000D21AAC612C8C + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 495F89651B3460E653C63F2392D4FFFB56D1E6CC9D12BDE7 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 84355B90FCA6CC9632C53A40C3587A709B61B6B97D5E94DF + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F15DDD175F4020C66A0B35CA199A06AA19 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = F2E67F0430692732ABAFADE7A55B4052D1ED39FEBCCEDC48 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C73FD8D0FB43FBC7A628E3EBEDA23153A6 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6FD5CBB4C0E9CACCE84AA7A9080A969E72 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3380D869A39E999C7DA1D09A175C55FC6C8 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D424519CD441690EDE24A7016FA3F9C8ECF1743 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE08CF6E8DB3384E492FDCD2260E7104447 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B1052B82AD79B12930FB2217A9E7312778C + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C55975D8FF28ABECE30538676B1D1E6DBF7D37 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A27CC90BE87B03B9AE15A3BEB7A216A6DDF + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A797490043C5857C688BA83A14EBD97B62A + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B414F8C0EE08AB16D15A947F3BC628766E48 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A59121EAA4661144E91E6E6CC25F4272936 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3C84BB3E1B9C0382C1D7759F93E6B27B7D + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C6630CC80DA962408CC406363A9B40AA3A6D + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A07188359CE6D7451B00C55106E2AFA8DD2E81A + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A42912DCD82E02B3054DCF687AE2117B4A + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CC5F630EEDDBEAC819C2DEEF2201711B29 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364167C534D49662E61B849ED74226F370E + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC10A9C0E8248D2EB6CA92650238AA8D5A + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB16046BBEAB8E9CFA426C2728187A849D + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = +CT = 89A6BC509C2FA19946BB90A56E0513305B63E9890AB3569F53 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00 +CT = CBF1A8AF0311E992A78A32AA8D4E740C68D754B32319FEA66F + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001 +CT = E54B761E4A8F0D1D9444592A2FB4B251A691B45D2B5D477A7C + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102 +CT = 8073F50326B592E59269DA4A89B869C4E11E35833A4F669BB4 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203 +CT = 9F3F6002F89F5CA2B4D05823AD1B6DC0165A9BFA05716B3E02 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304 +CT = 1D07AA1D70FD65735A730665EACE083909FEE6B522ACBBE28F + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405 +CT = F5941EF434BCE8E38E2364E46E4AD44F13298E0F5CF40EC4E8 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E86348437080D7B960C8083022638C655 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304050607 +CT = 15D3A59183579597383CDCC93C39AA74539A915959F14221A7 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0DACB3835A5C3B014477CB3E4A2C7F385A + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 495F89651B3460E65FB0E607DBC745C42DFC69B76A1450E12A + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DBE97B4A3C18D5343EE196FAD5BCEF366F + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1079764C09DE7C5F2EED33F8C0523DE2FA9 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262BEAC89B4CFD665D649D82000D9BF8F2E + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D029DAF78D5B25A2E2630A6E5C413FCA84 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5BBBF988040E2E57CAAA9B4A10F16767D6 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C5D55A7102322C089D2AAC80B0DD3F390 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B3BBC18566222D350060CD97126E3E051 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB29F2899321EEB2B708480CAA6CECF092 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACB5AEA87BB37AE1EBE36077E57E8CAFB5 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C5597536469C3C42947E378E2F3DADA92C93FDF6 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A27736FFC2AD3DCE21991BD31BF256604D5E0 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79958222CB75B72337A721FBC3D1AE9A4DE5 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E94C0E8C6557EE393955E0ECACEC695F5 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D2A37B080E1821C3F5CB61BE972ED498D + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB72D897D9AE735007518C5A5D2A669F316 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C663566417ED8EB94F5592506E7BE90926FF9A + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839BC1CA87FCF0985878ADDA3EBE9D44BDD9 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49D021752031963E9214F6FD35CF7E0F6B6 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB715CC1ADA9DD5C35DDA6BB564083CA68A + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E37275FCDBED9446A9A7366055C306AC84 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC697DFAD028C5429DBF79B1C978BD7158AF + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB4938CABA8D23BC7550D5449065BD3F7D12 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = +CT = 89A6BC509C2FA199469FCDBBF235311CE7D092D277C4292A932B + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00 +CT = CBF1A8AF0311E992A7412EA125B6D913A932EBA9523B2DDF40ED + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001 +CT = E54B761E4A8F0D1D94D9ED21708B33C930E8D64D5E099D812BAC + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102 +CT = 8073F50326B592E5922BB08D428DF0106F7C30DC44B408600C6E + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DDFEDDDBEE5BB2B07EA73374D7485EE14 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2C35ED369F523FA92CEA9EA3BE5A55315F + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405 +CT = F5941EF434BCE8E38E632112FEC62EAB408619506C9EF38C65DD + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E6C6825759002B59792F435F7D0D38464 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 15D3A5918357959738589E7A682BE14924935695447AAE7E7E0F + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D46042D74EBF959CC0A2D224DCE310E001F + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 495F89651B3460E65F00A51B0AF19ADF71E72BA56DE7A0BD4E97 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB8296BEF5B088045831D3427DA6043CD5C5 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DAF86350AD9959D3CE809808293D449F3 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C433D936865AC6E597FD3BC72C7F4156F6 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C71B3695053CFF6417A8BDCC9BFB59A45 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B615DDEA8DBF165499792ECF451796244D2 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47A262AA449EF56499D617414D4C896D14 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10165C52472EDEA889A874C5BBFE52EB60 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7AD233BBD67B7CE69C2E24776CBD359A6D + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE26EBC4AFC66F8C650B1A34A72FD6C381B + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693BAA1F38895D566F7733329FD6BD33E70 + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A27732426427ED1387907CACD3965EA199A8CA1 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9F2AAB40A78352F69DC25CE275BF9D69 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F10A3C510F1E81A18BB132EC4391F6320 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D8798266FE34946A56D264F7A3368507CE3 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0459254AE638C1B311E9A4FDA5D8FFC + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356195E86697FB985CA206B3CC767102ED955 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B249A2F8A0450622AAA7251550C80A214 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCFC180A11F1EAC687C96A86BB2F6020BC0 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9796EEB02DCC4A0B70D5E10DA36F43CA3 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F5ABC7445C2ACE584CB7394A0FB627481 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC6916E6AC4F1E28F356222FE712A65E84C864 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C04D312335F8453C3EA680350031D65EF + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = +CT = 89A6BC509C2FA199469F9291A2B928035B7A9162ED79E25484C2D9 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00 +CT = CBF1A8AF0311E992A7410E80696CD31C78B016DCB28A74B3CAC8EC + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001 +CT = E54B761E4A8F0D1D94D92F4496A44241FBDDDB98923ED251AFBB84 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102 +CT = 8073F50326B592E5922BADF85D5CF35D5133EC822D1D74B22E8861 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF52ECBA388CEAEEF3D1A6EF3B7CF290F24 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD0562EF2C4EECC0154E2CE09EA0FA3095D + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5464A36ADCF52862227C7B8BFAD99B70A + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65B6B5FC804A9DA164C902C904E4389D9E + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 15D3A591835795973858CF04FEABE60D1E1E246503EFAE853E3B79 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D4665C789F2AAC742B2307251D21AFEC58C30 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BBDF847AC520277D4DDAFE82A679E9D72 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A956EABD342A354426E5F2C932B533855B + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA18CDA52B8CE04977143170032ECCA2634 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42DFDD300D0C91F8C395C29DDD8E707298B + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11BFDCA90B0E2B2D847D8AC38A25DCB55A + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F438580D17993CA385FEC9E22B1464219E + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C4771FA651FEDCF609B8E989E710F63F8C44D + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BDB1C9986BB9C82B700CD9E86D67651ADF + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87ED7BAABD344781C5DEBD929CDF35315F + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F6CA27879ECA03D99003434A047442254 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570BA2858CCC1ACD5E166C67D8C759749 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D94CFC276CD7F9802497ABBECA77EFE7CD + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9376221015102E311312967A81139E2EDC + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1CA7CA41E27A5410CA641FCD12D1A66E1B + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE16981CC94ADA577F0106BA00A1AF834E + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0E452F3849E6685C6A315572083BF43BC + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C6635619794E57701A9A76F8871D5FD150BC032F3E + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0CBEACF0FD0A0915284E9843360146358D + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7AF198A04DFF7CEA7D15824A20AC22B1B2 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D32407009A5CBA128889375D44573BEB27 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0A6D86B1CD7ED30D320EEF65C7E93BD745 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161CED64750593F8F257D7AD44CD600A675D + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C0607E02E55ABC48EEEC95A9BB941412F01 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = +CT = 89A6BC509C2FA199469F92E4CCD4EA0AB3B86151E2AF867E3C52C63F + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00 +CT = CBF1A8AF0311E992A7410E62739CF4BCDF02206D1BDDABBF8D38EFD8 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001 +CT = E54B761E4A8F0D1D94D92F14971B1D5C0185F3763B427AC5BCA7DB42 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102 +CT = 8073F50326B592E5922BAD63B910B24B780BFEC1AC9A900991D7882D + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5303AA4AA98FBC31032573C0E4C73CA84D6 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02358810F9D3DB409742E1DA75E3F25A96C + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD5C59382E06F61ADC780F88F32F086B5F + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB163251A7D847D47823AEE1211D8ACB92 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 15D3A591835795973858CFFD1AEB47F50B389CACD43B4FFC05E82D6D + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558F3AC8AAC85E5027F1B77CDA2DB7220AB + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA7CA8F9912996AA2EEE11090D1FC837598 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A9670A853BE08F1871DB76A4D411B6C39B75 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA1550CB7A1684360EB2C1BE9C4F3917909FB + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D958C7E2781B92C288FCAD82605764B9F6C + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C1135C14831394BCF300849D12DDE1A3251C5 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EBA3102C9D86AFEB7414AE4B27FC718AD + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B4DD98B970B3292894EB8B6B344370C84 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96705CFCC76C0AB7B5A5A940ACD1B57EE5 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E354CE8BA50471F683A7B2DA7E22A7EEEF + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D795043D95F30B924E74C8D6F322D45F3 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A57043643C166DE2FAE4461152C4C94E8BA8 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D9536A0616E7F7069ED479DC3B7ED7B981DB + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E93052B105EC480A39ACC47B47BB2C3F40A4E + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C952549E7FDAC3312967D8C7E8F0B2E7AA7 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1DFF9EEE05DA2E19A1E205BECE77347975 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D19F7F360758E720AB7D56C36A405B9D5C + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960D6E678CB5EDCB3A72DF9DB270125129D + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C60ED6BF88C9EBF36816CD03CE799E63AB2 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACA23991977320EB6FAF58A6E3C95906392 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C1F7A2F72C6FC2055EE3A59A12FA9CC3A2 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC6AC81983CD0B235C4966515A17E3F35A0 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9D1447FF1E7CAC22BFCE56351ADFE1FCF5 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C067512232E32D015B2CD9104ECB2624D5BFC + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = +CT = 89A6BC509C2FA199469F92E4F4AF154849D57C7D8292B982AD3E17428D + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00 +CT = CBF1A8AF0311E992A7410E6238DE59ED371A2ADCE0241578FE5CF3A918 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149B7956F748FC788C2EDF784A728CF6CF00 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102 +CT = 8073F50326B592E5922BAD631EA40AC47AFEFCC38937B3E2B27AD964BB + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300DA117F3AC375F8031EAEF2B0F41794EA5 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305410C0213ADD832F7898255181E8FF92A + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C5B0819703E983BD74A67B02119687831 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34E8339153B199D9CC357745DCBE3F55BC + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF3377ECCCB6121F26AAF3E18BF6A95C4A8 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D46655816343951452C21C09476DD1C487D2C652C + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766447A7A15D3A4FEFAA4D3B2EA561E7222 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A96791BD63A245D49398C2420B979832983C0D + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CF4A17BF40BC3EC11AA824F4402E561E10 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D95222308E443EA42C5A5936EF2A21936F2AA + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B43287DBA3E95BDF7807A5113443BDE08 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE01DED7AA3DC969105904F668164D99013 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B37EFD062B76AF7AA238CFC064D0EF2A27F + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D97DC7384B0335DB0A19A03A054B4179C0 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F097A4EC96E292AE6CB5C93C2B187FF840 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D4951741A29C58C003F56C941E0F22D728A + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD3BF29BC31EB365D95AF7504CC004B559 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B6F3543C941BF7970CD8DD446639A0A405 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A92B54FA762076D4F39D2CC0E0AF888326 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C95360D6484B2F2EF17FED6082F50ACADAC28 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D3599766262F6899DB5FA8BBA8EF5E4C0CF + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D8F92AFD8BA9243A3E4B58253A490050A + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C6635619796053D15200011AA4774858BF32795302344F + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602E2246FB3A122D0B68A4038297E2BDF5C9 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4EC1B460C99E341418418EFD8497910CE + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15DB8C7276DA8DD06FE0AB521984A819ABE + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F8976E5542D272876BBD75E6A73DCD8B2 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD1AC54F1B472DF8116B0DA4EA72CE74F93 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C067520624AF353D3639A1A4A05192FD2423015 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = +CT = 89A6BC509C2FA199469F92E4F44E84E0B73FD12BB3A11F24A69E66EDCCB9 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D308A319AD332685CC1542F789377FFECE + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCC0565595660B5E94F1689BB21F2DE11DC + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 8073F50326B592E5922BAD631EE51DA79CE26570DF8C3853708E064AABD2 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06D5360DD3A670BC441A30071DF36AF59A + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D98C884C87CA3A37108906EC0BF0138BE8 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29E7EA72790318C43A8BF5BA9019591CF8 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34666BD5DA1DA9034FED5BD2B7AA4743E2D3 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307DF365E80C97DD9ACF80062B5EB97999A + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D4665581612A322D64E013F11D696747BC67F1B04B1 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5655B71C3DFF387DEEB05C05ED6B35A10 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919FEA8415E53D7A7220060979A935CDF1C8 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDF1DEEEF26257EE2F8C041F9A25EB24DB + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D95223280395621A41E4CC74970DE908FE57924 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B99A50289743A4B9861189374B48F239289 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C80C644199087B888DD4C7ECA1E0C26B0F + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B37003ABC06AEE0D5EDE750923B0790C497FA + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968ED9E6E36842FD004605646C1C9DA8879 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F0936D9C97F72D229C8A70D4D19BA107D278 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D4971EDCDD955274D42D7D11B7BA0E2CEC34A + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6EC6D3F59F8E3666D4A688A1E3CDF95F0A + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68BA9E929FB69A23840A4C1243D5F169384 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EA8472FE52FD05A98E8A24E7C56740996 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C95363320087EAF5A53754A031473A4901AAC25 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A3B3BC967894061E428D641F7DA101CAE + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D8229B8CD0DE1B785B58708DA49625FDBF6 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539BB76597E9A475C532C314CC3C7D67749C + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFB7A748B509FB1FD678E0328A08CF2281 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2D23AAD12F17721A5B869DC52AB3C2F89 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40A13950A24988B34FA34C41A2870DD147 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7BAF16D976F3845F7A4F8F00E13601CD12 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD1729B3ED9AC4E758F70454C46E848DDDD13 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C067520521442B18305C06090BCE3C8079947CA22 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9B3C9BD79C57363EA31627C468FC320FB + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D3654083FE3E26D37A49833A577289DB55F7 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA2D271F21245B09D18DE310E92E6F0785F + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A340C7437F33A11643252108FACDE10E19 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E413CF3EAB03A96A7AA23EF24AA1B1ECB7 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94C22D7A53FE8F49B0C32BE8BE415107657 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D53D1442C71F8A8AB5D621572B9D30B3E5 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B9DB75CB0A4074E23E87A5E2233FE4608 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC468DD97C514FB11440733D15B31B5BE4 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D4665581612730869370DEA8499682BB345C03855BA17 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C584EE56B4006B940005372886CB1A384181 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A99A636A8B69FEF9216F9C8DC3D77A193 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDED4C22B6F50581FE06F18FAA980073D9BA + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322A51DBABBABE6721C6306613659FA601BD + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B99693909056B2EF996E6229B94F2013A74B2 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C869C71C0CB8762E514F09CF0A21AEDB81D4 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BBF0F001D86FC9F615863D2DC83CAC8FF0 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968370EF2B772EFD247B3E625E465765930BF + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093418CAA419883DFFCD026DC2DE9E8F9D79B + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D4971965BCA1220B92E72041348ACD1D3C61D9D + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E9700CA69C5F45848C360A840EA687F7DB8 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B26159BE4BBFB6AD8707E7FE67DCAC72F1D + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFAC8269C42835617A89F988CA411350E6C + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EBE68B73AF2F2F129FDC071DC1CFD103D9 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5D6C7B5DB2DC1B08A685519C39D653E792 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CD3877555749BBEFA63E0CDDF8686A6B50 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94AC7C981A1EB8FC885C722A58522F0998 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFACB4792F2DC524E3A3D2E9206E09466046 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E95B63BEBED1E85CDB2C9FDEFC79871C81 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE6218C546B18190E6584D0DB54A0075DD + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45FEB6B453B5BEA263B8904C406D0A9D4B + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293D7FC0F125B069465ED66C616437FA7C4 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3280C1AD26CCCA796092B0A19B362CCFB + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC8BAB9A9CDE663E2524E5419DAF1CB3A2 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D365080A4D41C454A8BEEB50A1A7649C8B16EC + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21AB298FA39442AE3C541E36E613E518411 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E3FDCA807EAD619F00611A02607C26B4D8 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1BCF2E64DEE8B40A9B0AA7C4AD87603B3 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE87022715909B026F38DEC90AE138FA180 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B72AF07C6EE263E52FE799C494591E3198 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94A2B9484D07EAE8299950EBFCF77D914C + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC17988464F432FA169CB3465FA9E75F3639 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B7FABD89F76F62F2E919D87C8CE1470039 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FFDCE87040396207628F852A4E0D9E3C4 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90F0A26D5E34E478BECDFEA1A7211A98DA + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8E073795B221B5E7C50DBB0BE13D4D34B + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4B2D116659872E5B1B3FE2C6209D6E9AD + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B99691071FB698F92CF70E988EE4FE89C3E3772 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E8923FCC6C04E9C14062EC561D0D552D1 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7FA36059931CA7AE1A7629D328138ABC67 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D9683745A4287E79442816291B92B2BEF391305B + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413FAECD775190D3C752BA247338F5B58747 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D9D5648ED203496CECA94515EAD10D1C37 + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971D7C65C1479C354A8C0300126A9B6CF80A + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E514BF34D9E8321D157820A57086AE864 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7E8AA4D039DD6EFBF9C5B19E6B30F0965B + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB130294F4394AB6D8B9D34BE130CCDC9D5C + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB7DB0C69FE14FC29CBE149E421911F8A81 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9CC9BB4AC903244AC7C982E8B06DBAF2F + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B947062A6FE7EE3158633E9CF80ADD8D36E7A + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E456256C20264845C7BDF170818B04920 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950173F98DE373B5F02B96F4D7E37A225C7 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE093AD6899DA2348699CA6541385448B8AF + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F09A2CAD0EFBF59D5A7F632C37EFF6A4A6 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD1729334BEC34F623D36C3B4F5664297F3AB8CA5 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D922B691D7A897DA13800F1B50751BD936 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0C5D8989EE6956F22274DDCF77D3EBB027 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C5101008FAE7658C775BA521C991AD6EE5 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A729DC7CB0E344E2A8EC366B57E42D4BEEF + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BBEA5F08E1C093031FA50CAA73B97E543 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1062C51D0FB40DDD4E0066EC1ACAB3685DB + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAEF127824152F02F59070A7B66A028C26 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B7305FFAD4FB96449D45392C11A462957671 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B9430069FFB6341D9FF07A90576BA2C2452BB + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC17384B3F0B012E46029DDC4C4F50DAAC69C4 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B7000712B1D507FD80ADBE37FB89545BBA3A + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC03A7A61145A0C357E8FBB1A81AF8E6032 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C362813649CB8781D9BA6466B93D12332D + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7B7ED0AB2E05851C2EDCD710A84312EC9 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4311CA4B094E656DDEA7E8A3799A156AC6C + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108B1B8470007BE203536AA650907CFE4AE5 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2F0A6F843ECC18E939A25C4308B80E514D + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3DB7199B8A93DB1669AE4DC48E990F9D00 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D9683745128B9F12B76A5F7C6EB018E050C7ECF98F + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05BA91719F7DE32B57E95BB8E3F58DA974 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D907639463FFEB3E5119F7E2E4A625E50B26 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAFA470A815BD9A2388D364D1C8F22A944 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37A93CB0BD49746F8D79A96E3AE3001AF5 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2B0063F0E6A8C1F0CD44400A9348A2330 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E1EDA2BA48BD4C06B8D039A61A90F20DC + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A912A0C20CE78A16F742355BA7D230F6B + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5CBC0D2E5106EC34E7773ECCA071E9755 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DA2118988EAE6DCECD166978624864A76 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E882C363EB4D4A378D4F71B8E78E59CF7D2 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AEE77A110297CF3197E919C8CE7E80A3C8 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE0939EF345D78008D932159F4A928AC2C78E9 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C29281DC969C99BC12207C4767B8D4CF0 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C6A3CEA8901C57049C6885FD5F42E911C + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF23ED67B55039053EAC8212749DCBEBC + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA96C1E852DCB5DA3B09A3B24257F8AD8B2 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C19F7687623D7A4ED57004FC7C91AC7AD + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB5971CB1E707838A51DAE972CE545F2C4 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC9C4A6F6A52785FA99FCD7DB045536F4F + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069F29C5EEFEA639FA291021E88592219F3A + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF0900CA19723DB701432D97BBB1F64FF2 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D32CA2854B1ACDC4D756D85EBDFFE495BB + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308EBCEE78B8574649CEE64EAFD0BE037A52 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC1738453248B842D5660CF3E982F2579872C55C + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F8F6684F21B76C02C3EC3C032115FD7CD4 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3AACEACF260DD04BF6BC718000E62B49 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BABF3658F1B9092F4D2E918FB00F83CF43 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D77478DC2F13E625E2C3061EE7E53D90FE1C + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E0E0735CDAE040D8EDF8DA40242133E08 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE5C623AD54D816FB37B70896F20CBAE447 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B255AA79A96DFB36418CED39648EDCD3 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40AF72CFAC10F564EAE4665F8C8C0CF542 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512018681E227B257D853F251AAD55F8BB8DC + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F9F252A83B6893DC1BE2A29ABC754BAC80 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D9075736801AA4A93FFA9EAC5DEA6E6C380063 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB960C8271EAAC167B0178BE0E8EF38F4FF + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37ABC4058A4C6B4627C03277F735EBBA22A5 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E405E8595CBA2EECA2359D17E27C60BDE9 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E94835103A7BC7B1656398E52C2A442F854 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A3562174CC69729E5C449A71F258D455F34 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BB7CF81E0720BD0101311A1EAB53857C40 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF19613841B1A5EDE571A901CF79F01D758 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C2D7D6EAC13656AE074354710D4494A12 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67E7C28843C2FC13DE85FAA6F0C9A487BC + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D36D12DAAD91D815EC01ED4372C063E1C + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C42CE48A44DB2CEFC82A6900D2779743B10 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C57F5387D16F696A78A1CD9914D46B523CB + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0BE6DCCFCE9B4B58F71CB01F024B988B5 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C3305469D5624234B9042C38E684B8344 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C929E7A4950FD260F848FABAB411752D693 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58A2FF1DFBEDFCF34448C989C778BF7BA5 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC397A5D170E75F27486B4B0D4437C7B8A20 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC986D252A0B3F18596BB04D7BB2E377C00 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF550C387DF76D7C197F263484E9014CBACC + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA9724EFE7193160C734E94B7ED3B8C553 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E93F434A2F4A1A62F6DB761C4CADF074522 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC17384571B3C909F800AED34AE89FB31E74B43A68 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893A11318D587FA2CB15846A226DAC123C5 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B7922105D790D46EABEBE8BB38D94A7AD + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA38F22E7A84D1E2A1E5E648EB611BE31EED + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741AFFC9374EF422DA78A0947590CE40A3D5 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00FDA6B508D1952934EC15D91392146360 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AE5E5CC355885E194A39BC6DFBF9739C4 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B679114C21744E5790FA890549261F3379 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E6E7E741B394D3171FC0DC88FC51807108 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010A63819B6A687F2699C012AC9798C0FDC8 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928296657C783DD436817A2D22D008C08B8 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C1A5C4856C52BAA1D1CD706F2D65EDA8EB + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB9274DFEE95CE6E72D2DD3FF8C3B6C0BAB93 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB7317AF9059647A3B91BC413739668B1094 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E78ED9C6F62DC648D810CE9DAE966D536A + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B7E192DCC6FEDE9356643C679FF99EFAF + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BCE639E7DD5D3428E9FE4D7CF74A1D2D5E + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB19B23785F2BF1BB77088041E96ED5BA82 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A7B571308D4536C518F4DB528398F6B9E0 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11B1B6021A1E6E40C3F2955D438A23C49D + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B5A7B1FF4EFD1BF4ECD26F2478D7816C61 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D37B923B32620F169689B2F027A4992902E + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C4293B22AF20BC83500E8B0B239B38532565F + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C57393E6420C35BDD2DE2B1A140043CFC0A33 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A9698DFB67FCDDB695B8E8F367828047E9 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C51DD70ACE370C0DA9D4D2EC4A2CE0A6A79 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C9227233403032D58AD0615B5D9A12EFDCCFE + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D43D381B0504534E8EF1C2325753392029 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC3910084D0A403F98E8AE2D6072401EB77C61 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC9120029E41EFE8035485903EC0D2809B4B6 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563669ECAE799D39596E8F9A83CBBFB09CD + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98FF65DA03FC553D7C03AF46A5DF01ECB3 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E934815B606FA2A3409341560AC76D0B86D18 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A7BBF4FED1D084970CDC52233307DAD60 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F8932506289E5B0E98E82C747728DBF623D9ED + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B627A82DB0576FD5CD86D7140555DCE3A85 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DFFE9B226770F9203F5658CE04CD5B781 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A582AEE51FC5811FF63FD9B4D278F5C1D7E + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D1B2300B90CBEC9FAF879AB03D60B42398 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF755E36F548586D24BF52784BFB889A22 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4128798CD689B779502FAC14909CB5D3B + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66D03770772F60900CCDD45A7028B548ADD + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD104888743AED8F9AC40D4CC34C8BB7A6A + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928410F89F44893EAB61B32D4E1C88FD847D7 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C1015A969EC47FEC5933E5FF98189A0B9CCA + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BEE30206BA97A14DF90E4065CB30F3B263 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733A70F4A3356975D52EA57504415F66E373 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E796921E6560050A6439A8A38F97160FC20E + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1D5BAC3C730A80835A54B9C1F603BB6D90 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC35F41AF6B455642D4479E1399F81EC9820 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB1451353ACD814EDCC8D1D6215FEAE5C9BDA + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A74085C8E7329A1C25DBC35617014449D505 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C1154D40BA3FF909BB5A4B685A0B4367AAF90 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B599AB4713F7CD8CF36C9C6623C374988DF1 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773922532D80E626ED3C2648F35F6FB7907 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302190564D2466D890501DFE0B65D523BE4 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739661318AD1CF59CC0A57F573120F7C6DE4E + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A9381174704A4D4154AF63DEF51AEB3E9F56 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180267144074C1B13FC99BA5A50111CF892 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C92275521A1DA4F1603FD6B229652AFA34107E6 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3317BBE35ED34F32856200D183D2E4C98 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC3910603DD20D122FEEA121DBE6DBC13A3AD33C + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269DF79D7E8B3BCB9DD8B23037677B4908C + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1878A6DFAAE80C564E644F2284F346AD4 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871F208C158B75157825FAE0D910A3A8DD + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB2C3EF3734DCF605A3C48A78E879F0799 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46A45458A4088B12D2BFE29C21A12B1E6C + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B6D13AA3479DFFFB7C531735A6E06C69F + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629F77F5C6D127034CB0C8A06333153D1AA7 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3E0A7F7D65DCAD7CE6FE6273CCC1F9FD8 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583CB31838FB408FB2FDF857CEB5BC01A038 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D11376E8812094A35E613B24601A31804761 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C570DB375D12898D5A1A2429C5A92B419 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2995A24B84EDB1FA34D6C5D5DCE318AA5 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF9F1FB757F121AB21F121427DF504AA945 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1716B26D110D8BF097E82A07D794CA4B121 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F92841764EDA927DC0688F6B3A7EB08731F9FD53 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106851AA3A088B067F52721AC8FF4DD8A7C + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE347E8FF604B847271DED5F53FFF6FBA4F5 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACADFBCEDC6D246B5A1B0C3FC14D8C896C6 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E79674F8413D0F6C925906AF0F73BC1CCE9C50 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE7D7CF8C25728170DF22D829F8C7BB3722 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351DA819B5F27ED931FE71D3F61412ED83D1 + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A36E23E620B1315999631E363D179F2CD0 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D289C4A97751256C55455CCA6B5586EA4B + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C1154640D99F1807E6B2DF71671D03FDA25E4B6 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B5998281CD30AAA8144F92E3612CA78084DCD3 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D377324AC589C08766DFA9C5A87DA4187D75B42 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E29B409CC1E99C2AABDD51A909BCB32D97 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B35207E8AAC5B6E50EB0E387363265109 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A1BE1B8A92FD450CACB63AAB2ADE1E4FEA + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BD3E3DFF61F263A30D387517374CB3DD93 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D79AE05909854CC8F8C1F22E029538B1F4 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D6A450D26E4A7D78DF95C01B6FAD7DF846 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F32CD9243A78A5B5A1BF0EC1A09A720275 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F2F5EE7152E6C4E4EF9750257C4A7DDCDC + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C4538571A7C26F46AC1953EF02A90F6A6F + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871D08F1D229715DC290826E01B4DF4AE197 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97DAD326554E8CBC59EE9F3D5FD2A32BEB + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C611FB5A02615E60240AF443B10F3E73B7 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55F165E78019FE44DC0FF1DB875EF181B5 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF0616F2D90F359B391814051EB66ADBA0 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB307D1B262640DC786B756A8CC7B18411205 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C3EB455A7975E005F3BE7A7C02B48B591 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D11363E6998C08311CC08AB7249C7C890CF9F1 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C4AA2E6F1FAB279D09D73612E7854DD87 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6DAC766581DCDE9B4D4D4011BFC660332 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FB367507C777A8835E3ABFB1ACBAA78BC + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DF135D098EF6B8940D32AAA04F1DE1A3B + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F92841766687F021FF2CEA1B90E4D50F8073599EE2 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EAAA45F17A7DB4AF372E295BE1772CF5D9 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A12258AC44CFA81E63DB2862F2F169080E + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5C6F6CC7E3503D5A8AD69DFEFAD44612 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E796744321F7F6A9FA4272CC244B793226FCF1C0 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE75376F55928664F323BE8739D8F06B6114D + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69093A5F8EDA01CA1B359E85F2E1AE609D + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EA0D521C7F69DD882A176D0F032E9E04FE + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249165DE58011409CD0323451558C8C6752 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449D7B846A5FBBCC6149A7C8027C9D5EC27 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F1F17FF8030683AFDB306B58F6E7BC1845 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241455FE43979DD2FBC4722E980E9454C67B + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27573CACB37F9BD41A9653B74DDB0461B93 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F1493876ED5AA4B1DDA7A8B40B6C0C3EE + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A11753B83F1BC754861E118AD98DBABE0FB2 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC17F74AE60A69B99B6FABBA303E5C93824 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D721147D0AA943EF6A22F693D811AC6FF557 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D64C669D306FF4FE70FE08005F3BC7829 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD25E7C0EC709D6121D7CDCB52002CBF95 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A54F0FD17CD8E37F7BB4777374E70DE74 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47EF7885539CC83FC29531A5362A61BA485 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2149B4C08F5ED9A7540FED36E7E3CF4BA + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1938DDE26B61EC79B04CC13FF4F15F7AC + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C6161C982AED835309ACD1AD1062B68011F6 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55AC67185E8747758A6DBA1BFDE9F2757F65 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8670444A1CD802EC8B43C4BF47141C1445 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074C4C886A05D7EAC99C26179DD7E3C0EB0A + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C940A11AA483317A90BF09F8018E69FD7EC + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EC4A724E6C1476A10825480D6D43A3996 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5CF9F4A408C1DADEB9D83FAC0196B79984 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB6FCC68E43D3D58B3905461EC4D595468 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1B802F1B2774DCD463CF7E6CF81AED6B2 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA76036198B43A2968A931348C18273009 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A53DEB31612AB4E6D8F7DA118671F3C0A7 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DB73A6E3B93D91282E2561D7A8FBDDADA + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1458A61B1B8E7FA362F3E64A8AE0C45E152 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC59D5E525B69FAA9AE7EAF90FBDE4515330 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E82E93EB58278E5DC0E38CFE888A8C10E7 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753235993EDD696E624D1E023A486FA703DA9 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F705DCD2FC55FA904EA0B9FE1C63591DDC + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB8FE0D8599B17FE0B823525C03FD1E97C + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CB3B27C6FD73E907204D5E24B150C10BAD + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B89D1B19BF30FDCC7F3602ABEC5625586A + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11B0C6E9E82CAD8CF5E57B05CD7B86A564F + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D377324144981571DC2CFACF2BE10F5227D31A56ADD + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E275973F3D6242FE660B1C3772F2F66B1F33EF + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F19E11C112F8BE3ED34AE813908E16E1413 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC4CE357976CE74C45F8E3B69ECBA445F9 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6AB4BB0EF4B75D0438BFF307A68EF3BD + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BCB014ED542AAFED9656083B1500DF5FA + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D434E2F465097A408A9F33A090DC32570B5 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81768A6D94E4FD7448F59F17F548F00A17 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DA7911AE5559090220B572831625D0E30 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75715EDA60D68A57CA64EFD8B19D30F2D1 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DE57C6EFE50421483CE3F9B9C4C3943DAD + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F151D1DF8418C6FEBED03860466AC55E356B + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C0651143F92B9F87E05168F807D297547D + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC1E1816F078C804FBACD12DB7573E37460 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF868070C2476104D701F8A6F9B74DD2B6A988 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE4373634E66D83CB01128776D26576909F + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498CD21E4DAC2D2F50CB05AD79A30C56C3F + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDB45BEAE7429CFDCD22D7B3BBE84FFA30A + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1ED5F56A0F853617CD054ED50A9B88D786 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB445C3B9759323C946AAC9B42AE1233513C + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D93FA46BEFC851EC1F532781AF79F92F8A + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7B1E10EEDBD39395D9D8BC06C3EF9632A2 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CF901D920EE1E7143797ED3DA5300105E0 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBA1350CF5B4D6EE2805042EFFD711C154B + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452530E621017B5C76B66632497E0ECB533D + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961CEE3D9A8F3DA8E97D073A6885AAEA595 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB2697E258057AF950930F493BF8E39A7B + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE7532397206FD7449E71F1E957EC9C295D8E8C84 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F98E9D400A8836BC3DDF0D84F8256D732 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67C5780CF94A855A660A70B7B6C385DA9B + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD213FF2B98E2C29B66EFA740A31487AD05 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80BA72F3E1CA5FC0716B00D4494B7C1A14C + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD96C33D099E6EED52E6E39996D14D84A19 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D4522A04E1DC228A362D786C755B71D0DC + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1ABA626E297E17BE8C2AD78C5527EEB96 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F1931FA235FB96352B97D3DA3C2273DD9672A + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC0234A91024DE027600FD2287DDFBDCA30A + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B651DF05CE4CD11E1E84D74E62D437D9E78 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDFDA95B65C96072C947362861968571A3 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B49BBEBA3BC0645C0F30DAD857FA313335 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FE16FBB42FF9DEF1AAD06ED1F34E70742D + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD81C877A23E5398B762812E119B530A6BF + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD8742110FE5788D49B021554244D3E1B7 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA51E33E2A575D5FC0A4C3F2BB5C459C3DB + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CA10402C866AB4B557354B5A57D381DC4 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C03588D65179E46E59B3C149E40785FB7829 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC19809F2F5EB41405645031CA93AF44117A7 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D38CCD4F60CAF41BDD96BDD3FBB97828AE + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C9230A3772B545611B1F06431969DB4B1 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C949815A4956560B590BE6CF0B37305673172C0 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6AA6D82A88A15039C42C42CF1834A22F5 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF5E570FEA7D151B13E26A1F100E6DE0341 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B682C570AAE8CB3643E6A44D3F70E5609 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99A5E80B46589A54C92516F2705766C0D67 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB0BEEDA48DDE343E597BB926043E19A18E + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE89F8DF69FE6F3EB77AE2E371B2F478F2D + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADC61F9A65005BE569F663A4B322FCF3CBC + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587D344915AA84928871C2F2632FE9B9681 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77AED7524D80E87F522C5732A5F1AC924 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8CA77786C93D877CB546603BB5883051BF + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743E58124AD68686F88F5823BD6306D261A + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B6EDA52534FCE987897FE835B430EA404 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DE576FD3B3D7297D7C2AF893A3CEFF52CC + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C06674D82D3F835D45A3DD26D4652225A + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B256E97B4D398FF0FE6E22602FAC35621D2 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD942C5429A44650829F19C410F259270AEE7 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435166D995323E3CDA731AD551797BA2800 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAD58B5560A6C494141D8C54AF0EAE19FA + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111E9156399D2DA47C23457847A99031A90 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6AA1EE25D30ADF13BFCCD64681E1B5967 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B65072F8F123D31B58D756E3C71B90268B46D + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA0244BB016D874B0F97F0E13563EA7499D + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B4857B37AE2F569A9A159796C643ACEEB18C + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF369E10F12014B3C3787B35F154668A653 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D20BD040DF5D460DCD2AF068CA306E5D8 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD169D273C3A02B19BFD97F1073CF9296FF9 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520D3153B8413998AD3AA8D74B521E6917A + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CABAF1D34008C4C2C5B27276A65CA3F7E0F + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF2A53629C1420E7B37C34D52E96E92E0C + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA39DCB4ABF81A5F8A67200AE1DC296F1B + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBD752612AA8F335FFD9BBD2EA65DCD386 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C4720018DFC224267F682A67679EAC364DF + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B35FFA86644E4C1C0DAC4C9118E816276 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B72D168F8AABDE2DC1EB26525A06913C41 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF5381907A959487594749E0F05E8034A4915 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303FBBF3BA21D9926AEE9497478CF4677 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFE812FAF4389C0859C6128EAC989F20798 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034A92D18A6806E891FEC39457703781B68 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE868388136AF867C63D17471FD74E4CD8BD5 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE83B6E82AF1D7A618566389C23CC52A07C + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E91923061ADE7115F0D590DD8FAAFAA93D + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E771F6656E2530794BECE38B140A1A29471A + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1BA5DF9B00C5924B521B80AB5121540272 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A66C5BB70929DA94A65FBF4BE8C115BE13 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B85C0C4BEAEA2DE22D5AAF284B5D81DDBEA + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEEB49266EA300E014FF8264859B80323FC + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C2486881FF48A722A7FABC4DA5DC8E4D71C + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532F77CABF4DC9EA535CCF3C62AF71A0591 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD942306CA0B27D3A4557DD3ED221A5F018A1C2 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D4DA5F3A0925F34CD2C0F4048F88F2C236 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC160CBB74E98426ECCE4DD0FD2F9AA342D + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A5771528ABB14A7F4723D426ACD0630BCF + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DBE3B9107D989B27DF9F978F2C3844C8A4 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F297E028E30E4F53B780371F1CF7F27045 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05B39CAF8397940D5E3E28E62DB217A80F5 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0ACBCF911DB2B0A54977DB2F46F87DC58 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7E3D33C80DE3FE4B3A5EE00725E0F2497 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4C90B2164BA63D11EE2D48EA78C4DB7AB7 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD1602B9D7271A759FB4789CEABE7E5C7CC96B + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5F198338601A9ED8C2B5B65890482FAC4 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB9049CBB5C9FE2F398A60CA9CD7E861F3C3 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF8477AE1CAD2A1A54322DFA87D3903B8C43 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33256FD2CB32C417950BE78742DA311A7E + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBBD9715175DB6A739D1BFBA2ED53CE70E0 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C86EB507BBF3A44851E5A88008B8EB5D68 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4FDB1B3538092A7987E89A9C4A60E3D910 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780692B93811714505A742BD280FCAA5C8A + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF53852B56067FFA6828FFA385A1E9762D1801D + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B03033E050C4B1D715ADD636CB4EE4B2A9306 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED09B7E4DF269B05ED77DD65CF2CFC80BF9 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CB21DD5010F214AAE6AF65E045537223A4 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CF519B300DDF2FAC71294FC20EA75B57D + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE86648E1D1327D9900A39F2B4DA3F6E3AF0E + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96BAC194E0A790F5A9C3CACAF2B38031A50 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E7710294411EA50A4FF6F3992281165BA89E64 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6E6B1BEEE840788DAF2D97C72B39AF36 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A6263F7C9F5E307ECC7898AC5463F618E665 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F9097FA165FA512B77C119B9F44F59E6 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE937FD2E8613C6ED9B523ADFAA7F0D23B7F + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4C7AFDFF7BB2B665AA48A3806B63B553E + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C0175220696168D5E5BD2B534C68DC1899 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A55D194059AC56E57FB2BF4D8501E0B8D9 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B479850E1E948A11D7D3FE2A12BCD58C2 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A539E9C829B50AE11DA406D0E1AE3960E + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CC80EE5FCAC888384B4398E97A7E53907 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B2C539BE31DBEF61606526BC683520DE6 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F2C02AD32D7923E16206D902FDB8BFC314F0 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05BB7DE54D47585E13D638FF425DB5CA6CC67 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0EAD56FFA973D1537D86647F3476C431343 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7A495E8DA53D948714266389906A4E103A2 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4CA249E448998021E672F192BC47FC4F5EED + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD1602335D2F55B0EAA00B9575D1118327BAE174 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5C2B979450E85F45323C4B9917CDAE36F05 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB90A06151F8DCA29A71867F7AD9F854D743F4 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF849E70A4A61296B9454E2B956BA7D1B65A7A + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33B2FCC43406ED2E2A5FF47A732499322C3D + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBB0007DB5D1231DC641BC68630424FAF7EE4 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C87E64B29D4BAA816EADF4E21253B01F763E + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4F1DA0A49E44100DAD40B4D991651D50C540 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780FF023FB6729CDBA222D10D2B9CB998D639 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF538527DE475C93397F29CC37D4954E3471E2E0F + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303B20C0A7386CD3D428575E5D7108D6159A3 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED0932DBFF91B8D08FE58E665482EA20F726C + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CBC5D5A2448F7E80F149B29860561FFE1C64 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CD948391F3CFE2948EDB7E0F12A5B1D5676 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE866754CAE156DBEF2CBF26E7BA69B223C4EE1 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96B792F1020CA832C02756DE4F063525A771D + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77102EB3E137CE1ABD5AE04F7962B565B7D9291 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6B8EF79E61BAA16763262D6A8BE542227D + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A62627AB23F2A1975E41DD208251446E1EECF0 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F1E1C6A38D6B13765902CE21D9D9A810B1 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE93A79A79CE13F04B2B3120E4C43FCBB1BA18 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4B79AC9756019AA3B9C9E52C999D3A523CC + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C041C555AE45FF8AF0183C68CE905FBDE702 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A5296E6E67E19503955AB8FE8D166BAECF83 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B5D43CAB6DA8DDB4DCEE3DFCB030B0C3D1C + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A36E960811C3824A4322D4396DF9ACFA98D + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CECC6BCA83B3B3AACC8EC52AE64B3F8C6F1 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B8900BA5D208630737213E258B3868B168B + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F2C011834329EF723989EB1C8E613398D5F9DD + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05BB783BE60440826050ECE69E21D25EFF9E906 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0EA35A6C1D9ECDCE8C8C4AA91AD55FF8E0357 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7A46CB31004340E2F360EF50B74F5091B2FCE + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4CA268064C8B9167809ABD7233F80F73474047 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD16023334B7E431BD66B41DAD7B03F619AF2EB54E + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5C2139678D125B58A63430FE7B8381ABF8C6C + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB90A0B7DF0ECCDA2D3A6C262522842EB9F7D472 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF849E9DC154BDF1C096555F11DBD63EAF2F33DA + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33B27597CB395494C73FA5CC83CB1BAE4825E4 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBB0070787B832BADE64AC441BFD650014DFF8C + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C87E4F224636DA5FAB981BEB72E71A0945B778 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4F1D244E831488D44DE9B89FDE8F56A075B997 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780FF7F03F32EA5C8714E9AA3B99F0DFF6E0FD2 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF538527D05C6C8FBE18B0543CA771D6D1808D7C9CE + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303B293CD78DC04E9161A155603B79399B877FA + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED0934E5CDD79ECF371D2592A72BF4183DC1A77 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CBC5023DE8D8431D60481598D710FD62E1467F + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CD94EAEF84FA7883DE288038D2D4F38C0302C + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE866755CBDF842400D3227E882D01B8D05C3DC2D + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96B79A08D7B3D32310D2B7DA92E852C36B0FBBB + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77102EB9F529650B8B170C9633DB2236055725FF1 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6B99004CD6EAE717151036671C65527FFD18 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A62627CF046DDD99FF700DAD57E9F6DC2EAE2242 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F1A27D04E11DA91EC8C817DDB4E8CBD287C5 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE93A76BC0716A6B27FA79D92F44B59558DDC850 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4B7AC8A89EC572CDD829C857367F03818E880 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C041741AC4AF9F36B7A4C73BDF208EECF9E379 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A52994C73A87D85362B6ED26FC1219DE649DAE + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B5D7EB108028D41355343C02FD0AEB16BCB3D + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A36AE329C9017421BA1F351794106DDD98DE7 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CECED52F94134FE98B765B3F79387FCAD7D8B + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B893B1410B68C8CD38EC2F5F4D673FCBD9240 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F2C011AEB33CD92B73BCD51921B6D8B7ACD28177 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05BB783FD2F3B676A25ABA2C578FFC5DA1E662E7A + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0EA35847C559177CF8B3BCE5AA73F418AECBB61 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7A46CE58F5169CA927DF9C001CC74D57EF03079 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4CA2682064302CA4198619E34D6E5201EB6C11E0 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD160233341AD5E85C26903A33C37C1A0593F0BB79EA + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5C2133B48E120581981926616D4A491C53E6C87 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB90A0B786E33E6C73CCED600B3FF01D35D2A67BEC + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF849E9DB598A7601FCCAF139EF17AF15404532CA3 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33B275D601880D035AD1E3DDBDC3769F5E30EE8F + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBB007099F6D6C164328EC5BA03CAD1C048C2AA0A + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C87E4F657C94C5978541F837145F62B573D84554 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4F1D2432D961A432317651B74F5B3C80C52FDF90 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780FF7FD3948F12EF4027D839A7F769E4BB37DEB9 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF538527D059470230EB5BD28E4C8C325494C46369253 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303B293A7BC7870EE86B3DE524ECFC61FE95490A5 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED0934E1599FED621BF5A64F4853399DB394FE22F + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CBC50291FA8A4DDD7FFD1C5FE156F284A7D8A3E8 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CD94E773B55A28EEC364715C17B6540A424236F + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE866755C271E61D239FEFEBE71C88E6FEF4BE606E7 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96B79A09A176F28780E943EBBE48F97D0E9C7B78C + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77102EB9F63C6C6490995B0A71D9392DA725FF8D8D5 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6B99A1C74AB41D4E344B6214F89830601D934B + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A62627CF4C2E798B7D16ADCF4C7268D0A355AAA347 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F1A2D065EE366110A5F21C199EA2D98427AA66 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE93A76B5D4366A4A4708EFB1F37C0AA22B14328E2 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4B7AC05CB7BE2AD254A616E11F652CA21FE34B3 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C04174A175DD4C852A8535881F4A1430B96A95E2 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A529940D0AACA8158F720FE715D730F8257DBE60 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B5D7E896C919E007CBC00CFE901F5BA3E90D7CF + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A36AEA4095E5C1E70E0E3E63E868B77CC6930C5 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CECED3DF0E6BFDC4BC9B7ADE7B3387AEDAC7F77 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B893BEE878AF8BF741FB176BBA8C9CE8967D2C8 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F2C011AE849E84E6AA27C1F8411F5242D79011EDAA + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05BB783FDAD2E2102D2C0BF95DDAF4C0F6A2D89F1F0 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0EA358451C4D177A7206CD390B3AC4754657BD2EC + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7A46CE5D9585D1196515AED9F0A292E1B224559A3 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4CA26820C3912986381096CAA092BA842375032CE1 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD160233341A5AD16232B65366B673B1292119394D07DF + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5C2133B5B447059ECC5545C59DEB6E69EED273BB3 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB90A0B78678528873675705EC50FC7334C0F01FAABD + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF849E9DB51F4CE603F1027FD905409CB59ED28BC630 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33B275D64B6D728E1161DBF2EBDE8E58B76B4C4F2D + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBB0070990A44EE82F80AA1D3C06DF8AE4B3CE63DAC + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C87E4F6595DA69D74395DFC1D3D3A94FF9EB34B15E + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4F1D24323E0F9C02389070C1068A9DBEF65101D4A4 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780FF7FD3E8CCA38A203DA4312FEC69FCE66C11E37D + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF538527D059422DD590229CFADB791B0727F743B2C2ECA + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303B293A718A89C7ED1DBC5882C0FDC62A28F31A849 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED0934E152C3BCE19350FDEFBCE851DD35490EA4865 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CBC50291AF29B3D4E5EA27FC27FCED907DC5E6CDD3 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CD94E77C19D1A20EF9121F74DC46BB031F1EF9942 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE866755C27C71AA2C1DFBDBB4E316218110BD7D1CEC0 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96B79A09A55C0AC253063B0E1898B2CC60C9ED7D269 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77102EB9F633F7F41EF13DA1023B3E74453FAACCF6A47 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6B99A17C6BE85557C0FC2AE31C24E56630F15C76 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A62627CF4CAD4A331BC1A09349791B3F9EBB065730FB + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F1A2D0E8A7B6EFA09A6CE41A03762D19158B1277 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE93A76B5D0C008094A73DAF1766F4465EA8049E0FB3 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4B7AC057913F066D6EDDAE7F1A8FA81339D717E5E + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C04174A169F48795EA264B16CEEC3D5E5F5ABD6BB9 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A529940DAC7DD1F9E06EF9927FBB330DEEE674C4A1 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B5D7E8972F64B2B08CEC19FB5DC89641A6CA54FCF + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A36AEA4B16D2FD73976EC4E4F5AC9AD29C1D18AF4 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CECED3DCD3A64D6407B89DCFDE4D03CD27BB31495 + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B893BEED64DAAAF814B14BFA5D3DB7BB8150A7AFD + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 89A6BC509C2FA199469F92E4F44EC9AC0CA94C5180BDC12B6507F2C011AE842519A073B121A07F9C85D86B7E5E1B621C + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = CBF1A8AF0311E992A7410E6238D36508C58C922755D7212BFDA05BB783FDAD544063DDB220006783AE86E7550D1D6C60 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = E54B761E4A8F0D1D94D92F149BCCA21A72CB58D4D3D60D43B485D0EA358451589FA4C15860BCAAC29D71DC55063E8D54 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 8073F50326B592E5922BAD631EE5A3E34BEC391060F3DD81FEF3F7A46CE5D9F0F630235D028C510D0CD8D785A9748CF9 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 9F3F6002F89F5CA2B48DF5300D06E4E1069FC91269F26A9DD88D4CA26820C3967DA37EAC13B5A4EDF635C8F3FFD39DC4 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 1D07AA1D70FD65735A2CD02305D94CE8DAAF5563A1C47E75DD160233341A5A70579BB463AC6B12BEE2E8C870C6373B6C + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = F5941EF434BCE8E38E63F5FD9C29D5B730D3CA98871DD2DEA520B5C2133B5BBF6BE399C7FCE31D4B67F01A9A9D1C975D + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 3E59844D00E1B3B13E8E65DB34669B94308E9348DB97F1510CAB90A0B786787517167BD05D87984B6508725A5E729FDC + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 15D3A591835795973858CFFDF307BC173845710A46C616C035AF849E9DB51FCADD4CFA88485F3932286CE428AAD0BC7C + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 39A67BEA2BD6620D0D466558161273B700F893252B55ACC198EA33B275D64BA1EE7E1BBFFC73291EB646FC02FBB0F625 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 495F89651B3460E65F003BA766C5845FC02E3B629FCF8680D3CBBB0070990A49AB45EA92A6663204D9A42D02D9ED2F5C + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 84355B90FCA6CC96DB82A967919F4A90C3BA382DB3074CE42C47C87E4F6595E372E2D628EB160E612D2DACCB50CA2764 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = BE57E3035F3121F1071DA155CFEDEDE8D7741A583C5C9498159B4F1D24323E6E598BA32C3CDDD0B46B4A46CA4EFFE7E3 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = F2E67F043069273262C42D9522322AA4317E00D113636EDBB6B780FF7FD3E8C43EAC44997404DBD80AD4EDDB96C3A1B4 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 26BD543E0ED9A9C7D06C11353B9969108BE56AFF6C3C5C1EF538527D059422E03204F80949392C6D0D0203637FDBAE45 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = ACC9DFB104957F6F5B61F44EE0C8699E2FF5B6F4B2B6CB443B0303B293A71875E7558BCEED9C4361E53F8BACE7A3B8B0 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = B5604DCF9517E3384C47714B3700BB7F3D40E66DF97FE1D99AFED0934E152CA74713E91D184E479F6E425C8C6EE0A2A8 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A3DCE6A36D4245193B10BD96D968374512010AD1717DBA7BB034CBC50291AFF342F8384B0654DDCB7EC36E0A71E3ADB2 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A3716FAF5CE05AE0DB7A87E3F093413F05F928417666A5CFE8688CD94E77C19A81DF8DF304EC4824B63E9067F50C99DE + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A8844FEE475A9B10ACE25F7D497196D90757C10106EA2DBADCE866755C27C75B1A7094D2D210035B7D7A5CF32BBE6E3A + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECBB638503C559753693A570DD6E971DCAB927BE34A1452587E96B79A09A55BADFC073A7E8D46A55AE45EEBA6FB9EB30 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 502CE5C9F6B61A277324D953B68B262E37AB733ACAFC5961E77102EB9F633FA6BFCFDB404B5F61D851C61EAFFC659780 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A85B710074776A79954E9305A94EFA7ED2E4E7967443E8FB8C1B6E6B99A17C54AD522C7B09D8A0FD2F4F5C233B33A4B7 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 64A76E093101B4145E1F1C953633EB133E945B1DE753239743A62627CF4CAD181CFB80A0149DC9A4E5EFA4976B390F71 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9F092EE04EA80A598D87EE1D359A5DB71A35BC351D69F73F6B8587F1A2D0E86D2617D1F3B17EF10A096A3FFB7C3D161F + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7CE77BF23E72AD3CB7F3C0D12D82CDC9E5BBB145A3EABB67DEEE93A76B5D0C668A59DC41917DD1D9427F2CECC73AA527 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AE5C18C2DAC4C66356197960539B94705DF1A740D249CBD28C24D4B7AC0579620578E900A9A7D489F6D37FBD3F9B3811 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 58670DED3A0718839B4B0C602EFFAC3E885C11546449B80B2532C04174A16959F85ECE5C0B2D4386C45F51A49A8CEAC9 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8E3359569770A9A49DCF7ACAF4E2E950AE67B59982F11BD94230A529940DACC07249D049E3A8AA32949C719A06379D7E + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CBA5AC3E706C38CCB7F9D3C15D40BE09393D3773241449D435D41B5D7E8972C4ADA6708ED83BCFD3C856F87A0900783E + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3A47EF6DC17B5364E30F0AC65F7B45F03C429302E27597B1CAC14A36AEA4B1B0CA5D3AEA0875CD3184C7681AAE6AE531 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 91995B95E221DDAC69161C9DD17293349C5739663B0F193111A58CECED3DCDF780D0ADDE739814BBEC0D9498824E6725 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 64BCEF8DAE0A00AB494C06752052D3D91AF0A938A117EC02C6DB1B893BEED6441FA8D67F5C20E9B50D6B7FEB1D07C91A + diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..444a0c6 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n1_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n1_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn1v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/LWC_AEAD_KAT_128_96.txt b/romulus/Implementations/crypto_aead/romulusn2v1/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..2f55446 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = C543F9D547B68FFCA08FABBD9983997E + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = 99F599A3361F11E971FFE9073EEC3344 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 2B03E1BB97BB9AFBFFD84FC5FE6FCA01 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 0DDC3A18751EDBCA0958EC8A3E8CF5CB + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 0D68612ED24E72A508F61F1343F4DBB7 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 57C5D787455A51D8AB836A985ED05F0C + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 4ACFE2DA8FF158B91F59BEA9BB219115 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = A17547546D9A5D704108288FC22C9992 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 6E8FF6DD9E92436D0FDC7732635CEE97 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = FE0D8754DA146FFEDF1CAF77FF7A01D3 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = DA906645C5BBF0FF894604C6F384437D + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = 6A451C42CA8239BD25BFF9B41B05EB1E + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 96B3D55B8386B1789A198D84B80FEA63 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = 3E358F70CF0C24C1AA10BE62D374771D + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 079B85B78B0D9B7B3F82C05A0D38F478 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 8DCDEE8F83AB434A1DF7629B759D3DD2 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 619D4B54B8DA2C164D19B20A6AA22B62 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 05DFC578A15D27F4FE8E0DD3D2ED7640 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E18E486A598A521309A96F0A610CD65D + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DBD35CCF9823385A085F263654055BDC + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 91B4DF856EC2330A6BE249F2E261875B + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9EBDEC1724DC2100F7DABB1B12E14595 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 2D3F55B5BF7ACBAE0ED40DD8720D7DA1 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1C55DA577512A77984EE60C6915797E2 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9478877A1C29F986B4EB8A2F50CD1496 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 2BB4F1FB6E7CE907E6219B82DEE13806 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A07EC49E3230F61C7034DD7C107F7165 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C2FFB276FF8312F0835D26DCC37CB1D4 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4DFC61D2650F0A5726A42E9C94910917 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 948556EFE394D60581EFBDB61706EA03 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1A29D67F8805A68F77FB8B3B5CDD8C4B + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0022E10AFDBAB85DA2743E0B1F570511 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 78D90E0F6B106712C708C5BC415AE098 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = BCB8819AFBD5C3B118B254EC1446FAB366 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = B1EFC7AAF6ACFD436F8B330B0388251E10 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = FD338B27F24E85D9AD4EF503E619C84715 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = A26652548EDCF21972A7FCCA4DA366D767 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = 3E07CC440CABD8CED4DAF5D5C5D537F58C + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 7E8DEC3790DD8BDE0194A5684A63C7572D + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 1A60A320769BD5AD2AC37576E9956DF32B + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 1FF2E69469BF0EAB606B543D3B729FB301 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = 86482F44AFB20E21A1262E47A2AEC28119 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = 587872CD5F085E54247EBA2A35CB23C751 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = 6B0CA14D0ACD0D9872DAAD15AAC62DF31D + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = 5B73CD55FECFB020AB115CFB8AEC718B6A + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = FE6BA807BE8BB04ED5682A80AA36BAD6E2 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = 02C5D6A3FD7E5F363094385E8BD9C2BF76 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 6880361FD028535C5EA869D6EA1CBF807D + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = E4F367AB177AA08FCB5C0C62DC7618BA3C + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF8F16E138DB369E723175688C1EF3501B + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5402EED71BB123E0D039DEF19421CEFE44 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3664359A97C225EDBBB809ED5A9A01166E + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C1F9B5D101871F391C33969BEFA8939E6D + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 014D2721412ABE4E859A33212572F7379A + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FB19AC89185C63BB711395076B4A938AFA + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE8567043C48B971531BDA01A5AE5CCAFF + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 955668803EDC39D5676F055432E04494BC + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CFFDDED5502E94639EFF757B6ED4C7C21F + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A56F5BB57DAE3C18C2C1EA6FB493A13819 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E24489ED97051E7A62F7F2ABEC9DEF41F + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB6B8BA451DBDBCC51196DA106BF8EE308 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 549CBA0327D6B0964B472585D14E64B6A9 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 221EE30E6B04624FE9232D7285299C29BA + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0553FCCA51C6C7427C9CF3E6F5BFCC1710 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C0878355AC0D394CB53F93499C3F2E68EF + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13DFBA9400792685FFBDE1D33676185BFA + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = BC737E3A48DAA7E0EB32E3FEDFCFCE30ECC7 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = B1A8573A8DF6142D49756B52707DE6239BE4 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = FDC9AC573AA4B7BCD8B4F1457E954484FD84 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = A2EED9BB3A9F883F6258092DF0D7C8779BA5 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 3ECF602E68E5F3DDB8EFFEDF9C058D1A7B27 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 7EA0B8A59B28CA1367624D104E555F336485 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 1A94912F7285DC5109D4ABAFFFAC36325A48 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 1F6DD0EE6138983A9328ED379ED5965405CF + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = 86A0CA39E6B3E646B32EDE877C33A0C219E4 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 5840356DA3E76736F7D9E4A658927F86D9A3 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 6B74877F8ACC9214316C487A6D5C2C7026A9 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = 5BA13728D2CC5B1FCBD6FD5830B6F3090C94 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = FEB663714E5B6DD53952D4B196CBACEB10BE + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 0286879A8149CBC6A0718A93E7981FE03296 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 681E50DBE7C22D441565E03C5FA6DE8F3B2D + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF3DA4DEF0778AAEBED0C2297B7FE3F0E + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0C14698DD0679F6F0E29C6B7C273AFD751 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 541104932A1EE8D6AFC1C64515B43C8B175C + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CED7E4633988ACE3C23F3190949EE127C8 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171B5BD878EFE688E9ABD51AA900FA4C3C7 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E45F06A0F9098AC9A0FE8FABE4EEFBA3AC + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAA63D7D7FCF59B45A4040ECFD92BBE6ED0 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6201647876244AA2A23AF9E2752EAFE3 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AF6205A152FCE12AA743083E6596406F4B + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FE77114811C119A6691C3EB401AD771D3 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AE792AFA7D8FEE63CF8FE646786C1C0B16 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F0B8B4FC2C12EA679C5483D4F12DBC229 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85FAEDEEEE33D99998593999D4754F7B0C + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D2CE9D083D06DCF66BB80084F4F03D673 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 228474F21E2D79F485D0D9950C8EEB67CD1C + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8272149DFD9ADC98D443DB7C015ABBC6D + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C01929B1685A438F696074DD42DDD42F9533 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B6C13DDD93EB478C8AA03E740F104628CB + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = BC73B148EF4F566C2DDD8476C7D7674A14EAD4 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = B1A8DFF1B83E98806E92DD39AE8BF93C19C59E + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = FDC95789049E490F4E0E6531C709B46B5A7322 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = A2EEF1B7299AB8890B4727FFA7046CCA6D7621 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = 3ECF2CC348A9769DFACF1A7CCADE8D5740B0FC + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = 7EA0A6FAB184D368A331BBE19E46AC71445667 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 1A9471D7A7E5FB69155CB5241E01BDFA1886A1 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 1F6D4F81F656B21CA691C8AD4C660D082E16FB + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = 86A003EB2B17B4483EFCA222EEF15C393D6304 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 5840C91F07DABED91063CAD103E56A1ECD5674 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = 6B7449BA2889FC8F5C831FD9247961EBB6FD57 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = 5BA183D97CC14E5A28A2A5FF5D8D25E91ACE18 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = FEB6AB5F16D9D058822C877EF94ACAB9F1EF51 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 028697C32D4ABFA1659C58F42D7F57A041DDE3 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 681E884BAD7C149A6C3E1D708B114E347343F5 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8DA3BEA2A4133C19CB0434D9122073CB8 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1CF54C75720D2119D7D32D4254691D703 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 541111E3006B3840324F89775826BFA1E7BE71 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88D3D950D7AD270BBE0F5AB20E5DEABAC9 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586DF5F47C9EFB71883FA543A82EA97284 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E474633C5E40C248BE4BD6D602BEBE9EA4CB + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC5F273352A545CC685E8A8D3C7C6F152D + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FE1EAF662A543710938F6B79FCBDC56B7 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA23971C95F1BBE555913EC7F46A42F565E + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB74F6DF9C2F08B874F8BCADE5D6CFBFC5A + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC9001D16C21E1069420E198051C119A9AD + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9FCECD92275EC75BA55DA2A26D03EA42CC + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E26C88814A654EC0B43DEAC414E4A5D580 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8CA7379E8B30A6766D35A591970405E803 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284614FBA1CB02A6CE48B96C1453400F9DB53 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B00E64238577A0219B003DEB8C4CBDFEA0 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C2EE6BD21855FF0E14C8BA780FF04D52B1 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B62511918C2D7BAB77BD7633BF664D74845C + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = BC73B1C24E29CFFDC2E7ADD32A3BC5D8B10B9F1D + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = B1A8DFB12CD1A86F5ED8369D7A455BE0B8994D02 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = FDC957619A541C37B28E8A6191DA16682AE01368 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = A2EEF13F17EE3740342CAAECBF75380CF7BEEA75 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = 3ECF2C0BD94BD65849A58255110EBD6DDDB2C45C + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = 7EA0A670FDB46BBFDA06E7F1467B9AF16F9AB387 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 1A947165B2802DB081F793363C8DB3F7533195FD + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 1F6D4FBA724351929A4BF1DEA235F48C011FBCDB + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = 86A003A0186FACDF166B076BCACAB6BF8659CC1B + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 5840C9CD1813078CBC62614CFEC4F8FB33C62487 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 6B74495424C8840E1518893F33B34A01DC51BC16 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = 5BA1831D7D5AE50BF0C703A4C9A1EA018A433E34 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = FEB6AB5F46BF80269077FB24AA09EC8DCBFDA2D1 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 028697CF85E050846B652B8BBF129C3D355FB344 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 681E88AD7A5F9D7CC65330A31FBC4E9F12746176 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F5E24E6E823900A43E3B7A634BFB5561E4 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA111A3B70DA0D9A48DB9062EEA4896CE70A8 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D8802DD780564F3E1D7A4706F8D69A7FF + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC2AAEA293CE4C7C2308AD0EEC7234ED50 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C17158652091C8EB9C2077FD8FD16AE1C9394CBA + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467301ABAA25D6AC2BACD657303FA0C2422 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC6482D91C98024D80CEC8D40EF49864D477 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA46853BFDEBE6EE6202318AA209454BD7 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D7528CF548DF81B79202229F5E8EA64BC + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E7588D289A29CFEEA51F63E6DBE20A7CFA + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98A7F4D720711BFF47400BFFFEDFD6F6BF1 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B0DC41A25D26328D5D16AD1D90010EA83 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF54D3D3450771C4092B38820266A56E7A + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7BD242C06190FB0461C2782206BE8BE42B + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C3F3A9A1ED2D769A13F01336F3D7286D3 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDD5DF436AB434EE1B333941A4855CD6FB + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C2961D69A7D9B24A03407AC1E8B094C1B3E1 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5DA82C3A0BF1061335B6703D1946314B6 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = BC73B1C2F36370F828AC2068FB01ABC0DBCEA16208 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = B1A8DFB1928F88B201A006E9F863587B092358E35F + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = FDC9576118A65ECD4354AAA7F671CDFD40A607E4C0 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = A2EEF13FA0F94CD8576F507483077E6F905532F0CE + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = 3ECF2C0B16C9493177C2946151EBCC0CFD52281F39 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = 7EA0A67026AEE0E46291E5FAEABAFBFB96A394D10E + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 1A9471657219911946F30729281AA4B895653A0FC8 + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 1F6D4FBAA55F828EAB30B1B3BA423784B69624F45B + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = 86A003A0C555A889FFC37E5BCAA275FFA75C32CD80 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 5840C9CD518576F76115AFBACDD56A53C260C059C5 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 6B744954091BBC5749A2D5355A42920AEA651BDCED + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = 5BA1831D48BAD01E9C5B47BEF7E309C951C030D681 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = FEB6AB5F16612E4AB60D9B745A90EE54B1DF072292 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 028697CF28CA7C89C1F5DEF0C1AAE4B794EC487B98 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDFED66ED9779418B07B36AE061372545FC + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F5570EBD84F6D4B6D70EF1E2224395141C3F + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114FFA3AD0DDEE86064AF0BD946012F2A4F3 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D718AB3E9E8E1554FD9D2AF0E30D230E88C + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC5702D47F1F0FC42F5B9CDB8D111E7C39E3 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C1715865997A003118DAE733512F0456FA451B18AA + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC7216F60737E9C2AA8368BCE3A45C6847 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC6494F1BA2E7BB84D4D5610126317B92137A5 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D742117883796A8784EC45C7540C96C7C + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D9D022D00C88E2132C3DFCCB837820567 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E7386AD2E54021D4F5BC238C54E8587711A6 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA8EEB3D8696C4B2C2870D7DC69CB32C682 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B4532434E7BEA27878805C10A4F435C2A9F + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF033796C270F8DD70B907695656457FCE17 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15B962C8D59674DD8BE0008BFB4C28B3E0 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C476E4D01491EC0A46B62CE70276CD7B8E8 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB0B9121A407ADE4209954F7E78A73B6C88 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C296038332FF15C5168F20794737FC00EBFAA3 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4FFB0824961D17AE71386DC3B432C7A83 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = BC73B1C2F3FE1861CCBE84668A60DD6877684C65440C + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = B1A8DFB192FA84A6B3E141B117CE2100B87A7D724C13 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = FDC957611833C83DDB7B55169C1D09B1244CB74E0136 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = A2EEF13FA0EA43C542E76E5BB779CB83FF9A7A673246 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = 3ECF2C0B164E6C7D62A3CAFE86B39E21940425A78AAB + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 7EA0A67026AE3758F2B070A5A5CAD6E30DACA8B1C63B + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 1A94716572303040F45986A6A9D19AF83529A1B0870F + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 1F6D4FBAA5952543C296DA1C2FF88B8707DB58AE5B55 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = 86A003A0C56CE1A2B043BBF52458E560F00EC9D40AD4 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 5840C9CD51285F42019151D2315865C150E7651B1D81 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = 6B74495409117F4F37A882FD0187163C07D6152DF596 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = 5BA1831D487F15ECA7B599DC777FDCE0E6D007BEF30E + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A467D69E5C729BD6052A4A711C0CC960F + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 028697CF285B58E8C24AA29713C41E19D852CF914FD8 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF414B5E2BF90B9E88D858CADD64AE980D49 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F5579076D401E267464D1309843D302CAD7B39 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E80A055A80F18D870D4BB1EC7C58CB433 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71AC2D428B7A5D44B75569159D73667C0563 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F99A60E14B9793ACE50AA0538BDCC49924 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0FC4DB57911E3F82AE9F54C770B6303B1 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5FA856B9D32F4A1DA224AC49C09CDF4630 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496E66AB5E4573E1097B18D7574E31B6A94 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E3FFF5CBFE10067EFFE725F3572B672ED + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8C6DCDFE3D4AC643332005B7DD0D8D32BE + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873973304C20771F346D5E5875F7E0363A8 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860D84F235AEBFCCB0E6F792EA0035035A9 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB8B88EE6180F0320B62413B7581C2AA77 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036ABC976602396B75A961EC1BC23CE81197 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15741BBF9DEE311E33AD6250CD31E484C034 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C47444AA6EB605B1E6F57FCDCD45C58D7F18F + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB0343940B982F5EE257785B6115A4DC3F0FF + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C177346887761CFB014B3C9DAC979574F4 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF52BB7D8A88CCA1FAD88650DBA439F17E + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = BC73B1C2F3FE0C8A119DC8EB2006C09BF4EFEAC883B7C5 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = B1A8DFB192FA2C9B882BB5A1BD3E41388D3AF4A673390C + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = FDC957611833EC980BA62EBAE1DB3D5F20102A5E4BBD08 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = A2EEF13FA0EA16608D346308313B122286CFB3B5559FD0 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 3ECF2C0B164EEE34C2140C1C8D2E40771B570B0C207446 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = 7EA0A67026AE73F721FC06F5000EBEA295460B9CB7328D + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 1A9471657230C229576B97C2843E295BBB28DC584463BC + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 1F6D4FBAA595F10CC2F555FBD102CDF053BCFB044CA354 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 86A003A0C56CDDD39EC8EEA5EF2CF00A0AEA7E833F7B44 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 5840C9CD51283B537C39A4D4282BD443AD903C1B882C2B + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = 6B74495409113A0CCCECFEB8243BABEE89DA9F3D5F6F9C + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = 5BA1831D487F8EFA6D026EF5A0C895712620CE43F0B983 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5779902177882140EF8D0227D058F090B6 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 028697CF285B4635B4A253D9A452E6C146BC17C63022FA + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF417873AD44B477686423A78DE8135AC03D10 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F5579066B2DFE647B256590486521C9B4FA2A554 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E00B6B486E4F42D5CC4E814F5BC9CC80FAD + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC54E993609BACE6AC655FDAC45EB1E111 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F9482A27BA5E2A0B4D7774B21CFBACD44842 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0291BCFBE391A76D208BBCDEB1AE4A7742A + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F8139E949DB80BC92FE6FB4B9378AF72D16 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A6C0095EDEBF24A17CA63BAD3F9D3B63EE + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CFF82B361C76DCE703BE3817C78EC8F42 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEAFCF2929528916D3C898A2B7784B6210A + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BEDB9A6D88BC4ED3853A646608024CF0B1 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE9F5B626135CC7167C77DF7556A92C0BD + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9D3469DD24FE1B2B3703A4CDF242CDCC45 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7E9E0B1DEE14616DF028CC414045563A0B + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744BD3B185363ABC352D63FD4C339DA6E49D + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BF1B6CCD512DD5D2493933FCC616AE67CC + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB03495C5B311982ED379F547F3C6922F981EE4 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1652360795697AF19817D95A4EC63D4F7 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF9238AD49E129C32DA4CC49591FF0FFE760 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = BC73B1C2F3FE0C59948552C8DE953CB1E3E08CEDD1BA5F6C + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = B1A8DFB192FA2C1BA0E9EB7A2FA1F91AAA1189B654458494 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = FDC957611833EC301897788BAE70ECC2B672F133D9B700D4 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = A2EEF13FA0EA16BAF23CD117ABB6BC88EC6E6E5AC07B47CF + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = 3ECF2C0B164EEE0BB9891D2A0325D072D6017DFD1C0DAF6C + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 7EA0A67026AE73868602786DA30C7456861B9E9949FB9F7C + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 1A9471657230C227D6C5723DAB0014309F2421441459800A + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 1F6D4FBAA595F14BCBA306C366BD2D987F7C00296B37DECE + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7EAE5D87D1081C2289B2F4CF370386DC9 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 5840C9CD51283BD1E079C98842EBFF04B82162EF4625249C + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 6B74495409113A9078C89B0B041A3D903CED91C62D5A4581 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 5BA1831D487F8E2481C5CC35C31E82C6B0817A0202DD998F + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792DF340DF4CAD06CFEB3BD790766875C86 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BF35586C7E282A2D311BC5B61BFC6237F7 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178133E12252A49A3600803032938FFAB0BF5 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660A21DFD9F8717252741067CFD6BD1051B5 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E00513FCBCA12F4C9A7866E89C4C8660589EF + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5DCE1652636EDD9555311F7873D56E21B3 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6DD6BD49402E80FBDB83DDD221399B6CB + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C5E2D211F78FBAC902CF350E3C77CB466 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD07256E918962B2C2A1EC80BA3786D2F4 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F8475022B61BD16530E398C6BC88C28F + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE720296EDF39A45E0E076332CF2B80C71E + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA688EF347A6D6FE0D1BA5A4BBAE47000262 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A84B266AC7514FF26EF3AFF5E43718D43 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE1759CF517D9D5CCAB7B24EFFAA626C2009 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC42F6DAE7079FC59CD064C6A3F704C8585 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE1300294BCF07E2CC0A3A768AA9C062379 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9A059EA450CE27E060DB074DED02E2DED4 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1C161304FD558A4F42D8926E7F41AD2EA + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954EF8AAFD7DD7BDF979ED378837E8FEAC33 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1EDCAFE6839B1782E71DBA2FC347E8255ED + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DA237FAE7E2180F716509958D83A2484E6 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = BC73B1C2F3FE0C59A36A93578573783993EA8BC810F4129261 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = B1A8DFB192FA2C1BD9C39E3B0F5DDFB3E690F07994221EA5CC + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = FDC957611833EC30515C9923386955D43CEA80D5D80F2F0D9D + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = A2EEF13FA0EA16BA674F7E1667CAC85C31D41BB1253640AA4F + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D94E827A3BA0D0ADFFC3513E448F01607 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 7EA0A67026AE7386204BD27E1598E19E5BF83EB0719463928F + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 1A9471657230C2272CD7342800F68BCB53360A6A43993BEEF1 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B997986D01E3C077100D8E99C83F048C5C2 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9437D59BDE2BA92AC392DB0B5451AC4EA + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D915C2DC46E37B58B9F59BA8D218CAC54F + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 6B74495409113A904D0DC41111E7F062366E2C22462B1CD7D4 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C7B5762C029C0D5B08774565B555E51F3 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A8A5D2CB7C789E148562BD8C8C902E1911 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA86B4C502746B82E53320C13AAA2F0D08 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF41781366EFFBD46DABCA396743589820FD6D302A + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0A34C2E0D81F896144231523638FD3008 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC175D3E92EAD1FD4B35131C02AD67358F + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A79BAC9EDE22CD229EFD1CA6203DA986D + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D85AECDA62A6513EB4D34A227CA5517531 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87E53B7209F1FDC5B15675709F0DD1356A + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD2262BFDDBAD26BA3E9588D6F2E8B57AFFF + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F8BFC549618494EC0EA8479CCE97A5DEAF + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C17B434AFA1017DBBCFEB1FCB2814AD63F + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B269B586A42C5D8EA4EFCAC9212096BDE5 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A92E2FCB9C185CE20CAA43411A8674042B3 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F0CC8D1ACF15F971D083A792B520E43669 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DF7446A8F237ACDCDB26F8332AAB71AFF8 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15FEFC83FDA0B4D563C57D2892369D217CF + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB08976C0DB8D4BA0C6C75D61280ADBA634 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E3B99733EF4A3FEC17EE62FEE4B3647AF5 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E081C6544446179C70417FCA3DD64292E23 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3DE1E25E542B8BA952681B043CB6847E40 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADD91E2EB94359F3397DD50EF532735373A + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = BC73B1C2F3FE0C59A329C5B54B86A65132FEB8F159B1C2AB5208 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = B1A8DFB192FA2C1BD9789C8DD7CC31435559E416A3F9A7878798 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = FDC957611833EC30511CE5BA1C9893F0960E34DEB1D8EAA9A306 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = A2EEF13FA0EA16BA67E648CA515B1143F4517FF341961FF8FEA3 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D65E207FF29631230A54420795A95B65F6B + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 7EA0A67026AE738620E3AD8D50D59324B1403461C1BC02C7505A + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 1A9471657230C2272C41137618390F81DA6FC41B8C6F4105FC6C + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918CC4F96106A5520BFB6E4195CB0F298DC + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A985EA03C55961A5113FA45058E8A671EB52 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D909E480AE82867A6F43F36CF19A3FFE922E + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 6B74495409113A904D45C67B8A581BE9EC670A4B0DF522235D24 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C91914227AB85E7C1D5D8EF6B582090C0D6 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D89288D4433D2BE450774BE06F40DF3D6 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13EE1BB9E6E50E172FF51BA79C6F065994 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF417813669390F893E30AA7EEA3A16E2CDABD403803 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B71D8E07EC173DB6B5DE2EB8488CC0617F + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6EEF17089E8A3BD1CB8C6AC08E655E9D85 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A103A4106275FE795F2B22A2DAC37689F34 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81BBFCC5D88263BD4DB486D53F4B4F36ED6 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A39A988E74ACF02E9A66965619F2BBF864 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224E21A1FE5606ABE1792B289C0D8BA5AA3C + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85AD57B10F55326A2B4D22B76B437B4E4C6 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C1753876D84FCC9E64F6D68872CDBB7022E5 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D4C8960419E2CFCCF1B89C2246166EA02B + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E07F2A30FD158EBF8FB173E54A97C8691 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F008B5EFFEC8CA556883BD48AD48789335AD + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA413F41F7EF40836626E49AB3C74CFE74 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F498B1CA1E2B403E5B60A83AAB2995BA4A3 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0630EB911EE97C486C332394190D7F253B3 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E362096F0E7933B9A0E48F2F5CF2D7367C95 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E08531963D8A69D4134D074629BC22D323BBF + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94C423BB33CEA44114A40934C23044F318 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBCE73D0A53DAA1AA0051B6523B5F1EE20F + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = BC73B1C2F3FE0C59A329415D418E6A98AE8B176895D2816DDAB163 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = B1A8DFB192FA2C1BD978DE49263CEC42DEA90C0A140BB2AB769B46 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = FDC957611833EC30511C58D561F80A21E851F0DFF9FD83045721FC + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4B6B68B061F88F783366C9908AE84B12E + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C4B1F1B6C138FE2B54AEB5465BC4BF16E + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 7EA0A67026AE738620E3693D86F40AEF6292B3BECB966F73EC9C60 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 1A9471657230C2272C41927F22D069F9420C5C146BF6C8CB8A4C73 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C0944770D029C726E54208DF2F3CDF3985 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853A5B5C2512AB918659489EF53A2933137E + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096EE7C57A7D59E828D053A47171933B8DC3 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 6B74495409113A904D457353A2BA143AE5199592460C6482FEF7EA + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C91935B0976CD637D8C0FEE0C7ED3B5FC06CF + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A42F7D398DBAB377826CD120B93A08AC5 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BC58EFBC6D5BA3F5CBBD091C89222BFEC1 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD230A5BE105CF6D6853A37D6B8746E83B + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F30A81CDEC3EDF0EC5BD690CA02BFE24DA + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E3401081EC512E3F0168E9778A51D530134 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F077C4F163CF06E2C7244240706164DADF + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B209A900586EED52EAE21CA2A2EADAF8DD5 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35602014123F533864E92137F8DD492387D + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE1CB106DF92E6520D0125D572F4A856028 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A5061E82FB2563274BA5FCD9383961BEDD7 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DCABDB8CF623F2D9269B2400A0EDACCECB + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46D05B78D2B6A2161D95981F8D5EA019EC7 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3BFAAF02263379C35069FEBFCED6E57BF0 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838562715A1ECDB1B93073B63E99199188B + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2CF725B21DF3685CFD686996957D837DB2 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F4954CD12DCA17FD376A67A4969DC72F144DA + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638A0777FC495D38A3987A0D0BB80E4C0F4D + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E362854EB71886274B88A4B00A225DA84EC6A7 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E0853898D21191BB224D466497D7ECC53E1DC57 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA37972B57849868071038826A64B84CD6 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6BFE1BA1CDF0A6C602AD0A96E4C6DD85F8 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = BC73B1C2F3FE0C59A3294171F08A9DB4AD829896D18836C273B9AC5F + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A00AE5BA0572CFCEF918C5D187D163346 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = FDC957611833EC30511C583B46F7B96D284E3DA0CF1621E72EB5B0D1 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E411B53C3B5B58A67DED4FD031ACBE8AC0D3 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5270795C1379EEE25E0F18D46057683061 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 7EA0A67026AE738620E369B965FEB54F99BF1E1D5C23D49BA51BA0C5 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 1A9471657230C2272C4192D923546D0BA81FF0157BE08C5D230487E2 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A6E93334C74EE85A8E4DB8AD50195BE8B + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA77DD268037F77E87B11B0D873C2D04EDF + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CFB2B3EA1890535CA9F80B002310EB15B + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 6B74495409113A904D4573ACC6598CEB5A1F2986D13E21BCAFDB6F97 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193399FC5A10713C63CDB6BE6EC854E0D62B4 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6B471C389C38EC4688CF80DEFF98A2E818 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECD295250F2E35344147EFFC4F9B187929 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3D2DBB5651084C6C596173B06E1C87D8F8 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F35185515B4550F73497DC0D186B017B3157 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F50F24A549906C783B8DA27854ED447DC + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DB045ED5E70CBC8373873A0BA745000087 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC45A59A29F113043CEBC428A5DD78A1E9 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673C95F248D26C711133B37210135925986 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173380AFF6C33BAB43DD774D5B1701B6CE1 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500F17F6AA4D5165D8080E514FECAF848973 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC6478BB3BFB6FDA2D04A27FF0E019C018BE + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5920FDC3E878920653A80185B8F9423FC + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4AFD98DC57ED638962D16022273C2B8747 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6630A92FDCD37286CC56DD431FA05C2E1 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C45994584F24F07AB4B1B9E6C795A15B39B + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C4A13C8A7A2418BAC066919F381BDA9F5 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD78E6835E898800E4981A888D7DCDE4B15 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285ED574FB3A90C2D9D3B1F5A4F89D7585327 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B69268A708ACC13014621EF087F6A4EB87 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68E9033769EC2D286096E1CB038ADBF571 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B70E01E1DAF857E8890AB0E772C007D72CC + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = BC73B1C2F3FE0C59A32941714414FEBEB9629C47DE35052C89DA2B7081 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C36DEA0CB18ABCFA42EC96AA30B5A95 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = FDC957611833EC30511C583BF39599BC7FD198B7AD9C565340020990B2 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E411872F132BE4A9519C38CB858A80668FD5B6 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207E5E55AF1065F06750170D134450E1A98 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D0BF0E67A049C5526CF40F1FBED80885B + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D1CF4D27E7D500B42DBFA1078809413D83 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5A77467373DF855826D187C90C2EA3EF5D + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F96A897C61762F22E2D3DA8938CA405AA + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1EDE8D4C37429990F3783510448BD350C + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AD3C67295D62FF1128E536B2B4C50133F + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393CB53C4A3F75301276CFBEF358B277AF02 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF20B2741EBE09A49C65EBA79976852C5E6 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD117510328384160776EF8C3F01BA8A63 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBB3E04A48D3D6392DEA123B1465C71C551 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519A5A38FECA31AD255A81B06394E8BDC569 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F4536AEB07E6A796423E8F0EFA897A4764B + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE40EDE1340E83E88A6C204B32F80FA5BB3 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC747E24C6246FCA3BC09C8391E38CD6312C + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E87C272E8769D61CDCC24B4598D57867F6 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D6853646464D964E3541A48216686F1E73 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA6E905577326820404EC7072BAA4DDF146 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B5B84CA9F9A82F4C828DFA84F6C852BDF + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AE2010FDBFABBE8038A7C57FCA78A733E8 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370B00856729C3D979F6389F54274F659F + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C9B2372CA04E333876B2C7978F5E8BB109 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C4514CC5D10DD07F8CB9057B857E53FE7D946 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FF9C4CCE725E346EAF06A1B780DD45859 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0F0BC7BF3C876DFB51C06A0BD4AF49346 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB577B54C10383894E4FDDD180508C6F5DC + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0C9B15197E52ABADB2E696F59CBFA281D + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BDE8D2D29C67DACFD21B880A814F6DECAF + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B70656453DB96BB924BA31D0EF4853680A714 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = BC73B1C2F3FE0C59A32941714473EAF39A7A2E48EF198C26C4089BE027D3 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C90D9F213A50805A3E1F1AE9140210B7A + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = FDC957611833EC30511C583BF3CB073BD5D4D4A353949BECC753314531AB + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E411879694C9B4FD153BF61B9F7CA030A0EFCEA4 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B776929CC61FF5A4EC1E417937E73685E9 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4861F442122CD78748C4D08D52010F7BA1 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193CCBE205C4BC1056BD251C7A50F229739 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE8E9E0975C6A7EA94D97A8281FC503CDB0 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7D07BF394D7B1F3498A6EFD1C3DA8D8DDD + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1032AAEFBB7D062FC3B779A3A30A65B9986 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB6C5FA7BA00E5A07ED678AB58EAB878E28 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C15FB224FEE175145C5307517C19E6C5D56 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B2ABFD83FD8F4BF4F469D78CBE7979BFF9 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22B0B858B41AC73784FF5CCB9D9CCB4F6D + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC01E0DB8844B75F722CF56595B6F5D9CC3 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFFF1969980E03C575237D49B924F28F96D + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1AE014786DEBEF11E53410A8649D23E95 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BFD239638095015E671696A2F2068BA1 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749DF19D7875F3103DCA42CA625CB002976D + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DA449FF0166DF3494D14B19E6B1C1AB31E + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64AB72E577820BF3EE5086F23FEE0CFE628 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA693710FF3F37C59320537B195735AB61C4A + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90EBCCB57D3E611A1320F2C9A61E6BD1DE + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDBC61B002FF1DD74D44673053CC08770CC + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370DA83DCAF9576F0532AC1A464044B2B085 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B220B59F0BECCAA383A7BFC5664988B03 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437AC9A5C33B688DBD00D1296BFE7EA5954 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDFD9538C7D12324E03688874EF326F058D + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF63C40B9DB7A7B09B9F5346299D696936 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535AE344BF30F7DB937D53F27292C3AC9A8 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B011B629C2C8D29BA655AEF6C1D5651DE6DE + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5C8ABFCDD08659E350F48413749455160E + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B3DBA1A30947A7363459E1D44E6408DB30 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = BC73B1C2F3FE0C59A329417144737DBF9EADF52B2382A873F68F61EEB4B1E6 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C827B31E47992DA2F2F9E586487C1A373C6 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = FDC957611833EC30511C583BF3CB663AF367ECB9C9C1965291C1B98A7010E7 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796073DC545F840757D2CCAF62F547F3FDF85 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4BDD7B2E5EC90CAA58D304D4A6CA36E5A + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858C99CFFD132E5FDCC55C456E462BBE9B2 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE7B08872C49F8041960033969378E0E04 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870DC924800E37672B419C101400C950163 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB89ADD3A8957E257244DBA5638593D84B1 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AA86FE9F2A30258F5CFCB6707A39BC04B + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB6617505745A7A72E94D8F1D178827B4B2D7 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589F89DF5B2B4D5DE3477BE33AEA4646665 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26FCE3E34BF5A0AAD3C5311BFA5FF819830 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D03512AC8357781589B691EE5F6E27C129 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020AED7B3D70FF9439A9936983EF8395EE + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF292CAFC3BD4195801D7AA68000696B7565 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D177B9EFFC418CB4CA7D851B183E31085E4C + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD4C6CA4C0CFE2C72C7058221CC727358B + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D464634225206989D61647BC0864DF25E2F + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA11259B0F6817357302C3A8D6178760A6F + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FB6CAFFD331DEBB2123E9271670FF2BC + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307E45758D7F0BE51ABE000379CC0893F1B + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B9022A007EDB4D7559482DF00F4A9515C7045 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88EDF2994F6FF8EC61665CE48A66C2FFEE + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C34EDD8376481278FA4081D265A899CC6 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B138A900ABF67976D03D83E1ED8EC8CE19C + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CD7137EDEAC00182D8D29D3A9E75130B8F + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93C5518C35AF102AB1832B9D03205FE87B + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38276161382202C8F988A3C9630CEDCF2A + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB53556694E0164A2608392E00DA3E62FE0BF58 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E49E9F3AA1FA522A05F04B1A541A76218 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCBBBE3BF26397FEF42EE9F3D9BB5430A6D + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36ED1635C3E105E74AEA863C5F485D16E83 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FBC27F66BA4C739B4C13F7E85D40CF381 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E274E644246D8CE10336162634B9B24D07 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B6ED3E53276F464D7C5912F66B5F47573B + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CE7964ED06F6CE4853E602BF702E9FFBF + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AAE3C87D827AFAEF4AD0CD65D3EA1518CD + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858ED6BB7C693B55C450985D5F82D198FFDC8 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE028A35AD1C7F60C2F2F6CF1CCF54FBC9C9 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C68893F3F2A8DDA2C2919298EE031BF69D + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB885C3C8A3CCAE65B6F0FDDFA758199EE268 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF9B1F0F12D8A9A226C7B8A6D2788AA7BE9 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6761EBA952939A69653BCF593B4165481 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8DC9204B1CE9D7EA02976AC98DCB74B8B + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F2996AA3E52FB7A87CCE290DFDB8BA69505 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E72F8BCDF4E7842CA0590EEBA76DEFEE6 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A0F7BF48A4C1AE97006FDEB1FA1B8DDFD + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F08D5CFAC68A38EBA31D716573780F3538 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D177822623D7A63D33E083B1E5CE9C6028BD94 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C1BC354027E2AC04207756D70D0674F77 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C31C254F2CB18224F7E8D30D24D19FD108 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A138A5EE479877E909213559980546388A + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCC6D69751C0A4424F0C2942A72F427FA7 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A576613A7F409C3A12D765D155231B87B5 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B902201C1E11F06943E7A86571F1F75A6DE0B6B + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A37DC2EE750D7F282123DB801E050031B0 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C792245BBFC7885EA94E97054615A30FC3F + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368777B1D66D154D14AAF3F54D0021F744F + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1CC6C888E036F5FD6F28DF83915773FA7 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D39B047288ECECA45AD8FF0D41CC4A977C + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF3895E966678F050BF8A622E0E36C1A429758 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB5355666F30F37D5EA8E301EE833ADF7E79E823D + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59A7DC7505608FE3223364EAB0A0BA7CA0 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB8678D4C3D3F048EE9E9D3BA25AAD479947 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E47700FFC1B8F7AA3A52695AB9449A89509 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E94965B55CF7C68ACE5BB1155B7366BB + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1B00CF717A2B285A2BD0B5F6ABC07B02D + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61CC71339E3142D6E5657807C293FE78F1A + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD5B433F09FD96A4B946ACE727A0562163 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA855AD2D11781719D789069FDD9A5A85791 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF75BC04DF41B03B02101BDAE30E6BE9BD + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC781366A8415E7C2525018A686A4C90CE + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1567755746F83385964DAFB27E1C06DCE + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB885591523E456A5CB4954B2E3640290AEA27A + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF9816BBED28A10965A9E1C942313591086FC + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FDC4E336C15BD150F67DB989F58EBD50D6 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BC6309ED917DAEF1B08699560C1966D71D + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAA27FF1EFB38B5B2FA030ACFD6A5097D2 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E411A75B4C85FD7A9E8957F544AF80E3C19 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A93425CCD824330EDBAE26DB4C16F7700E9 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F07916C2F5F315326EFE519B69455539E3C2 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D17782241F204838259A40DE0013FCF1E9EE4FB9 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C1250A1D8BC074337DBBF23BA82D9C36C2F + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A839468957E5BBA51496AD832C3861B50D + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A1899A0E93B2CBAAFF6C95C1CA6061343B27 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB530250EAAD81050665D6075237AAA4B9 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F4816599982CE5036B80CD65AD11B9AE4F + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168C161D14DACEDE617B9DF2EEF6C61DFB3 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B88AB44E188AE12C98979F6E1864EF8312 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B5DA97C31E469242751E9D346602C2A415 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B13686086CAB0A28850C1446CEB5343EC7FF90E + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BB772FC9EB84B1C03D6CE7A026BFA7D0A4 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D318D870D7A89A4080249C03C1BFE30D10B0 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F1BB343F270B6D5E807CCD9BDA774BA81 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB5355666023BE810873BF13BA3F3B879DED0402589 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF0E22B520BDB8D5D85575AE92EB83AA72 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF73A5D03739FA6B3AC942FEBC13044E2C + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E47684129B85172BFCC6E6B9ADB37A9B6DAC3 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E28AF3BEE9B5092D14E69B272D9C4A994D + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C170F488BC956899BB01BCB786D29157D94A + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B36963F452687F5ED975072BBA784B4A7 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01DE8925A6D36A64CDB1EE73FD760D28F5 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854EB94FB4DE375EDF94A5B470F06774E805 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9F102B514465DC33380294F451C76B9A65 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC9079912EECCAE995ADFD795DFD764DE46C + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1764ECDFD36A892FF2203F2D05FA45AC1C8 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C06D04754D2FA566054AB4A07A81BE4C9E + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EEBD4267F71E1FD3F5CD4E9DA58A0F5AFF + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A0694173A4160C48BA7D7C2BFBD8E1912 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB31904F12FD12E1F8DE0802316007830D + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD9B8C680D44A4B30D1CA07189AFCF2BCF4 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416CD8AB58EDEF4673FC07A56EFC751BB984 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B44E15918C817D4D03D8E531AD8AB80F3 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F07990C77D4B146E305CD8094D2BD81D38FDCB + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D177822409BF0501349A5181635A210ADD7365E640 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123BB4D54B2B3FE883F718F9D58E1AD141DE + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A8396CE3C08237FC3024586EA3DBD036B50A + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C7593777AB5E073F8892B8B824979A4562 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4D3D207D6AAF72D841C87F09C0EA2151BE + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E28BB0A58C53420592FD6AA1B8FCC1D83 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E9CD9EDDFD6C7DFA7B188896F8F76DE5E8 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B834FD6FA14AB59A29C08E6BD9CF6B1F830C + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B56653F2F71FB527770E69768FFDC302D2F8 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B13686065D5F49C1F34BD00AE10C6419C92375AE8 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA7C429CC1289C9B7190817840217703F9 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888916599B7C2CC665566E816BA173928F4 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F4385F21F8E8CAB99E15B8CEF21FE36B2AA + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D52EC321FB1662EB126F8A4D7827A14320 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A68E0DA37313FC16B550D3F1C394A1252 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53A38B655629E4C40F0721A20E033A360F + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EEEEA3FB5CADD45164F16B905DB8E1DFC7 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C412186B9693087B6F482DCF38E96E31DF + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F1F8D3966F2FF9B9DE1741674EC38A1E4 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D0299A367A2285B7B535B46B09B3043A2 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01477922DC7696B8130B940240E5B1DC57A5 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC733D0EF3BDD6BD203D99294F9504B914 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEEA5AF90C1F8FB417CC85E797D8F2A8C79 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC9096E4F6CB948BEC039BC6C0FD38410596C0 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761FE486D86D9682BFC4B2E642D2B89C93A0 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0C752C3A088FB389C9197F09A1399F235 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F93317BDFDB4818A72DF2D42312A461B1 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A71930AAFCBB00D251F6D67D5F883CDE576 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84BAD8928E7339654BC881F7E9C75ABAA1 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B2EC2DD42EA7AFE70CECF57777CADD492 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16E1C76546C9F0EAAF55105A68F855172B + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95956E582C3435B1194016E54EAE574ED0 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902E76117AE4741B4C740A967473ADA49CDE + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098F536618659641BA9328147386A21AF85A + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10D87D073C47D6F698F57B23811D899CC7 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989796389BAD48E7EF042E5B5430D00FC68 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728C7BB4F7C97AA81E121B83D06E8ADD53E + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC4A7C3E3E5CAB0BA73CCCE114803FFC791 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E877D1E0A823DDFC95E99AAC2A0C6894996 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A760941236BD111A9A5EAEF6A25A3712E + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D76921570C6E702D854693874FCE219C6 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD39CD7C11F55AE4DF4AF4AED4BFB3BB10 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539C87F2C3B3A091313A25ADCAF8563FD59 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0DB97F39B1763BCC0482D83A8356C25C94 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC356AFD3366BD6386B4D5EB4701139E05 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A177B8532426C624C7B590C9791FA3889A + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E50C92463A0D949BAE2936ABC05AD2B4F + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A14418BD90E81F8E6163BA088E3119951BC + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CCC69FE884E6E3F6ADF881828221CB1566 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE87D4CBF131CBC58C7B5D975349E2F45CDA + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D0113B39880922B0319CAD951F72E49A74 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2797D89E5625504A6C856013EC3BD6205A + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D721481415AE5630243B9BA0D5677C372AB + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474E1E50A2E4072A59607B7B2A1F73C02F67 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D2ACB72411A8A0FCED55CB11A9A5A16C5 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECCA3441698ABE9660BB97E2F7D850A168C + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A9AF0B2840B259CB584AB0CE8BDE7AB85 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DCD8671A169B81865499677008587F95 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BCBA03CD249FF1D87F84F3702CADF8C9E2 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F4127A60C302CF722FCAE3084F11AE9D631 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711D7BE33BC4D14ED58C099963E918C9E13A + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84228D685006D9EC12CC2A22FBAA342B2FFC + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B50DA5C3C6971FF1AA3B2016458C8A5BC47 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D07E8268F0F0953AF9EF515EFEED09C248 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B9535710EFAA5D7C67B93F22E5F119C0E77E2 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC49909104455BAB07A49FFDB0C89B15D8D + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9114A5B2B65057DFCD9F329E6EC6BC715 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBCE3585B384305199C72AC362C37F853B + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989708479BC859BEFF75C7ADB48223100BFD5 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C72898D5FF8FBA03CC4133F027A57BE0901D71 + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423138B870DFDC0833895CAB003AB49ECD7 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E8793A2B448CEE7D4215597283C8D7354EE33 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A6845D7B37C9296A23B1048DE36AF2BCEDF + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D176945CF1E1A767292603BA7CE3EA2273D + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CEE0307CECACD520FDD221209E14DEC6 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B136860653905F38D47FECBDFE66E89C57C08F1F9ABE0 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D80D217E35B5D0EF71D74BFAC53744E6517 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC10A03A1505AEFBB48BD91B116033530DB9 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CBC003E6BEA17D00EACF718B76D9F11A8 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6AFFF473CDC1991B8D0187717024F71024 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A14459F502DCE435CAD6F1B4306FBC14A5234 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC90C05FA190827EEF79781B14E625986E19 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE87751884D842D13CAEDB16405270F0EE4D12 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CF98ED89583E781AFF030D39717B82D3C + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F271498880D2C84981089BDD646F73CA0E39A + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D4B0940C85A65FE2CBB5DCDBFF867619A4 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF79050F8E380B0BD86994E3A73FECC635D + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D95B29FEB98723D14D4A4A39484136DE4 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57DA43F70FD4B7D070F0C45BF8F1F2C324 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75214436047AC70F48621B690A2D424935 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DD38B0821578267EF8F9BE1B58A5B9CE5F + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC24BB253FC42FAE8CD92CE505771B7A4D26 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C21CCC3465F87A4F3D59D431050F6FA9D + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF8D5C07D456DD97BFB915619203B71CA7 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E08AFCF81AA6CD5448A9AB415847C912B + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E1688285432703BED760F6DC230FD921C + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092FFA8AF72F786636FA19BBA41913E7480 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB98DDB68154775DC70EA9EB5B56D2062 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431DEF31DCA4F06E42CDE85367EE10E8DC9 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA934114C1AEC88DB6C4713243D08A0739C88 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC461F9241D0492BB1EFE92DA2AF6A7E8B7 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D6404BA3AE7F3BBA733F434078346D919 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986A8E3B85735A6361DC2CE626829DC3EA29 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDA41D2093A1846321A7EEE21E5343D327 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E879359936BAC93240C8BED40AE18508190DA2F + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A147F3A3E6004273A78032425DFC5F777 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E748743CAA786F8992D11A440224440EA + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CD7B1E52B72194946EE8E9882015E3D4AB + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054FC057C99DB021E60DD14B2FC46074FFC0 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802ABA46024FD7A1D7B1512AA2C18F36930D + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103F6AE18681BAE77EB8439E6BCD4EE42E3C + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD6C855F8901AE805DCBB62B6BD7464E37 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5E69913B98CF271FF33FB8EEB243E35F + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF9ED641EDA3F5BA8A467C5616458A3572 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E9430E509E91A7D9E75097AFF4EE605A6 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE8775191ED4EC4148E7075A60CD258104964A2A + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFA40247B72318085A05612400863BBA117 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A24DF989644C18B38A6CA551C8CBFD7B7C + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B4C01BDA1EF44B721CCEAA30813A4A161 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B92BF79BA163BA118C9D26AB46EB44954C + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D483A18AA87D56BBC3BF61E926084E71160 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57ECCF9AA1AEFEA056E7D0B0BD1E136FD4AA + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB9B8694E9591740F85EDF5ACF828E6158 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDA998E5981F5E16DEE607220F9EBB01D55 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC24903C9481FCC5CCCDB9DF5AB4F1B3230D43 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F5FE614441BC62D3775F63B7463A5073B + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A6379F0EC4E11725F5E6D5F81411E6C4E + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C0069B15F0D1F1E81B57EB089F5065B2E + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F4981BEF3C3469B90E583F71847CA3314 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BB05AB4C5F87F29EEC456E8D2E98FB10C1 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5C67B9EBFF91D4C28FEC12A97B2712E21 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB68C319FC47E398CC792B11B78F27B51C + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346D747110F8F05A733525A924420623F842 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5A38D245C7FDB1C149E0D9AEDFA691CE3 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7DD662BC963DB8E50A6297E5DE0AD7595C + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEFE3057252738AB4BA1D59557444DFD63B + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD85B54D7C28A336D20F25EE905BEE8998 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987F802252C47B98E2D8A118013305D99CD + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B59BCEA05C890F6150E27B26D978A73D4 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E069A23632E2AD5C0630A4B5848FFCDBA92 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA816AA701309164C0374A51128492C2522 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F789732BA7CE2BEA5A336039B3D7DAB9680 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A465F18282A3D04526A7E5C081BC65CDA36 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBA6E1779951D02A3A20680B95BA11517B2 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D60BEEB742CC7C3D4317117D1B073915 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5BA5B01D8CE4272AC5102F5E8C461B459B + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F1305A5938A56884EF5F537750049FF0D + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5EE0B79A0EEACBF185A7E5D5F4BB67CEA0 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519542FDDFAA2A7CC0ED3BC834266DAD9ED91 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE4C05B3DF4108088C3EC8CF76EBE1A0F2 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235AD3D5FC843F6514AADCAD00F685385F0 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25041F2974DE5D9BF755721FFD133F87AF + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B81F88A7332E4585F3CB6D8EFC696D311 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D48818C57BA78521D3A44D990525A67A12E80 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC756BC5058DE102BE19CCDD2BD6F9E4B527 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47B96DB9273B29015A789293E8928DB748 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB237B1645F933F16B034CCE5E2AA4B9B94 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B60FD4D972610CCA178C900D50208AD06E + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F0687CBC2CB8D33D3CF1ADD3A4DD45E89B0 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54D2A61E1A425E1071ECADA8B8736301AC + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C47176CB68A9086B8668D01DBD3BB62DDCE + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DF18E059B656B6721391A3CF590B284A6 + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE843C680F818C5BF44D5EE7DE148F88D03 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A29D90B059852313100E4984C805928443 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82470FC800E4F643E9288447414D98B59E + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC0237D2C81BA1CC81EB04D2A0ECB9F2739 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B1CBEC93998FA9648B10399A33B3DCCBFA + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2C3A3CBB47C929482A12D3B5FF33F5F4A2 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37CFD59B99E33226FF6757A6BACE2CDA4C + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD70E37D779FDB4E666142840169544D6F1B + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF753E67CA9CF6CC83DABECA7E27635176 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B12B561255FA94DA153B2E1337D8297905E + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DBE57D8DE76680CD596520B08E32B7D89B + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8371D1A03C6EF552A9F187A0AA43635E583 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D9350F1EE978852C245DBD64E4D65CC1CB + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467F8DA31F651F31172EF87DE006EEF6E16E + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE14347A37582459A03266DE0FC704B1EF1 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9964C29292A1BDCD76F60B37A15EE21D4 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AF16E0E95759C2B125844E496A7F6457 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F338FDAF94F2A9BCE5DAB7B8733761D4893 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E054FA8221C56A113E989B9F81BD13B9AC7 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541187D81F0CF498BD2317EEEFC1BA09FD5F + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5C67F0BE77C96DCA2D621A3AEDA407DEA9 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D11F48C67F708E8845985CB19ED6010FFC + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBBB850CE2576C3A57FD18BC3CFF3D6D5B + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B13ED837E5EFA4849EB7979337FD145B1AB + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146B61ED6A49143E54F91090703502E1994 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753423E518B2703E59075B236CF7FF055358 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47ACF3622DDD5EC2DE97BCF3527921D29107 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E75FEAE2F03FE90BE8C79E2DF75A7265D0 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A17486444F9440434133FD04142925C8F9 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F0688FD48546BBF1B67D67AD413A9CD157CEC + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B31BC7DAB26D903950EE5379C743AF8C93 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C47094B57F09AB7A21026B142ED6436497EB0 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD57B6405C3808CF25A26AE2289DD85CFF5 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9596AE06506D4CC33DB0AA22365304C5C + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28D9590AC4E915251A024C50D1FCE31EB02 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A70106161BC3FC4891CB3356597BFFF6A1 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC096229D9E1715514902B61AD4DFBD1F602A + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B1086E20396B5783A8A60603081317C54133 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE14B78BB63FFEA6B6E4F481501C9D996CF + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA7AEE5C1D85068F993515875FBF7A7BF8 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062363D20E31A91526E7160F6B601FD01AA + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F2B9A1E102B8F3CD486D2A6FDC6E9759D + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DFFF225FB61FEE1E4F26AE8DCD4F1878 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0760F957BC42E1C22E1958F3B6D4512AD2 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA83797D8E2E17A03E076AF09822CAB762FD0DB + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D9876F17F9D98F60D64EA9E44201410ACD38 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FAD1E7FFCBFB4BF5F94518E18A4C6AD9316 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CF47D09B679011A91DC89F8500A4501523 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9008B28E58871C9E3004693A0775A13CD19 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC1AFE850F982EC5B9003210AE09126E80 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5406032F3C5D380105DF5166364FA1475 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8098254D4EE8BD4CCF2DC396FA157C1EE + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE8775195411326928BA5B34AFB44961A8408B703CF143 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD1A328F2DA944A30866E2C778C5E95EDD + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148BADACE6929F188CE8BEDA20D89DD8182 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE457EE363381C08EFDF4E65E20C24DF0D + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B13089E7FA7A7320BE3297F6F27C2347D887F + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E25EDC3E3A1DAB8EB03BD858BDC4F7A6DA + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC75345757E57DB012D0E680069B1E14D1126917 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC439AC527F2DE1C8D6A18B933E8AC263035 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FEE75830F01559C9A3BA94C239518DBBE7 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E0EC5DAD3C4D5C224262F028982F26E799 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F06883828972F98A20D5011D28F59E0F984DCEF + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4BF379E805EDF1A7B4D397B7459BA5718 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A41925A95E9B9FE8FDA0A420548DD6A54C + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55D3061AFD32777529C28183635D83B4D25 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A15CFFF1D05BFB471D00775A6FC930164C + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD2A7F42ACAF8062A2029D9EF3668305772 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DEF38464B5F749E708EACDA920288AAACE + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611E7E3D6883C458501FB52815F52AE5554 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAAEBB224FFCD62E04951A1A8531D32B99 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE1170B221523F97A2A98F432435283F99BB7 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA521E0EACB295C968BA3F87A193C3990C3C + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD70620519AE922C7C7C4BF5CF0F1101F9806A91 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4800DE4425BDF6368485CA20F81E3F4D60 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DEB2EA7E199359D938CF814309FB0E99CF + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706ECBECFA8A7EE35014CACEEFD26C8CF83 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712A11B5C1CB67C82B78DBF412E3693DD21 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F6BFA05EA06D3F3515EE9D711D706A6436 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAAD3B2BEF833E5F38536187DB0597A3447 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB3F1C13FCDF731E1611A97003C51D02DF5 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003849348A22DFE14CF80ED7BCEAFDE82CBA + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC166B38D203C6F6457C985218AC2BAAC92B + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E8C42139763405A8CAB204EA387D989999 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E8F8611E4B7B955D93887A846980ACA855 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132810CA2912F085BE7211EA4B9A4C54D1928 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD702CCBDC49E6C41D59A793CB6237EBD574 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA004B07344C351F3C515A61249574F732 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9474EBCF7DA8687A5266224589E483D36E + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACFEB7CEA01529837AE39D3061CFC3A6C + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23CC6441B2E6DD94802C3B7753F3B751729 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F18B7F22BA655B0A57744EB435A8906B56 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC4305D8F6B1426839447C71FFDA676A8F8674 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1133E36DE2A7567D26CF4C12C292E5786B + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D1577111D13A75C3618E91AD0A064E935 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1C03B07F0AC6E4818AB442CD5BFC4CB07 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D430DB56E19E0C0BE73F8C78465271F2EF26 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42F19030DD2D00DEE467426945536D63F0E + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6F520C5ED096CF8A6AD1EFDD26E48F509 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A200B594DD5C8D4126649ED6C5062D834A + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275FE566DF26A986DA8BC6241C560FADD1C + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02DBDA9AA76CE11A4149CC0BA41CBA3197 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA6B993D6C9988129DE0E97A389832EF93 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4BF0709E2ACDF0357269DFC97832C09F0 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797007B57A1462C7B76ECF0C39DAA7B5EAA + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D0A166C3B01220B64400C60881AA333A81 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD70620527DA9C1507DEB367A6E4942B7FB9144156 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A7627FE5F0DE5D1CA10BFE85F5175EA0 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE72FE366C661B92C8329CE4D46BC27326EB + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3EDEAE04029AC0CDA42C47B3823298835 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D292ABF9F210CFDA2E6DFDB4855F7AB6D6 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E82E13F4201C03AF9342EDC7512ADA457 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6AAF51AC52FD83BD36220705B97A0F3CC9 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CB13DFA77756B20E59562DE6B945EE218 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D90038071C37298E1538B746EB58A7F4DF059F35 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC16216771C65BE9D0D623BD0366EC7CFB6A70 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E8354835273AC250509FB81AC2EA814B392D + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89F2513DDB129DE9078F72539A65D6BE30F + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818BE3A76D23A9FED6A5633B1236833668E4 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD7056BD4D93D5933524D84B3B47FA173C84D2 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22B29558B2F6B63758DA7562AF91E3EAE1 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE942550466D1728EE7CD56B1391FA3F7A2239 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB60D2D5D36D4BB68A1A8623C84993DF90 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0C6BC5333D56C869DED469C06AD41394C4 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DD54E9B5C97DF8EFD5D7AE1B8D2BF4F5D + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC43056127CC49C3A05D9936DF7A35AC705AD6B7 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE11402E5AF3C0D6E1FEB0E3E79A77A65D8CCA + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D63FBF8D98A8478435380BB9D69B9216BFB + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB055FF825B9989676A64D4C48C2422E4D + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308AD274165A05E6B1728312090C066CEE3C + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF17578BA57C60BCBC91289F43A5CF49572 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC612DA6D3E1148BD7123887827C68D5EE9BF + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A28228F6C281C59045425DD55AE359ACE76A + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5EE27EB88191B25A0CEE3C42CE4821583 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C34F3CBB69EBFB7BDCB197012AF9566ED9 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA55EB8E7C5175684057F5F87A283EF57577 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EE5AB165F564313475DBC06475DDB97B2B + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F05CBE0A9A0ABE554B2F1E4BA768CCE5E3 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D04781D1C75E1C03F538119D420D2E3B186A + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732E146AA248CABB989E4B7BCF7288F89CA + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A410102E6A95393F951F6864C49A243BA3 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720AF7EA7BE1AA2ABF3A5023375C9FA42869 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F12DDAB57EE5FBA1CE483857EAD3972113 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B5D072FACF3B082FFD6D4FE8134CCD6657 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E762A3F3497C83A447AE51972EEC409257F + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C431CDAB5B61CA8A8DF8552A198887BA7 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC4BC17F3E71F3C63ACA6BE85061A8F1DCC + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D900380764E2C08534E89D545BB0EFAE485EFAADD0 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC162161ABBC64A1ACA295A71B992D124686333F + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6FCA22E779EDD264113B0A5FE7F1BA1CC + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC116522F921F79BCFC6A1ED085381062D6 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5F30C6CA1B069F6335F9EE5196C8CDA94C + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD70565BE9D4DF7CA6A1DBD4BAEFF25E3025C1EA + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22AFC2A1C93EFFF96C55FEABBC4F8B0D9E69 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9425B9B431F0943619D94997B209D49CB3F65B + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB7BBAD79045D7C458C04CF36D59CEFE18E0 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0CF2A22CB2EA43C8EACEDFBD43B90F5FC1D8 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DEDA269CB3429B91BCE6FFC72109BE1A6F2 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC430561E144062F91E09DCA8F69493B31B2697B0F + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1140BE649A7A03B8A5F94776B854097E1E7D0D + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D6334002A70BB35D2046976933A1220EB08C8 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB3EF9098E54C9C1D00D82E62460D449C423 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308A444213557E65E663960291592F3DB91C37 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF1B4475F7CA87AC9BA66E2A39465C4FE4434 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6124F27567B9306BD44266EEC3B497188A0C6 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A282FA34605E368965835FDA1DFE96C751B9D7 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5E1FB7FDE8D19AEF4CEC1EE1031E6E170A7 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C3DDCF8EC059653192F7BE923BC21F4250EB + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA557AD8192FB3C30B3C66BCC1EF1AC7483121 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EEA3FE3F2805D390869542CD1B1B3794DDB0 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F090DE5606F1C64C713F12CE942F0F5AB33A + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D047410DB1F8837123BD8094EBEFBA2A15AA43 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732C18D390F1109D53A0115181C98EC2BE23E + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A428F51A411BE005076F4574FD0AD25AFAC1 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720A1FCE7592B19E1236AF0EB3B7399B0F506D + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F101B7DA55D58D244CCC4BA3859BB4DA9F92 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B514D5B065030865553E2068D516D5508307 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E764D2477CC96B0510D1C6CEC8B1B5F3F229A + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C07952AF75499E7A247CB96C608917EA215 + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC47C6A0F02B4CDB8247287AB31BC35C79975 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003807643B0696A98D88CC4BED26B20D400378350F + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC162161514E3B5D9DC558E08F4046C7F37E391712 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6010F8370F5DAD7FB5B2EB1D190D220A380 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC1FD21447594EC2960D016A1F60261F2CA4E + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5FA4F255C8F1907D4526C25BA2A69DEB6601 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD70565B5AD989ACD5D1DC50D912CE204BB77E8CBC + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22AFC93F7854D40745119AFD75BE131CF1C5F7 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9425B9F9B2992833E40F138AE4C95E0A479E39EB + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB7B55B01B001001B05FC382E9417C76956ABC + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0CF22914F3F5D9E99AA29EE9D58A199B7D4565 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DED177F26F7FE27E6044D7568A38927A547DA + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC430561E13D29C9DF3034F2F83E16C3D96EB9D3AFBF + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1140BEE3C80D247A9DBDB8FE702846CF6578155F + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D6334C31063D6E31DA1842F8507A6B9A3750075 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB3E02505B48DE01252065B680ED49D9EAC0B5 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308A443BE60871C77ED8AC7EA40D94A291485A8C + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF1B49B0DD0B2471E6D534F920DF5ABC1319980 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6124F346B335B88DC008BDA84F06B4558DB8C5B + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A282FAB93A5D4BEEDAB45D8770EF6989C60AF8BB + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5E1938F249EADEDFB09B8CD40CD05B4488B9F + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C3DDD8E624A6A5EB4C4C1F566588CA942B3429 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA557A760FA7FDABDDBD223DB8981D0AEA112003 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EEA3C19551FB885FC471C9924E060370AE6A58 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F090C1F4F17E7721D27DAE1FC54B2853BDE6B4 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D04741B024F017C21E9F40C24B7A0705B2A6F747 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732C15538EF5DB4FEB13F9BD2CA608C9B238ADC + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A4284DC35478396EF18AF4D20439D23F7C8718 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720A1F2057CCDE9D31322E27D9C63D3024741066 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F1014C0D37DE00ED97A43C3FFC912CBE72293F + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B514372545B4B9F8B2CF598AC3ECC39EC1FEEC + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E764D7625A5518167DAD1004E55587AE8F666BD + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C07F2FB3C9F7626E8C86AAF9CAA39C3799602 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC47C513FF570F5F6AAA1EB4804520AE233183F + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003807643B427A0A5635E44FBD1B84DAFDD2ACADF97C + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC16216151336AC1D93FBAEB376578A956F9AAC2B223 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6016A502599249DAF426F7DFD13FE028FA12D + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC1FD500880A78FD6DD22ABFD2F90E9DCDAE525 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5FA4F4027B3A9CA4E541AF383A9B89342764CA + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD70565B5A8692C1D93A7D4C06B413794552C18A0420 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22AFC9C353299A16F4AAA278EB34094D03508D75 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9425B9F91448DE7C92526DB588D5B78FCE13433715 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB7B55E9399917571A55510B1DAE01B4450AD76B + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0CF229B9037E2EA4A165C708014BF304C8F253FA + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DED17A416F9C60712759EAEC46AB34B3563193B + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC430561E13D3E084142FFF50ED99AA93B04F5B0435548 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1140BEE3DFAA12704DE1EC881448234A056D5E151D + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D6334C37E1D473E4DD7CF92A5ECDDB1D6EE77A88F + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB3E023F6C59210A97891ADB1825B1CB7850D713 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308A443B90A68B9C5AB205AAAD569FDD416C8D58D7 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF1B49B351A28BD1754C231E0CBBF4EADA4F0AE66 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6124F34C80CD434A2FFF6CF7EBB7056B42A4B3239 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A282FAB9087DEC7700CA90875AA3941565AC8D4CA0 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5E193AEA069AEF5E677DC6F69F4322385846D24 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C3DDD8EE4F19DBB7F3A6E69E2C7FE04BD6ECF36B + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA557A76F4A1A886F035EFE5F95FBF257EE9D715F9 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EEA3C17097B764A75262E27A810B8CED29440403 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F090C1B3F7B9325BDF2DDDFEB3638AE010B8507C + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D04741B082475F9D3D096A7A17947FDE09A2FB2A16 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732C155D3D714D4A472895BE660A0D5C42C4E724D + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A4284DBC7750CC872C0097DA34590040C58BA755 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720A1F20D7C757DA8EF720024B914719C83D4C9A41 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F1014C0B0645716EDE563CE4F0B7B6243919B4CE + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B51437D80E88D205B828708FD4C3F19809279B05 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E764D766E3F39E72DF75F902B813F57AEF7010A80 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C07F22C85332793D9FC3D9AC2A642A31444C344 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC47C518AD10A512C058C2686D2157E5FA817130B + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003807643B426B830A1076A45963A3DC582FFD457324E4 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC1621615133E422E5F1CFD4ED43F7265E0F1FED8C22B6 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6016A7ED52B1C3B3A443657DFDB294548598A50 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC1FD504D0473BB3DB95D29D1B343DC092B134990 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5FA4F4540537BB8289E3A90DC1BDB389E0321DAF + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD70565B5A8616D152FD781147C835A21EB48A2D4A4CF7 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22AFC9C302D539CDD2CF9914F71A5E9E558CFF6602 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9425B9F91404E6432D0C49C9ABAC7A6EAE613E0C40DC + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB7B55E95E7F6377E22DCAFBDC7E8D75BB17C30E63 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0CF229B9E4166233E28CA9C7D4E2ED990A1C93CBAB + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DED17A4AD2B59C673AAB966AF1F175A27A0045E1B + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC430561E13D3E6F93891309CB5018E95D820532362767A2 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1140BEE3DF1A7A61575BF6E83316336671232E484CBB + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D6334C37E732BA195DBB35D7C1DC7C1DF48FF28F728 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB3E023FE8983C662B9C2C1A1C98D1798FD147747D + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308A443B903FB5024CBDB9711BD605BA9D6F281A7543 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF1B49B35BB1AA4E5514291E2DE15461BDBE80F3A6F + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6124F34C87EB2AF1DEC95D0B7B78D0B7ADC5D9666E7 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A282FAB90847EE2CDDA8455B9C7A87D432999CB59267 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5E193AE450724509037966B7AE09779860083A460 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C3DDD8EE41260FDB15DCC1DA866E85547C6A459951 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA557A76F4ABEDE96139585EB47FE6F7A36E02665F05 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EEA3C1702773A80EC8FAAE89202FB531DF71C4F294 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F090C1B33AF087C7DBA4991FA708B63E45E851E6F2 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D04741B082B8614EB3B6582D365D77CB7300E53A9BAD + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732C155D3866277C8D94AF9434DEEB8D6BDFED2DEE3 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A4284DBCB722117EE305974F19002AE769ACA52DC8 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720A1F20D7B3CFB0A9B5090E3E2A9604DCE7F9BC8FFF + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F1014C0B2785DFA90016ECE0BFEF100CC2F6BBB411 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B51437D86EB1877AFA3439202DD99B30403812931C + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E764D766EC549E0A9C011EAAE2FE67081CB04FDC0FF + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C07F22C1CF9EDBE5EF1847162D8082269B2741738 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC47C518AE18DD0684D6C7521A099BFB83419CA311A + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003807643B426B66DC5F4C6597257FA7B2E64D48B8A46F36 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC1621615133E4E2F1098607FED906E0347422AA44F72820 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6016A7E30F085D72EB6CDB18F25702BD9BED830B4 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC1FD504D568C7062B5A095442750AF76AA7AA4B375 + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5FA4F4540252AE42F2674C35CC1D8512B835BDDCF3 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = BC73B1C2F3FE0C59A329417144737D0FA3E2C4D09CFABE5CBD70565B5A861694E9260A97977F7CFBA2E38866E417865F + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = B1A8DFB192FA2C1BD978DE3A0A1C82E2C1709F2714A235D148FA22AFC9C302B389B2A0797B684149860B701339291A9C + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = FDC957611833EC30511C583BF3CB66B61C4B0D72D47B25DBDE9425B9F91404F452BA320397C57F48284D4668C10FB732 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = A2EEF13FA0EA16BA67E6E4118796071CCD01474EF7B90B1308AACB7B55E95ED532E9FD3123E998CEAAA913E3A8BC9FEA + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 3ECF2C0B164EEE0B9D655C5207B7F4AA854ECC9D6D488146E23C0CF229B9E44472C4C02E5C32FA12B5DE012D2DBF5FE1 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 7EA0A67026AE738620E369B96D4858EDBF9FEECC57EC753457F19DED17A4ADBC45D55FE672BBC93FD1A15B09CF1536CA + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 1A9471657230C2272C4192D9D193FE02DC90965A75DB47AC430561E13D3E6FD0FA5D83635D20D7CC668B07BC24B23A1B + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 1F6D4FBAA595F14B9918C01A5AE870C6D1761F68DDDAB2E7FE1140BEE3DF1A96685143C4C443B87C1DF2C4A140A8C5D7 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 86A003A0C56CDDD7A9853AA70F7DB88559C0E0BC2490B6A1E03D6334C37E73EBF59FAE6CD125DB5DD0EA1839F0ABFFDB + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 5840C9CD51283BD1D9096E4CC1039AF981EE5F415C6F068838E1DB3E023FE828B9A7ADB189A8AF510DA214612DE09E2D + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 6B74495409113A904D4573AC8AB661F6FD4A711DAF4A54B3D4308A443B903F38F199626D9D2551E6B4C24C98EA1B30C7 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 5BA1831D487F8E249C9193393C1589A8BCAB84224E6C4709A42FF1B49B35BB4428F2D363A7A5CBEC5FAAC54980A03681 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = FEB6AB5F168A5792A88D0A6BF2B26F29CAD93B504E2F8DD55DC6124F34C87E00C0D30654082F390C8188023F6EF9DEB7 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 028697CF285B46BFDA13BCECAD22D09E416C16D092BBE8B9A1A282FAB90847CF7D67ABE237C4923533B101B5CC44A381 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 681E88ADDF4178136693CD3DBBC0020A935B95350FB5A28DD275E5E193AE4532E5A3C036F5462932878EEA64F134B834 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = E43AF8F55790660AB0B7F3519AFF29F079902EC431CB82A7DE02C3DDD8EE41BF1A910A55B59BDF30B300AEF1997001CB + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = DF0CA1114F2E0051AC6E347F45D1778224098FA9346DC09611FA557A76F4AB789F19C668E13EF77882A397A88494E821 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5411119D71ACCC5D9A10F0DBE4D8BD5C123B10FBC4B5B108FAD4EEA3C170276445484C94A0BDEB4BA4DAAC9B8F109F24 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 36CE88BC57F948B6D81B20AC749D46C3A83989704D7D2CE11797F090C1B33A61021D5659A0CCE6C823741182B7E3F8FB + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C171586599C0292C87A35673E8DAA1A189C728986AEF37EA52D04741B082B8FD9E98A61454CF438686061BCB5E840A0A + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01E47467EC5F81AD224EE173D64A14FCBB4DC423DDFD7062052732C155D386B1DE798B12E23E0489F9E9B5C2EF28C0BA + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FBAACC649496A650F85A500FA69307A5F49E87935987AF3F4816A4284DBCB72A58A80B83535E6F3E877F138D534C8EBC + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE7B6FEA6D4E6CE7C175DC649B90220168E94A687A1B1244DE720A1F20D7B3132EE82F86D18EBE74F37690E649F37853 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 95AFA27D4D8CEA68B2D46DF5AEDB88A3B8348D174E06DB0706A3F1014C0B277F2824FD088F1A0FBE597A366FFA14983D + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF2FB7E73873BE2A926E3B4A370D0C79B566BD95CDA8379712D2B51437D86EFF7C53325D4D5ED52D3B3321E0A5C94D63 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A5AEC98AA860CE17F00838C6C94B1368606539054F78D987F67E764D766EC5F0599FECB7C244939FC90787D50283B983 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4E7F9F0B45CB9DC4DFFA2C451437CDE1BBFA0D802A467FADAA6A4C07F22C1CDA7AD9CCDAF50C1C73F563406418DE3751 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BB85E2FF036A7EE15F49548C5FDF93D31888FC103FBAE1CFB32CC47C518AE1A3D9E19ABD4B236D115102681353FC215A + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 545D8C7B15744B9AB0638AD7C0CF38950F43A12CAD52D9003807643B426B662AC7601A33402FBB748780D2A831E12CF9 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2284612C4744BFB1E36285EDB535566602D57E6A4E5B29AC1621615133E4E2305430E9192987F15523F02B366CAB47E9 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 05F8B0EDB034954E085389B6B0117E59BF7A1445EF1F33B5E835F6016A7E30009535F82D5B177B4425934DF831FD8EEA + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C019C29603C1E1ED3D94BA68BD5CCB86FF53CC904E5E05D8E89FC1FD504D56BF3852F3441F46E9B6E461D37AF7A8332E + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B625E5F4DF92DADDBC6B7065B36E4768EE877519541132818B5FA4F4540260E0A668020917870083DB460F80CC524B + diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..275a53c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n2_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n2_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn2v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/LWC_AEAD_KAT_128_96.txt b/romulus/Implementations/crypto_aead/romulusn3v1/LWC_AEAD_KAT_128_96.txt new file mode 100644 index 0000000..384bc3e --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/LWC_AEAD_KAT_128_96.txt @@ -0,0 +1,7623 @@ +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 8F13641C9EB6C1307C40947E0326D8F2 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = B12064E6DBB7BB6D081436FF7CA65AE1 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = FEA10D48FB277672BF47C3FCE4EF4966 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 2E7A74514D401CB194AC2EFCF7B7396A + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 1FFC1E07934B4F00053444B8BF58A700 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 71BDF3AD797D3EEF55CE82D4BDBB9140 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 6258DE1707590A93B4ABE1D506B405AD + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 7FC140A0827E94FCA4CD6DF8552CAEF8 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 6E358D0AB1F662110E9575108DED9B04 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = 45A2EEAC0C64962B560A6566C9CEC8F5 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = AD7762A892816389E47AE51A7A3AE083 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = A946DFBBDC58BB2FAFA332DD489707AE + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 2AB43C90761D20C916B1E1CFA34BB851 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = 1D74BF88344350B9A3F19B01A467B964 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = A73C27CEC4C90A60657984ECF14F4311 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 9492A26AF193AC8795460141CD63860B + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 2252E574D9AF87121148FEFFA823A7AA + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C72F18D2C55EA6D7334F49A96965345E + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6E8AAF32A94307A8908CA6324D236D4D + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 20575D481A84E1AB52E0FBEF9AE4A236 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = CD46846451099CE17833D585648AE086 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C6637DA570A27EDB37352D9139D68253 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 856DEFC827B515CB9BF5345968668ED8 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 13342A12C7E66227EACD20799E63D4FD + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FE1D77D9A2DB00DF11D49BE96EE17C6B + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = EC825A7D1E7EBC0317C276FCEF297014 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E2A36A4CCE59A358AA8D26DBAE8C20FF + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 599292757F1270FE618818F69EC27C2E + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B80C2E6054ECCEEADBCCCF1F71556704 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = CDE9D19136EC000F6164EF8D1744061C + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2A2C6F891B3A800D0356D2ECE2A8CBE2 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C420CE77311CA0F1651173628C42B8A6 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FCEECFBBE9CA6C7D94ABE3D5F33175F9 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = C9B1E62EADFA676C59497D904C1BA69015 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = 237EC5AC4CA64DB10EAFC536CC8BE626EF + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = FEB3AED937210D5425A543ECC77DFA16AD + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = EC1A7F90FFE18A7384E6B5F30DA547C954 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = D10AB523132F0DFCB7F89D5EB80148C942 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = A76BAF7ABBA866296578E827F56F060BE3 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = DB0B51C1A9303D74F559CB938DC3B396AB + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 1D087D03E6CCDE88F034EF779F4936F136 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = 4E8F4AC460F0A14D3632095232905E89A3 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = FEB1BA6ED7015CE1A2A17D88866D280A39 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = E9020BFFA16CA0145C98C9C7BD917FCC97 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = FC57116EEADA77BD9781452F2C3EC1BBCE + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = 02268235DA395874709E2880A1DC0356C4 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = 82EB11B55495F6AEEA8C31A0BCA68BD71C + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 5D1805D1A0137E94F8C2DF338F3FB33E75 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = F588FC532615510D4246CCAB1347972897 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F09A8F8DAEF5BD76705493B0DC01DF196 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 18BFDF06F757F217B51778D1231D35173C + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0A4164F91A10EAEA6B498F69895BF332DA + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 811116F4DE216DC9A287F2BB86EF85C77B + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C53E2D862469A730C55147B4C3C3A177FE + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DDD7A5F896CB859F4AF52CE543507E08BF + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 80A1B1753382025F8D24115E7A51DF83F4 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D840DA3949F2D36AA8F718C9350DCDC81E + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5FF27C3B0B489AD79AE3BD8DF96C6A9E2 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 23979AFF552136775744E6A3E0A8826A30 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAFE8A72E5F1373B9FCB820BC89B62D94C + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FB5657B20942FC69249F15433C0692D38 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 93BC612B3A74FD5B4DB79BC42226A23C75 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86D7D5CFBE500E50B1630268D8B5993A18 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4C763B7BF5974C3178476253183F3090C + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D40EB14A9264EB34276B2100C8EDA817E5 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6E5572161B410A3D8CF17A10D39A0222DD + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = C9F982392533D3566DACC5F4210DCE21FA96 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 231940C9D3B498A0103361F560B4A6081360 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = FE9DE0658A4FE39D5A61C460A64E8262B1B6 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = EC816FAC8F6C562459F5088347C2C18DD303 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = D1899AC8C34A16A568F537FF59D25EE21EC0 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = A748EA5F576C15C2B2884AACE65CB6A49113 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = DB24251352868E5E63F270B7C2313E4BFA7B + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 1D17BE35E3477E9331D60ADA365B0DB266C5 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = 4E983B192E42B54C785A32570D7F7ABD37F9 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = FE62C51E117D0053F17ABF450703A92F6FF1 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = E9C2B8078986ACC339F889A7F1F5CE349DED + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = FCD0E62BBB8FB51A7F1594A8256E1BE2F9AB + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = 02282414BA729A3A960528BB0753A9B4A148 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 82B64D10719E5B1F43FCF51C63F7A3A39330 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 5DC078B872210F0FA3FABF9C6F216C9F41BF + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = F5E225D7290AAD96EC131CAD0C6251507600 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47189BD9D1E44EAB3208C941B15F7D14A9 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BC85265A336B277AB7F252442334C17CA + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E84CC8DA28493C28BD7F20FAD5C4CEA8 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E2E5B99CF1E5B4E1E95A6BCC00CFF96EE4 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51BF8FBFCE942E4B9C0335EC72786C0DBCB + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD72ECCD2856B7C0FDD26D4E374EEC879375 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079A9735DEB4B0006A4493BDAD56116BFE9 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84873327AB0B6237BC00FBCA04A80F1C737 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F03AE91B7FBAA7A4A2B54576F13C2DED3F + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236E1DF60F60A01110832857B416BA82C8CA + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAECF624A640679ECC5E6BA72FA5CA16DC18 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEA7927AC274D13C397337EEE3C0B701B38 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 935161C2BA7B6CF304BB1841B6E148238945 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8647ABD44A4D185908F74D3E3FFD16FCEE38 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECB9DA15A3633C86F3E11FBE5065B038A5 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C89D46AF4546045CA7224B3343F9BF41E2 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5A0803A90FB2A1F11B9C68A0E4464EC + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = C9F98EDFAB30D37588E2091B11DD3544732354 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = 2319705BAFF7EBC8AC91D147CD93C4A1A13432 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = FE9D36B78AF5CC41D79B956C2A41AB44F9FCA1 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = EC81D55D5F3E073D7E9E0518E65086D07F7B67 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = D18908D0F0A3367D17089EA5BD757E5909E23F + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = A748A828E28DEB0DE01FAB79411DFFD59AF9C9 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = DB24D061BE0A04F315D526F9051DBB3DA1C0F9 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 1D1756BE37310966A4267EC854E1628C7D4660 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = 4E9807C7F07380EFD416D9FCBE60ECFC524439 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = FE628DA0638EC0EC11625A11C530314EA635C1 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = E9C2859D9116B31D3DA324D1C28CBCD895258D + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = FCD0427833BC178B4DD4778D232BF7A631A4E4 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 0228F042B0A755AE09EA73BB60CD0E644370E4 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 82B6B9182831A9B38A012D1D65A88AF4DA6776 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAEBE52D166D03E1967E2830B40135476B + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273CE1863DAD994C1048026202141585526 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3C6C231BE30E69852FD544F0B973A3963 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCBBC1D3456783267B79B4359A916B7510E + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E3283EE6F0FA076353CF775B760321AB05 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22BA840799993E44284FE542DA4DCC04BAF + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01B207B3DE64E6459646831521BD5C9286 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F6BADA3DD4F789CCBA558A0BBC15ABDE6 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED1CAEB76F7825E51E78EFD18225E3DCAA + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816EB409A228281499542BACA3F29E32E85 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F0507F03E3CB94A5885761DE8FE18BAA30BB + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA8C6FC303ACBA910F592D1E557BDDC303B + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC6972C544D12674CDE7059F219270D0E794 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF78A7D0D3AF00D7352DC85B1D0716466EB + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D4A1B7435DEA389B4B3504EEB5B23B0168 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F442BAB29689DFFDCF7D8E3826179A52F + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA3C1BA0FBC28D768FAD240BCA22777DBEA + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C818C3FB7AE4BB0014C977C76861270ED00D + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5A9090169F8A05326FAF574087660D8BF + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = C9F98EB87D2F4FF2E3A1DEEAB6BB679593A771BF + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = 231970384065F6CDD955EE6FB4394D7EAF2542A5 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = FE9D361C2C22520F4FB0F4EAFB2531C8ABCC3D13 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = EC81D566715AEBC39B2D009F49212B1E69A5777E + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = D189084BF094FABCF902C09AD7607D1F12E46A0E + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = A748A86562192C5ACCA653789A14B4070DC827DD + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = DB24D07822F0427E5F7E59E3B0D7C3228171747C + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 1D17560B315CD7DDF1A17357E04AE29A69A636CB + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = 4E9807772A0A414FD8E36899F709C69291048123 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = FE628D5C84AF0519A8EE13F428A716826EF4E343 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = E9C28585340DC1AE4ED2999BDCAD91FBEAC12665 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = FCD0420F268F5728C6A25B4476EC1897A5F8041F + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = 0228F0AB240916D33C8CB81E1BC3C4564C590765 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC769109CF58079A849C9455A4C1FF2305 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA36DC15EDB9403A69C2B66B4D8B1613A34 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C07AA1B578A4DE7658A77D4E13E29DED85 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0CBAE55319CCEFF894645E96A0BFF2DCE + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0C2813B63ADE7985F3BB82FB4756A6795B + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D60AF8D7EC98110DFDAEF0BBBAA15A7EB + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B728D198E5F5FE3761283A448851F980F0F + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF4685E55550789F40498DA3E33DFB1416 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F3973312E44824FB0686644773ED85CD788 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F4ECBEFCEC5CBE7E46C3F050837CEE18F + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B84972086C7B7732544672F0FF0331717B + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCCFC7E412DB1D893A8005804D721DE238 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861CED78AA960F0D1C8F40E41DBE08BF3C8 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C02C262C03417FDDCFF72E821A4F0A7617 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790ED59AEBB93421E56D498DC94C53CC031 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46C641F16058B806A38F4C904959A0568EC + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47B0D522807A9434ADF5BAAB7003020EFD + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C356A65882441DC51EDD09461D74FA33E + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184C91955C6165194FB088401E8E962C6653 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F26EA656F4AEBE733C844A07161DFC835F + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = C9F98EB86B382DD8E1D97766A8E05FE143594E02CD + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 2319703816065507A1019FB7D27B92F07A2D605924 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = FE9D361C3552E5398CCF5D735C7C2BE33A71C58D87 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = EC81D566D4BB2E26C883E3D4EAD46E0F835113411F + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = D189084B1257E3A348CF873B5159A1A2F679C37A58 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = A748A865EC0DB61D31CB0E6E1190106F960587FCA6 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = DB24D0782A2E5FF25BBC07F46BE4F38EF1E8FA31FF + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 1D17560BBF2104D2260944386FC692199A976B0982 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = 4E9807774B7F620D5E24809D595BB597BEC3E844F3 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = FE628D5C6CBB2FA1B6AC731B315457F4A0B39D1135 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = E9C2858529ED986ACE480222C61E3A43809E4D7A2D + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = FCD0420F6E5F30607911B021883AF713B9692F135A + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 0228F0ABBA9F051BE29A11596314CA6A419CE22E76 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC40F146650EC28E75F5A882736F86814E73 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E458347C639BB1E3EAAA579DF55F4A533E + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B8D663B2400D93A5D336394224F7537F4D + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C6848EEEC60CF952333A04F389607D60A0 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE338A80EB6A14CDF51D3DE9FC10B1FADB9 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CADA4C20563CED2F59DBFBA287087C43F + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B726999228CED5FC514A50F3FD4989A7F1724 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48D5663C1BF78E89F108AA6E2D93983DE8 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED3E20FFC1502678DD497213DE09193BD0 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7209BD16B55C8ADB9868CACAFCA7D394C4 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878657B36CCB8AFB581AC7705F2187EBBC4 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA2E2B078E8F64D24D19BCCB577CCB3FE09 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E03D32998A463E2D4EB6AE57B691AC1596 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B4BA3FE7D25B2DEFEFC9EA07D364AA3B5 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF7907655D5B8933883B0725C5BDD140F7CE19B + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF95AC5845B92B3217A807EC5F82EF7F082 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B2533CA44A3002F2990448E909F7FCC3 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C1842F03E6A562A25F44AD63AD5FFDD42 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC290FB669C716222CA16DA7E90215D5836 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F2232B22882A89DBE5BDA59EBACB9F1862E2 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = C9F98EB86B5565C45D664E887985C6F8D427057D637A + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = 23197038165DBB4B16F8CD78EF490629B79896D984E4 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = FE9D361C358B6C6649FAE887FB986A01F2D208E26F3B + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = EC81D566D4E374C0558D95FBEFE2F466DD587C957CE8 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = D189084B12BEE8097E483D636342E69F6C2713209BA8 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = A748A865EC8E2D64D88E56F5E2036814ABDE49BCC3A6 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = DB24D0782A7B8A4A5171D80E217C19CAEE74A04E78AC + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 1D17560BBF8D61BAA6CDDB10D62EE25943683A9064EE + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = 4E9807774B4EA105C1B4C5AE48793D9367FEF8B8CD7D + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = FE628D5C6C63FE91963DC89D226FE1F2302DFDC0C4AF + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = E9C2858529D6A761C238FE747745022909F526B293BE + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = FCD0420F6E341B084BCB1D4EF1E35BB414EB34AD40B0 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB1D126368CAB5D6E3731CFCAC5F80883 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC40977C48FDF9AACC3372B58636315A79845D + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48EE91830D08E89FD8A5A953776D8FB75D2 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85F90E5B23FABEA4C54AAB4731D01B74620 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630105F92E61BA66702C18B74B632DB717E + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30876B669CB645FE1F443D2D5B912CCB24C + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB1AF3AB42A22E8A058F697CEA1E9CFE8F + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECD70CA9099C105761B19109C0698FD4F5 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E7BCFC55008C5C143F1751BAE91F0EEF1E + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7499827D63F9716F9DBDC458565530A0C6 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239437922C797BDEA105A5C88CC301694ED + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7927F0776CE06A0F16F5E1E45BC87C55E + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298591F584B3FE86B1994FC7986968B05B7 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F671BFF301826750BDAD9F69969F2C55AB + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B738B36890ADEC41942E34913422326E3C3 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766470011844D422F4B37EBDDB1D8FE0C323 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE9DA6BA69A43319763B5257DA065EEDD4 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B332BD6E245FE9CD9A8D02E48D03159D7E + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C64812A3FDEB803AF287C8F1C07B0371F62 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC25687E958262AF7325934D3C01DE34DA1DB + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F2233984B2D0FDE45161FE5517368731DD8166 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = C9F98EB86B55275645FF9B67FF6F6C093F4536963F7FA6 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = 23197038165DFAD597DE1282BAB261D5AF895E8C6B5E8A + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = FE9D361C358BCE6A6FB419FF31E0D7CD44130AAFA5FDC7 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = EC81D566D4E35B131DCDD7E95CE7C8F9F74C03FE59CE52 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = D189084B12BEC8E81C95874C5A091E5BAD4FDF42216EA8 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = A748A865EC8E7714DEA5465FA0286FE9EE4CD4163FA06A + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = DB24D0782A7BB0DE9CA577C8960E04A4851730533811EF + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 1D17560BBF8DC949066398482FF82E6AC6C45E310340E5 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 4E9807774B4E1421C304BD85908648BF239C99CE8F2B02 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = FE628D5C6C63477186F8699775D6188418B9FAD6D69DAB + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = E9C2858529D6FE30E55D578379C80EF7B4EAE8EEFE3DD6 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = FCD0420F6E34CE83AC5020950A57848CEE6CBA19C369E8 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB3D8B9728E06FAFD83478D7895D8E461B5 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC2D4E2B8CB34618971F709545358D7769 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E7216A3E5C6CB388EF254EBC4F4598FDA34 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF67668630037DE107A5A570E3970967DB3 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE4A7789F5618B98A65119C742F2911B83 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE308719E54480BB8D4DEB9888D678E6254017B + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C1967DAF995F8CDB3B09FEC2925EEE326 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5C93C6320FEA3D60079412ED9075F1A2C + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764AA6FF70466E26BF096D77E1A931ABA01 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED749720DA3420434385F865032064A130A3EE + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C782421D722D0554F31411B1E5473409E8 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7164C6FA25C684694A926C3AD5E9FB940D7 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6448D3B3B059FC94F88AC78F449D7F0EB + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625E0A4F0F2B9069826E0AE70E07053A087 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733ECF9B9DE3198C57E244BEEB42770C15D5 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419034893D4BAD35C267D4B8B8C6978AD35 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE443E868432850AD7827A70C7A8E096550B + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AAC79FADC6A01CBE120F5A3D22021D09C + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BCA646074CF31092F5B8C393AD9EF4F31 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC25612F55CA3CDBD98E4053268CCF49B9016E2 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391BC250288F9E16FEF9C68EADE2A44923E7 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = C9F98EB86B5527F8BDA81A5B539A64081EE0B27B15BED3F1 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = 23197038165DFA2E532972E2B3E4F5011FBA7E852F5DF258 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = FE9D361C358BCE63FF096B5224A96C34EBF79C8B770AEA70 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = EC81D566D4E35BC94772BF45CD0FADE0597760CD94258F13 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = D189084B12BEC8FC6DAE6001B5BFE5977C4376B1CD74A542 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = A748A865EC8E77BF3D1D081D474087689ADEB148B3CCACE3 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = DB24D0782A7BB0A96148D8B25E91E192DE147D3096E89101 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 1D17560BBF8DC97238B8BDDCAE4443BE8C9B16D65F80480D + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 4E9807774B4E14B5D00E283AF3710DB01A86B6FFE110429A + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = FE628D5C6C6347FC88C4C8BF373370D698D0EAD50AA6B8A5 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = E9C2858529D6FEB545A063F7D56DAEEDFEC0B83436E2A76E + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DEBD6A9219DBEC0C4C736B48986A0D4B3 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39F45DB6EFDA61612C97C5E99F5BBCBB52B + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E46DB165EDCCC8443C21A9E02F7A0EA28 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728DB5689505F653B9882156BA8A561AF9F5 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF6299797CDDD486A5DB010388CF5A18A688C + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE5985C97AB434E7CF00BB6F55BFE17192C4 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A0B106129273B103713FB6E7BA2353F197 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46BE4AB61D90D94275ABCDA50C86033D92 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA8D8C5E9CF2B81BDE8953EF163563EEC4 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE9C881C90703BB8BE60FFE3B266052EA3 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7CA43523DC2EC21357CA92B6DE88E87ED + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C79363AC70E4F77CC466CA23208E24D14FD7 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162D50403240BC1BC9E107D6CF4DDFA329C0 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D3F46973518B62E5504AA1879B948C7A1D + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC990B4AD44E020ABEA246DDA55C01CDAE + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCAFF9538851D5335702570AD2EB2F2E9C + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D173EA8E105C5D17BD96081D5AD33021A1 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C8FB19FE1BF3EE8F5C7C4782F97970E8EF + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7264ED9AA13C206B48F060E58A7F1D37E + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC41C4E1AF065B3CC115ACDCA319C81497F + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC256126422FD989731159CE0B02DFF488C2E91C1 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C971D7C710433FF3A56D70FB546A567C4 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = C9F98EB86B5527F8DB95850398FF83DD043097648FEAF6C378 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = 23197038165DFA2E59B7E359D44E7E0149451A36A0CC9F41DC + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = FE9D361C358BCE63BA684BE77956A508CF1382F63564FFF112 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = EC81D566D4E35BC9F915B598246433E1E5C71A11C0F203FD98 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = D189084B12BEC8FC8F18F8CE7E798C7164288F50BF5666B43F + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = A748A865EC8E77BF1540D38E0037C8863E64E88156F240F991 + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = DB24D0782A7BB0A9E21A602F2274A2F0C27D25115B6125D5C5 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E516A3E78B2B53D2D149FE9CFAA84C80A + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB12B96438F3FCF1914E335DE185151D7E + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE5D3719FAFC07A60F468F18014E543FC9 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52E023C4A7163CC60A343C4C9EF98382ABF + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5ABE004F7F4DC89FB3B30E29BAC513E12 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD75143CC35577D088A1A6CC851443414F9 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E724874B0EF40EED1556841ECE46C959EE0 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0A389FF0B8CD432972CFA5CA6EF51339E1 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E731B534B0E2427BA98772B637ACA1B1FA + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE590098911C9579C86E035871418B7E85B7BF + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A0923AB955552645ACF77A78671812B55E8B + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED0DA4CC12347E74ADD6B220C9637FBE99 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA727DC098C3996138BA0437E8837797B7DC + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B0A3AD06FA48CC01497123502D9906DE3 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C68B1C2824C3F535DD18D1BC8CAC4B70B1 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F85138C5BBA4B92BA3838CF32F0F434116 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF539DFD12765BFBF35B6010F8E1C2FB957 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D361C74D8D08914BAA7368098D5DD26529F6 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F0EBF098F4455205D44BD18D16E552C61 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD0CD0357965C87D32B2B883E10D317AA6E + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BC115E09ECBE834DE08996491A8ECFCD5A + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C123F7619B49E54B54C844FC3F88BE6AB + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B8D3D333E2377DE906E6F69CD57263E7E2 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7D7315A83C5610EF79FADCF2228BBE25D + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CEB262B1F07FE895D5BFAFC78B9890A303 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5F5272CB045A5CC2BBAD616F207BFB6865 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = C9F98EB86B5527F8DBF6510EC6CFCB5320357D9F0540949C0739 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = 23197038165DFA2E594A4F4846A4EAB117ECED95B66022369275 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = FE9D361C358BCE63BA1044440F7BBFA6E51574482E9A6AECB09C + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = EC81D566D4E35BC9F945B977DC230447617DB1780D477922F1D8 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = D189084B12BEC8FC8F96508A7427815238280C9FA9DA7A9EB2DF + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = A748A865EC8E77BF15431BC0CE0B89BA753D7F54ABCA9840E583 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = DB24D0782A7BB0A9E2246316F1D28448B705C6E9591830169A4D + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E27FBD7A96D99757BA4CDDC065CFB4FDD0E + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E4B8805F3953AC97F3B109FB338A18A39 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE2520270F4B989CDDBCDDE1C6EC235673D2 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF4A1425C4E74F47A6859A5BB9CEAEF6595 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E1641F51D53E5C7F73EE0A4906AE600ACA + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D8094D4ACCC2B74F460D50C5F56E93150D + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EAC80B30DBC2279DD40E11C3107040A6A5 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB96D259D105A6C1AFF806A0AFA630C784E + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E703FEE6662C67A32A80E05866EDD9AC81F9 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE590058D7DAE959802FFCD4F0C6AEAC90917F7F + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A0920950631EA4B12FD863BA289BABB8E1022F + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED51538C82438EED4CDF12AF9FE004FFCF85 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D62E9858E67C364EFE9448A17E27CE8013 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B064ECF65F830D5F2305DB4659A821443FB + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0909B3CD6AC7CDFB1D4E98ECA3C51FD26 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F61695555BCB1E898AEA7D78DFED1E4BA4 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF5599483671D4B8A3004E05C40D5FAEB14EF + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106F5813202AB368C8E0903BE575E8E2D8B + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7C1E7D6DF0A2FA6DF3D27558E8984FB2F0 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04B4C0470B1DC5FE5776368C8674220ED59 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE591EC307920710D53CF7DF260FA67C57 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C4907AF8DC2762E0D40AA1E8F4B00E0B89B + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C6ED7EBDA2D25A3A35E8CA840B4E4A177 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C8D36A6374AA48F0908EFBD63C0C949ECF + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE338CBD4728578C342893C69B8E856A1573 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBF51929594DC98DDEB77D8C0E8E6022D73 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = C9F98EB86B5527F8DBF63ACF0E816185B1CA571203DCAEA251B874 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = 23197038165DFA2E594A328A5262B43CF7262BFDD99D4DA4E7FC56 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = FE9D361C358BCE63BA1032A8D6687A7940107AAF87EBD3CB7EEF72 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = EC81D566D4E35BC9F945B1CB3A315A3355B636E2A58F729182453E + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = D189084B12BEC8FC8F96483C9F71F1124B76DC648047726CD1C616 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = A748A865EC8E77BF15434B69AC4ABA83AC7D2226C21CDDD1FC3D28 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = DB24D0782A7BB0A9E22421F517E911FFF648169AA8144F6CE3B837 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 1D17560BBF8DC9720E271247E7599B6227655583977271FE036CBB + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E56BFBE888679A5B4B0C51320FC65B3193A + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258BA539B9E80D0C9E09B2DE1EABBDD24203 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49F8821CDBF1941E57C8A33A783E05705CD + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EC21550515C6B7129B2A866D4A3B8D67B + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B7DDC3F5A985A7274381EEB194C59E6F5 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4EFEC8832FDB55435B738A674A92D22D62 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB9716C54ACC339616A90EED101E669690627 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350E6FEAACC4610E23E23915B14E7DA3F8D + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875E8F27E31744616EC72D91776C2020CC7 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FA4C188C9EE4D045FB3704ADCA85C3E268 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED519284C43C0D61A309764C90A98B2BE3F80A + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FCB0257C6DC0C4B71D333987969279A63D + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF7807B2C33785E74EDB3753CBA2B9EC8C + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CCACF09868C4605B7066F9B6B3802F89D8 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69C3AE7D0D887D943390D6F2C0AAC00E52A + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF5594124759816B18DA79C694416C5B74B32CE + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B04CDFA1F2B0E427CB00B8C495A794CC51 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC0F430BA4613725148E01C42B37EF17A46 + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5ECD358ED0A71446A0BA601A639A8A14F + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F45C13715973E406ACF4C71348B6B4076 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C0AEC571CEA60945621554280E1B75572B + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D48AFAB4181355D9013A2A0C0795C2309 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83D82F45F11D129B76A4BFC2363EE7429B2 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33285F6F4FD0CEB34931EEBAEA43F5AC2457 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDCE56E4CE153E3BF914A70FEFE3AC7FF37 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = C9F98EB86B5527F8DBF63ACBDA30F68481D54A323C05167029DB2A4D + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = 23197038165DFA2E594A323B924D6E0B3F39133D689B0E6D90CE30CE + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = FE9D361C358BCE63BA10321CB09ACB70A45391A9BE91A81D31C2A17B + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = EC81D566D4E35BC9F945B1C7457D62DEE693D0361F289EE60C4B4066 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = D189084B12BEC8FC8F964867806AD6FD4CFFFC768518C3C2D4245372 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = A748A865EC8E77BF15434B10CACB795E9CDD941C291B1BD4F10610DE + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DD94BA13DD0368728D2807396C723FC56 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712624768A48895E251035023FF5946BB66E7 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CCF7AF50FC6122398C32E0B7742C86930 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B215B9F9EE04910B692696B2900C7AB5EF3 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5F42E5492568FB805E7D8DF08AF3BAA26 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDD1CF7D7FC2985F383FD045D465A86D356 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B18196D4B77DA34FDEAC4A7AAF0C8370CDA + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E52D6051538B68E06279CBA11669F25CE7E + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3EAF5C218949FE981FD2797493E2E862B + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E7035055A522BFE53086B2E7A020699047AB3C51 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D9452F39FCE1377E59D6F442107CA206FE + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFFA9A24C82E24FDBAA64F3B8EDC5D6B7AD + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D732A91894E26ED9440B7838A056FD9C33 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC2691D6642AB3EEED5B62E0186B5293806E + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF487E36105E2DE0EE1F67F6E9D8751E04B0 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC396D910D880CB41D11102975F2C87F95C6 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD55F19AF6AED913F32EB9CA52678EC3C6 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419B73ACF3EB2694087ADC9A10EAF0076DA8 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B020229D06194B7B5A08ABB8512625F93754 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043485F62F90D1C491549D08C9A3BED3C58 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA5767AD6CBC75221CA65C4C9EC0003D51 + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16D9431004186D00BCB90C19F8CBD287A0 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08BB36FE30272EA2AB6FABB16B7297E5FB0 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7B0F036F81ECFBBF7CF4A97975BADCE7 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5F401340B1D1E5B0696180AA6C9F8C1AE + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284B5909D91B42C0FD2392998D0443101D9C + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8F758132A98B03B144276669D8F1A6941F + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = C9F98EB86B5527F8DBF63ACB57DF00D2427859F33A932751CE8A8C1D2F + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 23197038165DFA2E594A323BEE6F8415F69A7731214210A7D020F7C2C1 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = FE9D361C358BCE63BA10321C6CF651CCE2A93F031FF09E750ACB499C41 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = EC81D566D4E35BC9F945B1C73698C8A299555A77B017EB56304FE56C1B + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = D189084B12BEC8FC8F96486759533E7D9C8FF9A516B6FA9FE000D612D0 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DCF5AA4E75B073778E028A68B4D6769271 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1BFDE707BFA7971BDBE3E183C4D7FB66D + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623A4719B1D8113597F971F35F49399F6850 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB52E00AB1C8928D7E9AEEC68A2A0515342 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F949B792C2E133578A8318BB51D126F340 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D5274B8A22D3336B59F4508E3BCE675924 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE5DFE573C3549EB8E6A9E6FB7E731DAB4C + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189B7619B1F1BDDD32260EC2B2CEB32BEEF3 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E522415D2ADEB646FC35ABD04CACD996E00E0 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B42444F592C83FB174E0ECB79C01B594AD + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E7035055363BE74462D84FE1E291D4D677CE3F6676 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996839754A1705EEBA97908975621B79C74 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6D297D577C782CCB6D17694147B186C34B + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71A96CE2318813B16E4BEAFD948AAC822E7 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266EDEB0C685E9E149664F867842BB1D277E + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483C534F79B578CBE908DA0BAE763820F2EE + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC39703DD49232260E889234C081E480827D7C + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD417E086F80336F71DB8165C3C2A741CC41 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC3B5ED53322A88DAB86B2C820E03021605 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209CB5B0C114611CFE8E66E76B053D32B2AE + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F2EB8D39167CBDDFD5D00B09D13B233209 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9AAD0F9F3B8EBB97F3BE9837079AA06C8F + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F1669C33EFF3203AE5E60751E6207706544CB + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2E65FB2C410CDB3235BCDCB5094656A641 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7E5CB65A6581AEB95A56279279929D3622 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD37D5A994388AE049359ECC428E30A267 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB96BF4A2FDFD1CD547387EF0D1F4ABDFC1 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9BDF3034C6A1F5CE5A5B2C99A1C7B7CA0 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = C9F98EB86B5527F8DBF63ACB57B1DA4DC8FD74D91045BF24FCE0BD51E10A + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 23197038165DFA2E594A323BEEB3D610B631605C23486B8FFF0B87E18057 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41D9F4FAC77F7683A7E171EA46CB8DC5D5 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = EC81D566D4E35BC9F945B1C7366524931E0A3DE9B94D57FD5BDF06F9FA8B + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FED2803E2AE66A253AAF0CDC2B5C5BC63C + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC18301F3096F7CBD9608B29DEA8909B4E17 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A18E41CDCB33FB5DB1D76AD7C06E2CC881 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3B7B0620FE51DD5EB3C6DDB48E0096C08 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB577D87AE29AC9DB3F58A16A52861AC5B23D + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93E4B43B8274FE55887FEEC0E769141633E + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EFAD4812FD1FBEAA611D87D690F3559F8 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE537E6FCBEE7B0558B93E3F0D84416409C0F + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9E54D9DB9D5DB3AA5122799963576F564 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7C97FC2E2FC0DC49C2BEFAE940E94DE59 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C193589EBC49851E8228C6A589055A6F2 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620986A05613E97F14831F73EDA548145A7 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA0E0BD5CE71FA235720E108D946B793DA + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD8EE48DFF45CEFED5A35C9882611E0C55C + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABD5199836847DCF77F177D768BA929F976 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED3567F2F3EC62B101D7C62B20FB52231DD + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD382D9C5EA67A675234C5D5BEEE27936D + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E9B919A4DE8389DCF460AD41ABEF65FE20 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D8B609727C8E1EED37C0970C67880AE8 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC38836B6F1273B9471E05C396622EB94966F + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7B2EAA38F69C86C9877323A02803731851 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F2488818090BBCD375DF55048F8BDFE53F04 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A429D0FEA30FCE384E1FAD4EC72A135821D + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690890B47FC40C672B9E02520F9B81BC74BC + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA1F40F3F3A6A6071685B59B16EFBCE32B6 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF26250A6966A872B83D2A14BD2C6D798C4 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87BD4001FE451211A9EE97546EB49E3332 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9264CFFB8048AD472D1E0497D631DF0270F + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DB2316BFD268A3EC9FDD3EC6B8A288E171 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = C9F98EB86B5527F8DBF63ACB57B17444510FC8C1CE9A316D7D4F8B59BADC40 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 23197038165DFA2E594A323BEEB397E9AB7EE43889B8C93754730F643832D1 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CCEF9E17111FEB37C589ECDB7F7A5FAFAA + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650E843F0CDC1C67FC85A6CCFBB8A1D86F27 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DAE7D33828B36DF83899AAEAC67576C57 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187AEA1AEA18B17DD5DB151854289F4E38D4 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AC7F579F67B0AB53F16B7F2D9CD509ACF + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3412B9B7D59D3A26D89689C9BF02525E713 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771AF2D89F19A9DF52589E2161314E3EC40C + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB432C0E81C752E71DB8267C54E56093358 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA53407AC7BF6259CFD38F1A8D4331E59CF + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE537955C9D3DF75802E341416CE65A2616E138 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA953304F8CF2B8F05D31F126503EE6E96976 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E7B9A4480C61F24F0DC1E1293A0FF7138A + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E6537D20F3F9346263325B2D5E1E823D3 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E951B89C7930A2214F9BBA3CFCBDB629AF + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA128346A74ADE1DC03CEB0CC4DD14440928 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831DC333C013F409D43F3EE90A0D9C56A31 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA74D7900768553E478F14503DED2121FFC + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D8CDC4EF098A1C20D9A1AA10D81AA517B + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD2493FB841414F02AFD09C6DEEB544D6B47 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93E60978C2458E0EF1C565737F3EA7A8090 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D63F77CB571AAC584929C46EE25BF24507 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B127923658967F63189269EC13A457F5C8 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBEADB521740086C4F2810F8A796A63E295 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3844D42DFE8D6BC031225AB117795AA96 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422BE474E7345A60349880098B9CC73CEFCF + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883C6387DF26BF0495FF98AE6EE426B797C + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198BD561F9E8FCB1949924F534F9D2000B9 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236611630F87AFC9552A5CE7FE59D43A8D4 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87265BC92CB41CE75D607FF792E210FA1892 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C3B952CAC3D8BA81C324816A49F581905 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD47D4F66ED2849F5C3562967F82A883680 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DE5616DF353013DD94D33D7300867C1241 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973AB01B11EE81F3A896A702B347064A8798 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC7602D2EED44604C600CF7F2ADA5EE1F7A7 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA79011357B177750A47D40B675341F099 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DEC6CCE9D154222DE7E929AD02458C08157 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4022DBFF28D27A819937F055742056DAA1 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF6F7292395F07C15BAA36501C8BDB544E4 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416C9E4D4FC11C4C2CBFCD7026167D49DE10 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A70B1ADFFA76E574C0E43610147C1AECA96 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48E6D2901944CE4A8A687041800B81401FE + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA58893C23BA77EFDEF1244E09CB26EC77212 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE5379570826607720477BF5D03A10F4288741D25 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534BA1F7AF3706800E5A43153EFB798C9861 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BA944DFC6F5E29077A4F944134EB5123F + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E754FFB5F3192F32BDAC5E38BC5935B2F41 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B09F75AC04037748DC6D63B4487FB940B0 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207ECA4083541524376886CD1DB30016B2C + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB2773C46432C0621AD8992347902E1123 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77A19C87647749700B60B257F42F282D24C + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15C8231198E1AD1443B7E3E7F6B5C28CF6 + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B62DAD7836BB8AD559B75967D1E58239B1 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAFFE1F9497FC1441A42EA79513A4B12A76 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F25953BCCCC7833EF451C720DACD910CC5 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E2AD3548FD2EA9FE2CC9B6D9E410A4029 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE36A67FE170C5B3E40BE41173466B1D986D + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3163FA1AA1115F8FCA10F20E4649A911BE3 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92A8AB259F885F761CBD44E814521CB9B0 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBA2ACBB62663034593FC6DE1F69C78070 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC749402A15B9C306939588FC2B9488A84 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A0F48A330929F77E2894E2BE8E7C64A655 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F76A35D299251F95B431F4FED39E531DF + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C97800ED46590A73F583BD34CA649B995EB + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD4825E23BD4B138FDA0E6772916E8AF1DD50 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC945DD5542393590389AA08608BAA3647A + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A56F81D2887F4B591BC3325293AA7073727 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5693370660C507E75D61F18DC8685592E + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA4382887994F9067C04AC69F4DBD9AD6EBA + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCFBA8EEC5F84047B0D14689DCDE53FC41 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094CE7C859C2230B0650D485D27872EB9E6 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61CF76F760A6EE2E1DB94188E61ED89F1E6 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9C25DA3A5CECD7A4FDFFA8D8DA9DAEE23 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706E06473BF331F1778C2676D2140273BEFB + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD456ADE2B896566AD02E9B4B45E236118 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A7B6B0ACBBBC1FC0C948137FC78BB9FA63 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707DF3B5FAF39097659692917610FAD8C8AF + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76A1588C3E87CD072660834DBED7A9CF2B + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBCB83814D85A37F26592CDBB5DE41A58C3 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F1FE882F235A32CB30D3BBF9E2B4FF299 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C26F4126C9932DDA88D2947092E7FCEBD3 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA120759AEFA370112EF06D5537E95014136972F + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A5BAAB112BDB0972926FB3AE12A7F988B + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF76B9F36977B7158F1E286FBA83499B271 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D1517C0800691DD84AC15F3979C271A273578 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620E7AAD2BB3C9353E5353AB1CC21DF8EBC + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF17FB31EECC1DFA4BDB7365DC0C18E91940 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F2000C63C7D19AE59D5F4C059B95625C761B + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96CC77B0038B20B214D16DD0D9968C95BB + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BF378EDD840ADC9F39B2C65E021D14154 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FF0781FC2F4C720A1481A95AAAB8A37BD + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FD2D9E5004C3497CE014BE56400281AFDF + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF23D63C0828F67D4157ADF23DE835D7BB2 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77D031AA0A5F950F129C08EC3115A927C1 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07DA30FD9FA53527291509653DFAAF148CF + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F46583AC0D2991296413220A9F5B379678B + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974AA9174DC9490E0389819DDAAF6E4E3711 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0225A021215185C3B11DFDDFE18749BB4 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC9538F1FB5F7EDF0654B05BCC2923C994116 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568FE1B216B70B6E164532847BAD2F2742FB + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D46A8980622D82DAA320870CB4DF6FD19A + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E83038C757442200E48A6E02CB029B8D76 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD41455130DC1610C6A358E7B775E40C2B7 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FA14EA928ABAFA65EF439F429DA3D596CE + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C123C28C36B0FCC44AE145B98CC4F854C2A + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B72464E97083AA477574DA6FD3640C5165 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1D43B1BD6FD6AF24CED53C24638A624D3 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD045910BD2536A294FF4C8926B06A8D106F + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73CA11CA4058832A5527B440A1C3173E4C8 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B0A8F34BDD8C6207122251FA6F1F5D1FC + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C446DD39EF655413399D847517E1AF46AA + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC13A6375558EBF42CA9E2CDF518017A7466 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C7E0DF29C011CBD5CEFAE5B4BE80429DB + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C2068F5DD5AC9252575E97E794AD98E1D6DD + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A0790C79E7A7177834CEC12BCCF89C9F9 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A96065577377996B8AC480806A6C82C66FE + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2F57C29A1CAB60DBBA5276BF2CA3BD4C3 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FEED1DEE49A33D750A902CF465FB3D541 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B6200511E16840C21B66FDC24E9360FDA1EDE4 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF17934C6BF59E728C632A3D76EC4A38BA0ED1 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005BAC06FF41AF32CC81DEE31CCA168D5BC + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E964292936B9180AFB0EE29F9EA36D2788710 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC517D52FF585D1FBAD681CD693A7D3362C + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDE04B97360379F84F753CBC6F9B0E69803 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD00BFC2D5626E53422FD66CF9C85192AB + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF21580F795B5C871C5636BF998C19F6EAE7A + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C814AC4766C231429C5E4C3335FA218115 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D1D2C0D26C1A62F0AC7CFEA0C3EE40591 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F46687D86B3657181DE8E9D9A35DC69A04EBA + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D4C410CE3B9A0F85A0D50E1A85675F963 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA86908DB4D1DB0216EFCEB2A88334BAB6 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EFF4ED34E921B0C534C713712EC984FA03 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C2219B8A0C1B88FCDA0AA086C4C6CC51F + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D4472DCD3E830B9072F6EDF3D5AEC35F924A + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8888B529E0956E1CC7F1825908EBA71B884 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD493D3A6849FAC15B24D2396AF1C4F4ED6EF + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB32C6B988388440644082F1A6F4A0AC02D + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE0A1F92EE539F21D206119A1AD04A89A9 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786E051D266F874477521DA01701450E60F + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA183D5706B5EBEA63E67E625D7A23E8DB2F0 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD04635F39F11530084E7F61F8E1C6D8E4757C + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B40308CF8BFCDD07DCF9DA70067BD4E99 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6A825A6F8C54DDE7492F314980A3C03FDE + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48ADC12A0ACBA06C16922C75BC4DEA0E5EC + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FD464F33D2AEBC7CB644EC7040187B159 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B2AF542953A076CA1A2BA5DA70CD01DCE + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206468CC67CCA55C81324613A8B4EB2E2CFD2 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E5A8C97D782EAABD1F05DA7230B0FCED4 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A96618CB370D35F74960773CBE5BC0140AF74 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B1E29FABAA216CB3BE1E956030B1682CFD + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB2380577AE1E54E1D59C9346170153657 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B215AEC4473C93D79934EEB33066ED8BB + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF17939032A81BADF260166D5A0870A1F12A4499 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005179F628276ED9E046EE6312BE0CC400CA0 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BE7C50E3FB14DFBF6183EEBB6196401A0 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC5340E315D158A6E313C8C0086726CD6CA46 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCB7CA7D3CD7784D45653C170CC9ED2867 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD306D26EC9518EA47E73A9F25B935090B4B + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154E88B27C163669B95614BA61106B195339 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B67ADFD4F66560F27C89F83847C670B94A + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E82F6E2895D332136544B70C9DF798CC1 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A82E02E6C29B66BB466EF223A0F1547B24 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D85DE9503E01C6E81BBFD076D3BC9FC2F4E + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05F4581BF68B8B49746925D335424ED23D + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF56BC734FC7716FE1F318C64BC39140BF98 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C95DDEB9F8E18B372D5D6BB6AF211AF51BF + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A764071D9D776C9E8B7BF11DA51FFA4A3B + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C0A07B30D24A79B8FB2246E8432A5C37B + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CDE5145EE86ADFE98B311EB2A518D1DD8 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4AD70C6E293DD6CFCC5CBBB2CFC5E4D4C + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE9684B826699859C69BA177869677B025A4 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9E252963483AC8BED6B320FCFEDB3BEBC + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833CF37ECA1F6CE98D78A48B8B639735295D + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F52D0159284C881A4E4D1AB67C53E50A8A + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3D567B81AEBEFFF64AA5F87D80FB39D5FC + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF10D0E9A00503738FF087946F01B8590D3 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4C1B739987E48EEE4E6427FAD474AB6972 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFBD680EC386EA65A48B987433C8AED316D + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5F64B7BF2E71BC1D9B6482A24D3C630F39 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469FB8FF43A5086E5FA37B4904D143792609 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E353F66742E5893890E8AE1E87B588A7408 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D421F6B16D533AFAD596AF98BBC6AF3980 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C2F866643A5934C85ABCB85DFE9F22CE0 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB04F990117BCC6C33C9EF00944F4323809C + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B261F7625892D2103811099A4E8006E0330 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D9DA29E78D00A826371100551DEA885897 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D6CA580E1434CBE6E7A2C56A2EA600CDE + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF59A76E412BCD31FF952F406EE0A1DE847 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E710579BB779D400B59FB66C98DDD6E26A + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF21C0F62CA603E46C859B76A44DBF1DA9 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301FFCA3B757CB93D1899CB85B90C503EE92 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA04C9117F14A3A7068041A451A86F8CA43 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E69A52DE16AF6CA8671DA302C9145D999 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C30FD19151A2776E922F8ABDFC107F99A + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D50121E22F96A7E7EFE973D724FDF8D193 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D85872B6956B0611375E3160ED6526718C3A9 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFC989A838AEACCE47FC62B6E17D39BD23 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF563317D8CE0230822F499E9A5138CDBD2F25 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C952570AAA1453620EA20C28A85FA569B855E + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A7060E75CFF298363A3489177F5C43B328FB + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C27FC458CDB664E47E431AB887267FFE3ED + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBDA3F56E3DF9A87FA1CD66727C54D7035 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4802B1CD63D1F29760E05DCCC3FB3CA9D81 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C628DB083071161CF5EAA15919D6442BF7 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED742280F1DE41BCF94D0843CD8FB3EC65 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C33CD5F5A3C57609EC751B771E6F9D5E844 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F54972B3C5682F4C26B933C7324A04D1D93B + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4BFBC3E0F0EB18D8ADAD9947136BB042A + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF1148014AF70D24464328255ABE113C51533 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC20EF37D463400263AE235D0BFC164270 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB77EAA4FE85FF69CBECC31F600B39BE001E + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61AA18B7F8557B18F872D18EE549D3CA0 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F830A8F49503271D3F33CB977F2F1E67C95 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E3550C7F5B9F38DC604A94310755EB5F33E04 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EEAFBF787CCEA79F2D5161D3E8C186CB54 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C47CCC72EC3BDED9ECBC09B090A12EA9701 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041BD48FE382C3E67430711D88CBF7D2576B + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B12AAD43EEC304A19D5141A23B3715159E + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CC55C410D3D7B4C5389D37DF2B1380CFB + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D510278AEBA32048479B7E4376D5884A253 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA2191E5B1FFF6934BCC8E7807FBC52806 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E748B8D1C1953755098663474EDAF4912FD3 + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF796281E32D8C0C5F037B36A23D7397182C + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F71F4CF17733849F6B2FAC8DF0A9E234C0E + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D45D9E63F930F9A26037ED43071902ED1B + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E024380FB61E668A756CF7462B2B5B5E3C0 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C262096DBDE2E15A032E3051D22D2580838 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573BE51A560656EB548776F887440AECBB2 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8456598582DA403F5FADF47C6A04321F1 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA28FAE7A81C716837767BAC64380180482 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B12057FABAA3320578816E47BB1B99C5FB + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E676208C2034654E87C6A15CDD6524D535 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A70648D4C3D5BF865DABB92F88C3D7D2B19AEA + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275C0C6BEF3B3AFA4DC5BF05AC29BAD51383 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE213140ADC9F8DF705EAE296AE73C99284 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A39809A879DEAB49E01BAEB03EE6E5AC3 + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD720D2F5400126CB0B1E420F1182292FE + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B5C705B05B5ECAD94B0294617E911336C + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C33008BE515CA3472EA328FAAA1C990D27734 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495ACE8F74D904A058B99B91EC571B64EE97 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7E411CF4D36FD4046F532B86B60C4A23B + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF11415B2C2FB105B6800A8B9255757C8D9AB68 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC02AFC1062B863E322889057A81D794D277 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB77065DE2B1BC1F7C2CA36BA1EE2A10C0C0FB + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F8AB2AD7B214B35AD0050FC351CA4FE17 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8317EB8C333428360B8F6CFB91E7C0375 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E3550016977AF4B1D0DA096A03B2067CADAE615 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E966F9C8F3404C3A85AD8A252AA7CAB1A + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BD8582A333858BF06F9318D099290037B + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B067631467B017714A7C680EF559D760A41 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D6BE8E83078065BCC24BA0405D0A53AD3 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6FCCAB479883C6C7786E8A8F270DE2F84 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC8AD80042A797C6705D99DEF4CBD6163E + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA40C987DA02227BF1B5C29A69333ECC8801 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E748550EDA251E2A1601A6E6081A26CCF668D6 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790DEE6BBA683030DAF526E24C442BE7D709 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F7167994AB35BBF8EC760908271A060C1B502 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5B92C0AE5715EF559919CDEFECDF3B25 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8C692DA02C590D414B11A51ACD1020940 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C263372C5ADE71F0BAE283E366EAB2E6A9694 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBC19E09DCF84F06A31FC15794F2FE2FD8 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A896F241287E9CEB93CBFFA0A88F0D32EB3B + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A69B67D8B97671BEF07DD73FBF30DA074 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156E09CDA071F41CE6394566EA56921073E + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C0F95C33A75DDE3682B2D1BA7ABD08FE2 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488AED488A9770E3A620FF697CE54F7AE6C2 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA59D7B768A7552CFB1CED8DDCE257D4908 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE23998CCC6CD5C55D63D03F453D1C35B1C47 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5CF3C2301E972E243BD83DFE91D5C2E52F + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9529CD25C5FC976443016CE6A7154F62D0 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B289B35577BBD106505CAD196359812D732 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8B56F05D0E90530EC5AF99F5E5C48BFCA + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CEBAA575001577C688AECFC376BAB6139 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CF7F90D8B4F59D20429688297D853CEBBE + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF1141588FC0CFF293ED1556435DC55B8C9BD85CF + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC021972C1E1337C074065BCDAF9E552C1EFA4 + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F397E48768C4B651872F0744B76851A4C8 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0E4ABCD1E921010DE7D06659D2D128B4DF + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CB3BC2CB79671AF3605893D8F5758A9F9B + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D1799F7518EF53427C7A6051114B2FC31E + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5EDA89ABE09E33FBF5EAD46579B7841E01 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF7FD83D4D9531005E98C2164DDC99B192 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633065E6A3897CAFD8E15F1ACB0128393BD + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00815040806E7D623AFD2C097BB46C0C9B + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4D0A82671F86C75B309AAD455B147EFA0 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FE2516D90778B8197B27C3F628918DDE7 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044A6F7233A7B38641A1B35775EB5DD13E8 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577EEF0B80EE0DEE4FFE7642E134B1EAADC + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7ED6F8BC789E47BEBC45FC881298E375DC + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F71677846156F0577AF04D08B84646B646CC180 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF544775A07D54D5FB347E31466CB68991E4 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A09C9A87231C112056775AFF1935759110 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334EDB97F0FABA57B3A5876DE3184EBFE9E8 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE708EBC1F39F26097B9CE67A40BBE8A74 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DB9CCB9F69FDC74E8653F6C15F0F7D1D1 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A3716EDC1F3F39EC5AE2C10E1E64548C95C + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA9AE59290B68599BA4C8766B092ED1DBF + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C695B9E2CC714FBDB84C80C2E3A2DDACD51 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96564B70DF207052CF34403510AE3B8AE9 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93FDF111795C6A906BC2CA1CA4C775B74 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239883A5D5368B370D29EAB723A1F07403D3F + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C8207A0D9D175D05B46FB242BDA49069492 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561E908E52610E5B364B406954B12474717 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B39CF5835B6CFF368188AD3AFA43B7D7D4 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8186BA6159681BE6FB44E20EB7E0D974B5C + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE5F54B301ECAAEA75F6B68A9F47162CD63 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6A3D0CC5DD82808A7A0B57F2728AFC610 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879E72EDBFACA233323D39200F6831A1689 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC53058C24293CE1F55A0FAC112C5A2521 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F39493116C64EE15BECC54B69249DBA963F2 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2FAA4BE2E4CBE2DDA0202A0E9DD74644A + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC4A242711C02960EAAF62182D619CD4A0 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13A22CA9D381CD7B1B557444559CA5DBB04 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E14CB4F2BF7BAEA40BD0F6B3B25330EB060 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5316ABAB983339E493147149EB211EC7D6 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DBDBC3379A50F44A6BB16B72E25F6887A3 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B64136A73249189D8068CE5F5DF0F6074D + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F749025C3494AA4499D5D338DE0ADFD435 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD20C18FDE916E0B1C355E8C2C95F57532F + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA40447817B131BCC8371BE053327302FBF81BFF + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D96C6F7EABBE692C162F6A48F49C951B1C + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E97E886024C0C93A50F44428009B1FC32D8 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F71677841ACEFDE890BA9A36BD0E1C898A038E33B + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432C0BA26B073F0C1ED8ABC5C8E9BC36ED7 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B6974CD5C34B2B62754050E4CE89DA80CA + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D22A4047D5B4A838AE796733005C79A92 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8F9282F3A06F8AC6D701D7CFAB3F33B559 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF068432288AB5B6FE77A81E530F4E7F666 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37589B9DF02B50C503A1D34A8894EF8B9A3D + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95EB1A27F864129C59A0593593DDF4144E + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697098DC8F891581B9FAE4CAE6664A0FE7A1 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96240DB61E54F3AF6BF1A36B3B9844FA7B79 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93AA83CA958A11B8910A80FDCF75BEAD5F7 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881D46D74D0743072F832544A051B853B984 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C82932A53D510691FA60D60F33F336FF36F46 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C682F63506450011B04745CBF35967D2A3 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33DFBCA7AE17610E4BCB70476DF02620B2E + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A81806B4252AF349DC11ABA60302E935F7BFF8 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE5953A19582A40141903324D229A13AFA307 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B79380084770FC2C03AC334D32BCA2F45A + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A387DA9AB0E04A1EACDA8FED018086D09A + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC30F629BA9ED59F64F0096EF919DADF5E6D + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942F0373E08E3DC41F62E4A190CC0ED2C2C8 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE25313B7FC5FD7434BF4D66E6BD9CED905AD + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC59C169AE65D4CEA94675E557824B41C05F + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF74054620CECA335E11229B115DA0C03C7 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C42D266AFB1F847354D2E122D325F377E + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394B6236A45E1A4B35B51C229099565D0E9 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB30E75041505E1CC042D85CB41473C51568 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B673E17478DE9747A33CD222E8FC331958C8 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CC557E0A491DB9CF146B8F2853231E8BD + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A943631A549ECA7C87FF1F6C5DE2E70505 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C929EE8926F040104368055A46C912551 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E59BA17FA0F541B8E33A5AFD965737085B + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971DADC14D30809C5B6299F5F01D92A07F97 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F71677841180A1FC07556079B35F303E67E44DB83F9 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A419EC3FA38003767099D35D8271329603 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E75353902332F6C508A6F943497898C6A + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D275D171B435E425F48D3E0351F0D862144 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE86408758E2DCAF2EA0B2FE362FCD4502C + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2A3F55FBB89B2D7013B60413D6B8F616B + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583BCA965CCFF24465DE9DA502F80640FD7E + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4D7CFE1DF979E6673AB62B4E3C4EB06BD + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059583EB2475AFDC080C2C8C4B8D7826609 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96248546A14094D44BD3F337581EB6F2926728 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A92B9520CD6A23F7E9D071B2A2485695C1E + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4BAAEDA517D5232777F8E6BFEE1C403ED + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344921C0C53FB535E6EAD28DBD67082A69B + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67AFC542B2916246378B360F80107CC397F + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84CE573CE333F0D8840873600E09491B15 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A818060160A044633CF3B82EB63794F0E7771E1C + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449D494AA386F7FDC426FAA038AE03BD2E + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B79479B5F8CF42D14551D9385A60A1E6105C + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36C2DCD81CC15723883895F20B0C12AD84D + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308A10462A086B2B31E9654664C88025DBF7 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1D3B482F246796EED5A501526F792C20F + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E581E3D8A2995ADF0E9EE95844618E43F + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A1175FD5F9CAA0B3D0422EE62B817F970 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF7956338354623A494B1B0A70BF40BE729C2 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38F98627FD8A4B670DF4991D165474A35D + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF539428DBB4BB50A5433D8D5F3B67987A99613C + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB30405540F48ADF760F06E4D547FD1F70B982 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376E718819BF87E291941B27766F89F4C0D + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF730238789BA6C2FB2DEF0658A4AA0731 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91BC3E67CFB63FC7E57198FBA86D80952D5 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E1A248E107C1511472C32CA29BC315EC5 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E583FBFC3A21FA4C589F57A755D101DC9002 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B35D507E92F9F2CE9947E1A2186318855 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F7167784118916E571E6FCF54BD4D22BF266B563111FD + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B2CD54B3F84D365E45DA6457E9FA3249DB + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53CEB71CFA042371AB3BE526C51D40D4AF + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27041F3A4A0C5FFD2A8DF82E3176071B6F37 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C86A2829809635BF2A7BC57DE3CBDB123C + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C999FF341286243E4389FB66FF901228EB + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B189B47E914FCCDE044EEED62D452707690 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B410BACA38479376CF47F6A864D1607EBF2B + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647CBFC3EB77BF1D7454E7AE84DF49ABA0 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96248520D859191AB2D491C056EE2B6F732445BB + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C6E5097C1D28E0670625764D9D24B940A + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8CBCBA6211FB13334C3A9BFAD8FDA3253 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E0EA2CF9A3CF91D4916EB7DA4E9B3746D0 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A63193418BC2692898AB17BE90B840F2D19 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BEAFB578C59D7690B880322A10CB02B5A4 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D2DA291A44C8A07A576F66BAA6CF857B56 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E90110F447C180CB4882E0924BABD5404 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942AFAC7F7222077EA117580341200676300 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC952770AD21DFB305A54EDB13AF61E3C09 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA2083BA23C813B82F4BC58628FF983CC12 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C08A85E511FFCE96970CCA7B66F07B4D77 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6FB133959EFA6FDAB1A3AB1F9C1D8930CA + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A28A86CBF40F1C53A7D0350949C90F6AF44 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C90B5EC84619231BB284DFBCDF2347EF41 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E209100082EC954407A0E17BBF7EE6FB31 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285DE74EE9F55AB4450738F5F1F853BA7C69 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC2E99B90B9ACF97BE0256C0CB5D972604 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B56B698911F82C1D24E04AF120846C6466 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF28023912D8965DF61C6F0514DD2CA2F085 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C92939AE5A4B659DA92D0F66DB20E5C40 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E506A52F307AD101F2FB598C6A022904C85 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E58337B4559EAF36B992991F51D571A183AA31 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16971040815372B40C46F0CEB6F5C42476 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D18C1496B448440C9A3A1404C5FD1CDED3 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B243CDCFB826D2F53A8200E17EDB083BD466 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E99653D0C19B170F2BE5399AD328D42592 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFBC7AF33F9C8589E56FDDCFD2CC02C32 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A853C4B641E611E9E0695F52EBEE5377BF + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C97386392A3DE63A06D561724DB898BB981C + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C8366015E65B9BFCEEA22EDDCFB5E3267 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4100B31D263C4A1D84EB3BBBE2AB130720ADF + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647D003176B6840B13E31E4F12E0ADD96B0D + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96248520493C3CADD9D1DAB9CC47F72DFD09FF44A0 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C13DCA84BCB74CB3D4A581D41160B33CCF8 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8767135C8B0A98F97C74996003B61935908 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E091F038C5855B2D0B8625AD0D1068031F0A + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A6310B3FBFAEEE06CD9200D3B04A10E9BD3EE + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BE01D7262C92538F2A35AB898CEB201B5212 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D21DAE15C244471209AD06E764184D2AC94F + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E6D94BE3860910D181E829D59C1A64712F0 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942ADBC877A619EB113F0C7CA858205E19D360 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC910C366A032C32380784234E4A68D4AA484 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA2806F94B145376D3BB1EAF45A24238B8B56 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C001202D0E2EE021A41536A5AB25435BDC74 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6F1BAB0DEABD07ADBA7B88D8400EE5308B7C + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A2884814C846E16F45CF93BFCF6E507540BDE + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C975F64DBCD3D7A2F182F04150D30C560464 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E2DCBDB73FE899AC777A3E0E2CF84909829E + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285D8B0143F907FF3ADC0C6E4BD58051A7F31C + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC965DC41AC6EA44FE58DC7D5919FC76C68F + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B5C4972C2EDB71B7833545FD0DE74ACB6395 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF28559615D12E70EE9491DBD4C3DFCBCBCEF6 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C16E6BDECE8EC22C62A01BE06F6ADA586F8 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E502C71E0E7D9B64BB1EB42867896D6317E16 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E583378852C4B86E8F19994A186BB761848D2395 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16D82F2C2915A09ABD6895D36C5E55638D7C + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D1B6E1301CD1DEE35B33E7CE96DCEA5C1748 + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B24329944F56C2A391F0D9D736759F1343E5A0 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E9EFF3DE3AE889617D0223C2C4063D4250B3 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFA5CDE45D448B231F96C9371D27B63E96C + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A89E4788F0B11FDFAF5CE6C805AE40F2295A + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C973EC2601285507FA4FA4B54AD0087DD1831C + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C393555DACCDEA294479E13DA9180CB2A6E + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4100B9F48939AEDDA8060DFD0AA340E603FCBC7 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647D8CDC8E64F98A5DFBCA7F4AF376D7B5DC13 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A96248520499007788476F56704C0D2531FBBD47EB4EC + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C13DA2AAC6A069824C79790A4F0DE49FA7508 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8767267DBE7E03A00B196A82931242EED379A + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E09138EDD78A5AC736B237F13A73DD881E6894 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A631063E91F53F99B5D07BF05C2EE47D4628A05 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BE01FDA042737073304C9D646F336B931957E5 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D21DDBA124FA85F8C4DAA22D4552B4EA3BA22A + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E6DB15D5AB8365275274C6E6802B151AFF417 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942ADB7CE1D1286D740DC8179F71EF1D29CEBE5B + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC91003ED059C1A23B998DB933B7C0A6FA2F053 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA280EA63E0663CC9F35D4CA2A1B4E45083779C + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C0018EB0E22AA31B7D5CE3E50E0A6605B56D3E + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6F1BD793706EB6EC581A90A1684B33D65F2979 + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A2884E65834BD33AA16F191503349FBC711960E + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C975706D6F7D2F013FEDAFCE582348A18F40B0 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E2DC6D80618A2692594EE4979822074AE07AB9 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285D8BF7C28B102E7E9F6017A2B4FF6EF22AE15D + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC9620C308532C650B79AD634CA79256FAB213 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B5C4642A14193CCF06FBE882A5F58F6D270E7B + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF28554162973BDA725B90A3DB8F3E472EF9E925 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C16C2417E827DA0645AD8E063DEA63C2765AF + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E502C44AFEEADD697BDC32FDD9A9CF20EA50575 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E58337884F56D501947DFDC2A8DC1395528113EC70 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16D8092B49CA34B25DD29C7C4E9D9E9A6FA260 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D1B6B97832563E076F75D0F1F286CA40E7B0FE + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B24329D75D25D62B0F3D05E34F853F77B05B9845 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E9EF6BD52E4CFA1E3D496C2226EBE182D4A949 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFA28727E0C130395D7AE3B3C0DACBA40C9E3 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A89E4DA9A8C6DB93FADB624A7692C14D902CD3 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C973EC7997C5B4B258E03ECBAB4540474C64BE69 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C399900CFCDB5375348C989CA4F5563B6AB98 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4100B9F3E4C3D389DE1B4EF8DF215C8AEFFB3D15B + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647D8C2211C2CD0DE03BF9792240491098C82A24 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A962485204990B851E239A4ADE91ECCE694F7E707E287C6 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C13DA32C34017E9967D98F817EE86822A2D3088 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8767221A799A40E2196B49AFFF9B02C2D7B7994 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E0913815F5F4CCDE746AF7E60D67823C727D7EE5 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A631063A270BDEB13DB66AF3C023695EAE4EB661C + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BE01FD335E2BC966298F7273D954E941B7FABAAA + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D21DDBF74EC67CC256A6AE20C86557977B2B8D41 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E6DB19AC229446946A2D0F657BFD013073BC1C7 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942ADB7C07C91585DA708AE1BD752B1FAB584C0D98 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC91003DD075FFC1E373F9F18AA200137EBD460D5 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA280EAA22BBF2C6D3ABA10F411E296D95BB42B3E + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C0018E2C8D7198300109BC2F19E994746B95EB57 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6F1BD71745D145E60A0376CBB4C6BB20F48CBCA2 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A2884E6E6964401D883D7C629FCB8F6CB6A2B48FC + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C975701A29AE43883DE845A1D28920C8AD23A363 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E2DC6DE5766EE570C150D9B8AA36AB17D3F03352 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285D8BF7C76B2DDA9149C19C8AC5FEC3DAC51D3DC2 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC962082578727343DC313B9C28FF863A6738616 + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B5C4641F721FB5E95B8B7D92C687B19A20B6247B + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF28554121CB718D1DCF05E3C0885EADE74B0C889A + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C16C2722606C1B929878E3CFFE9AFE60AD05477 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E502C446932C9AC398E2CDF2BADBF6B44DE97B30B + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E58337884FC9892BEE89794C898048AC4FE8BF789DA3 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16D809FEDEC6AD206EE6B7D3C806B8BF5E82044A + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D1B6B9060416870014C827EA7BDB3C00FADD63E1 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B24329D79D80E793E2751842620E14D27FDAD3286D + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E9EF6B72269D5C79DA42035BCDCFBFB0BD1F927D + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFA28ACACBE9497A65A195EC890BA44486C8166 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A89E4D384E9F2F05CB923956547153164623214F + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C973EC79124838CD94297BEC7DB8EC08B8CC944298 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C39997DB1DB4201A919D82E2DC9BFA9390BB8D8 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4100B9F3E225D63F33EACF403232EEBC877504BA945 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647D8C2256A3B0E5C269BEDD5428AF7BADE56C1BFB + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A962485204990B82BEA8ED355B2010004E70B9F073A1A9A1C + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C13DA320699AA1EFBBEDEA5C015EB60438BF55BD4 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8767221DAC6EBC711A9AA0FCD4E6F6FF3DF67CA0E + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E0913815DBA20979A65A25A4BC056103DF3325605D + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A631063A2E1749214FB99E52E98EF6D55746C2FE209 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BE01FD338C8DA6F565A362793AC146F239B3E6079B + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D21DDBF76DB9E4A7B2E664CD26D4E76A60B78BCFAB + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E6DB19A9EB7D0249D7BB37AAB6038D6853F77A386 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942ADB7C072FAFADB6E4CFF1B3B37A155B276E391F02 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC91003DD4206FFEDC11EEBC364ADB53CA143E5AF78 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA280EAA2A7FB55CA8DFDB00E0543A7CC87341C4AA5 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C0018E2C92ECA8FF12367E079FE28EAD0EF0F6FF78 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6F1BD7176BE279083445350C4DAD1418C818962934 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A2884E6E67CAA6716E46D26EBF628A7A45A333EC745 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C975701A4C0A42D6CDE3E7591DEED47B5D37193697 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E2DC6DE54D199DBA21411E4EF9695F369E37C02E8D + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285D8BF7C70DF31549EB3D1324560FED36C91A05BB10 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC9620829FA8C0F2D0C794D9F2E9AE415617013091 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B5C4641F7DB89DBA4D144147BD2E94FBB5A496092A + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF2855412113D048352141034AA42279987863E766FC + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C16C27254249819406824E775526930282883169E + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E502C4469B5781D6A6FC6F099C0E2A255A151317FAE + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E58337884FC99CDB6FD2BC10616D2FD2D2E638B2C52160 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16D809FE6E6C7936D74CE656DEFFDC45D9B0D61278 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D1B6B9063A212C81D87FB4E073C2E824FE3F3F2A64 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B24329D79DCCB68C9AF906D4E6C98269A8AEE0E3C8FD + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E9EF6B725CC7FBBBBCE7A4632D49BA3D0EF4D481DA + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFA28ACC16E6B974DE65A72AF78DFE1213896A6A5 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A89E4D383B37294D0C856FA466FA6B36F6A1A431F0 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C973EC7912E6DF1121421948B14017ED93DC7F5459FE + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C39997D055AA94B5E468CE63DCD44F541DBD53BF7 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = C9F98EB86B5527F8DBF63ACB57B174DEC953EF5633B156AA95B4100B9F3E22E627D5F27F10BB11DD268E4CA0F3EF8F1F + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 23197038165DFA2E594A323BEEB3973A568F6C9525E62C697059647D8C2256B7AAB5DA2D2C00FE4C61B7D7E1A0EEB4D2 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = FE9D361C358BCE63BA10321C6C41CC76B5D447A706488A962485204990B82B505232C898672CA796CE4BE13406D95F36 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = EC81D566D4E35BC9F945B1C736650EDA43E8880C275CA5D93A924C13DA320602F0EEC7EAADEC7F14BCFE33584C7A9C33 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = D189084B12BEC8FC8F96486759FE7DECCCD4936CCBE239881DA4A8767221DAF247C6CDCBF48AEFA2BB40DF12B43282BB + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = A748A865EC8E77BF15434B10DC187A4094FAB3F4809A5C829344E0913815DB261254FDE44786D1E0AC0B85C692733B5A + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = DB24D0782A7BB0A9E224210DE1A13AF61C12AE96C6AD9561C67A631063A2E19430110413609C20EEAE9ACD1B4D00D345 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 1D17560BBF8DC9720E2712623AC3416CB9B786F9ED7B28B33D84BE01FD338C41A05851554FB3B05453374A28F18CA714 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 4E9807774B4E14B5DB8E562CB5771A706EA1833C3300A8180601D21DDBF76DED0B8840AED7AC6A1B356D2A850EA7EE62 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = FE628D5C6C6347FCBE258B21F93EB48EFD0463F5495A3CE595449E6DB19A9E44513023DE104FD23765125C9B07EEB165 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = E9C2858529D6FEB52EF49FB5D55EA588A73C6B3DE4B7CFF6B7942ADB7C072FDFB6E624875209FC1F1AA766A1F3167ED6 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = FCD0420F6E34CE1DB5E14EDDE53795707D1B6AF114158879A36CC91003DD421BEBDFB45734B39D7F5410D844C2CA0F28 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 0228F0ABBA1AB39FD7D86B189BA9534B76C48A4CEC0219CC308AA280EAA2A7B45E3FE76D37CFBFC6E1ADF13B4D12769F + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 82B6B9CC4097AC5E72EA4E5224C7E73BBC136FFB7706F3942FC1C0018E2C927742A49E33CEF5E95359840BE33402B23C + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 5DC0EAA3E48E728D0AB971A3B46C5E756F0C4B5FC61F0EE2538E6F1BD7176B8B6FD00CBE2F2BF4EDC2B149905FCA0260 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = F5E273C0B85FF629E70350553620E9B0C206469F83C8CBAC592A2884E6E67CA8DCE12BD377F770ACBB8CB38576B2C839 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 0F47F3B0C630FE59005875D996FA1207599A4E355001D13AF795C975701A4CD6DCEA25311A9960BFBE8CBD76D1F266C1 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 183BCB0CE30871A09209FAFF6DD831FB4A9661D4EE2E5E141C38E2DC6DE54DB89F00DF2FBC59FB5B37717E31EAD6B8D5 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0AD4E35D0CDB5C46ED5192D71ABDA77AF7F2B11C471BBF5394285D8BF7C70DAC60387EB03694EC34D2E694F42AAE9840 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 81E22B7269ECB5CA72D6FC266ED37D15173FDB041B0633DB3040CC9620829F35A47A3D32337F3C2BBA61067460478857 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C51B01EF48E764BE4B06DF483CFD24B620050B26B19D00B67376B5C4641F7D041AAB72249613C4919D6205C6F7C1BB2A + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DD724F39ED7497B7C6A0CC3970E93EAF179390D95CA6D4F70CAF28554121131E17ED438E81B0C576F021FE612CCCABFE + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 8079ED0F7239C793F8F69CAD41F5D6F20005173D51EC9FD2A91B7C16C2725473882A01E9FA10C71E44CFCF2C175E8164 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D84816B878D7162DF559419BC388B19E96426BF5FA4044780C5E502C4469B5CB91DB73D585EF87464A5661FFCAF1C5F5 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A5F050BCA298C6D36106B0209C7BBE364BC534E7485577D9E58337884FC99C0BAE01800E0952827006097847213C3766 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 236EA861E0F625AC0F7CC043F248E3168FDEBCCF790D7E971D4B16D809FE6EDBB100FC8CBE8473AB3C2D4CE6C2A37627 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BAEC69C08B733EDCD04BF5AA9A422B92FDFD301F716778411891D1B6B9063A06F54C239C0AD9B98F6C9189008BB6B4CB + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6FEAF790766419D1BCFE9F16690883CBF2154EA0D4FF5432A4B24329D79DCC239168FC2FFDCEC2A6459B905D62BBAB87 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9351D46CF9BE44C89C49C08B2EA198AC77C8B63E02A8A0B68E53E9EF6B725C75DAA33200662451E9729DFAEB78708C32 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 86474F47C9B37AA7B81C7D3A7EF236A07D2D7E8C26334E3D27043CFA28ACC19669B1FF57E581F95F443D7D51DA2FDF1A + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4ECA33C0C646BC4B7C83DE5CD87262F4668A8D573DBBE8FE8C8A89E4D383B5D19DC9E6765C9DD28D73489C7C5C4068D + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D4C8184CC2561264CE33284BB9262C974A1D8587A8966DF0A2C973EC7912E6F72CF80EFB9E9C6C96669915420552D810 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EF9B5F223391B7C5FBFDC8FB9DBD482C0CA05BFA23A37583B186C39997D05A09C3F443CB093A9A7B4918D21D658F29B + diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.c b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/api.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/encrypt.c b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..a522291 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "romulus.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n3_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return romulus_n3_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128-avr.S b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.c b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinnyutil.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-util.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.c b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.c new file mode 100644 index 0000000..bb19cc5 --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.c @@ -0,0 +1,1974 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "romulus.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const romulus_n1_cipher = { + "Romulus-N1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n1_aead_encrypt, + romulus_n1_aead_decrypt +}; + +aead_cipher_t const romulus_n2_cipher = { + "Romulus-N2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n2_aead_encrypt, + romulus_n2_aead_decrypt +}; + +aead_cipher_t const romulus_n3_cipher = { + "Romulus-N3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_n3_aead_encrypt, + romulus_n3_aead_decrypt +}; + +aead_cipher_t const romulus_m1_cipher = { + "Romulus-M1", + ROMULUS_KEY_SIZE, + ROMULUS1_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m1_aead_encrypt, + romulus_m1_aead_decrypt +}; + +aead_cipher_t const romulus_m2_cipher = { + "Romulus-M2", + ROMULUS_KEY_SIZE, + ROMULUS2_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m2_aead_encrypt, + romulus_m2_aead_decrypt +}; + +aead_cipher_t const romulus_m3_cipher = { + "Romulus-M3", + ROMULUS_KEY_SIZE, + ROMULUS3_NONCE_SIZE, + ROMULUS_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + romulus_m3_aead_encrypt, + romulus_m3_aead_decrypt +}; + +/** + * \brief Limit on the number of bytes of message or associated data (128Mb). + * + * Romulus-N1 and Romulus-M1 use a 56-bit block counter which allows for + * payloads well into the petabyte range. It is unlikely that an embedded + * device will have that much memory to store a contiguous packet! + * + * Romulus-N2 and Romulus-M2 use a 48-bit block counter but the upper + * 24 bits are difficult to modify in the key schedule. So we only + * update the low 24 bits and leave the high 24 bits fixed. + * + * Romulus-N3 and Romulus-M3 use a 24-bit block counter. + * + * For all algorithms, we limit the block counter to 2^23 so that the block + * counter can never exceed 2^24 - 1. + */ +#define ROMULUS_DATA_LIMIT \ + ((unsigned long long)((1ULL << 23) * SKINNY_128_BLOCK_SIZE)) + +/** + * \brief Initializes the key schedule for Romulus-N1 or Romulus-M1. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 16 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus1_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the 56-bit LFSR counter */ + memset(TK + 1, 0, 15); + if (npub) + memcpy(TK + 16, npub, 16); + else + memset(TK + 16, 0, 16); + memcpy(TK + 32, k, 16); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N2 or Romulus-M2. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus2_init + (skinny_128_384_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[48]; + TK[0] = 0x01; /* Initialize the low 24 bits of the LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + TK[32] = 0x01; /* Initialize the high 24 bits of the LFSR counter */ + memset(TK + 33, 0, 15); + skinny_128_384_init(ks, TK); +} + +/** + * \brief Initializes the key schedule for Romulus-N3 or Romulus-M3. + * + * \param ks Points to the key schedule to initialize. + * \param k Points to the 16 bytes of the key. + * \param npub Points to the 12 bytes of the nonce. May be NULL + * if the nonce will be updated on the fly. + */ +static void romulus3_init + (skinny_128_256_key_schedule_t *ks, + const unsigned char *k, const unsigned char *npub) +{ + unsigned char TK[32]; + TK[0] = 0x01; /* Initialize the 24-bit LFSR counter */ + if (npub) { + TK[1] = TK[2] = TK[3] = 0; + memcpy(TK + 4, npub, 12); + } else { + memset(TK + 1, 0, 15); + } + memcpy(TK + 16, k, 16); + skinny_128_256_init(ks, TK); +} + +/** + * \brief Sets the domain separation value for Romulus-N1 and M1. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus1_set_domain(ks, domain) ((ks)->TK1[7] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N2 and M2. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus2_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Sets the domain separation value for Romulus-N3 and M3. + * + * \param ks The key schedule to set the domain separation value into. + * \param domain The domain separation value. + */ +#define romulus3_set_domain(ks, domain) ((ks)->TK1[3] = (domain)) + +/** + * \brief Updates the 56-bit LFSR block counter for Romulus-N1 and M1. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +STATIC_INLINE void romulus1_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[6])) >> 7); + TK1[6] = (TK1[6] << 1) | (TK1[5] >> 7); + TK1[5] = (TK1[5] << 1) | (TK1[4] >> 7); + TK1[4] = (TK1[4] << 1) | (TK1[3] >> 7); + TK1[3] = (TK1[3] << 1) | (TK1[2] >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x95); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N2 or M2. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + * + * For Romulus-N2 and Romulus-M2 this will only update the low 24 bits of + * the 48-bit LFSR. The high 24 bits are fixed due to ROMULUS_DATA_LIMIT. + */ +STATIC_INLINE void romulus2_update_counter(uint8_t TK1[16]) +{ + uint8_t mask = (uint8_t)(((int8_t)(TK1[2])) >> 7); + TK1[2] = (TK1[2] << 1) | (TK1[1] >> 7); + TK1[1] = (TK1[1] << 1) | (TK1[0] >> 7); + TK1[0] = (TK1[0] << 1) ^ (mask & 0x1B); +} + +/** + * \brief Updates the 24-bit LFSR block counter for Romulus-N3 or M3. + * + * \param TK1 Points to the TK1 part of the key schedule containing the LFSR. + */ +#define romulus3_update_counter(TK1) romulus2_update_counter((TK1)) + +/** + * \brief Process the asssociated data for Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + skinny_128_384_encrypt_tk2(ks, S, S, npub); + return; + } + + /* Process all double blocks except the last */ + romulus1_set_domain(ks, 0x08); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Pad and process the left-over blocks */ + romulus1_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 32) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x18); + } else if (temp > 16) { + /* Left-over partial double block */ + unsigned char pad[16]; + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, 15 - temp); + pad[15] = temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x1A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus1_set_domain(ks, 0x18); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus1_set_domain(ks, 0x1A); + } + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus2_set_domain(ks, 0x48); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus2_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x58); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x5A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus2_set_domain(ks, 0x58); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus2_set_domain(ks, 0x5A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void romulus_n3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char temp; + + /* Handle the special case of no associated data */ + if (adlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all double blocks except the last */ + romulus3_set_domain(ks, 0x88); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Pad and process the left-over blocks */ + romulus3_update_counter(ks->TK1); + temp = (unsigned)adlen; + if (temp == 28) { + /* Left-over complete double block */ + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x98); + } else if (temp > 16) { + /* Left-over partial double block */ + temp -= 16; + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp); + ks->TK1[15] = temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x9A); + } else if (temp == 16) { + /* Left-over complete single block */ + lw_xor_block(S, ad, temp); + romulus3_set_domain(ks, 0x98); + } else { + /* Left-over partial single block */ + lw_xor_block(S, ad, temp); + S[15] ^= temp; + romulus3_set_domain(ks, 0x9A); + } + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Determine the domain separation value to use on the last + * block of the associated data processing. + * + * \param adlen Length of the associated data in bytes. + * \param mlen Length of the message in bytes. + * \param t Size of the second half of a double block; 12 or 16. + * + * \return The domain separation bits to use to finalize the last block. + */ +static uint8_t romulus_m_final_ad_domain + (unsigned long long adlen, unsigned long long mlen, unsigned t) +{ + uint8_t domain = 0; + unsigned split = 16U; + unsigned leftover; + + /* Determine which domain bits we need based on the length of the ad */ + if (adlen == 0) { + /* No associated data, so only 1 block with padding */ + domain ^= 0x02; + split = t; + } else { + /* Even or odd associated data length? */ + leftover = (unsigned)(adlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x08; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x02; + split = t; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x0A; + } else { + /* Odd with a full single block at the end */ + split = t; + } + } + + /* Determine which domain bits we need based on the length of the message */ + if (mlen == 0) { + /* No message, so only 1 block with padding */ + domain ^= 0x01; + } else { + /* Even or odd message length? */ + leftover = (unsigned)(mlen % (16U + t)); + if (leftover == 0) { + /* Even with a full double block at the end */ + domain ^= 0x04; + } else if (leftover < split) { + /* Odd with a partial single block at the end */ + domain ^= 0x01; + } else if (leftover > split) { + /* Even with a partial double block at the end */ + domain ^= 0x05; + } + } + return domain; +} + +/** + * \brief Process the asssociated data for Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m1_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char pad[16]; + uint8_t final_domain = 0x30; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 16); + + /* Process all associated data double blocks except the last */ + romulus1_set_domain(ks, 0x28); + while (adlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + ad += 32; + adlen -= 32; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 32) { + /* Last associated data double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + skinny_128_384_encrypt_tk2(ks, S, S, ad + 16); + romulus1_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(pad, ad + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + romulus1_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus1_set_domain(ks, 0x2C); + romulus1_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + romulus1_update_counter(ks->TK1); + m += 16; + mlen -= 16; + } else if (mlen == 16) { + skinny_128_384_encrypt_tk2(ks, S, S, m); + m += 16; + mlen -= 16; + } else { + temp = (unsigned)mlen; + memcpy(pad, m, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus1_set_domain(ks, 0x2C); + while (mlen > 32) { + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + romulus1_update_counter(ks->TK1); + m += 32; + mlen -= 32; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 32) { + /* Last message double block is full */ + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + skinny_128_384_encrypt_tk2(ks, S, S, m + 16); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus1_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(pad, m + 16, temp); + memset(pad + temp, 0, sizeof(pad) - temp - 1); + pad[sizeof(pad) - 1] = (unsigned char)temp; + skinny_128_384_encrypt_tk2(ks, S, S, pad); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus1_set_domain(ks, final_domain); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt_tk2(ks, S, S, npub); +} + +/** + * \brief Process the asssociated data for Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m2_process_ad + (skinny_128_384_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0x70; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus2_set_domain(ks, 0x68); + while (adlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus2_set_domain(ks, 0x6C); + romulus2_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_384_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus2_set_domain(ks, 0x6C); + while (mlen > 28) { + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + romulus2_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_384_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus2_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_384_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus2_set_domain(ks, final_domain); + romulus2_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Process the asssociated data for Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param npub Points to the nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + * \param m Points to the message plaintext. + * \param mlen Length of the message plaintext. + */ +static void romulus_m3_process_ad + (skinny_128_256_key_schedule_t *ks, + unsigned char S[16], const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *m, unsigned long long mlen) +{ + uint8_t final_domain = 0xB0; + unsigned temp; + + /* Determine the domain separator to use on the final block */ + final_domain ^= romulus_m_final_ad_domain(adlen, mlen, 12); + + /* Process all associated data double blocks except the last */ + romulus3_set_domain(ks, 0xA8); + while (adlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + ad += 28; + adlen -= 28; + } + + /* Process the last associated data double block */ + temp = (unsigned)adlen; + if (temp == 28) { + /* Last associated data double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else if (temp > 16) { + /* Last associated data double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, ad, 16); + memcpy(ks->TK1 + 4, ad + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + } else { + /* Last associated data block is single. Needs to be combined + * with the first block of the message payload */ + romulus3_set_domain(ks, 0xAC); + romulus3_update_counter(ks->TK1); + if (temp == 16) { + lw_xor_block(S, ad, 16); + } else { + lw_xor_block(S, ad, temp); + S[15] ^= (unsigned char)temp; + } + if (mlen > 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 12; + mlen -= 12; + } else if (mlen == 12) { + memcpy(ks->TK1 + 4, m, 12); + skinny_128_256_encrypt(ks, S, S); + m += 12; + mlen -= 12; + } else { + temp = (unsigned)mlen; + memcpy(ks->TK1 + 4, m, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + mlen = 0; + } + } + + /* Process all message double blocks except the last */ + romulus3_set_domain(ks, 0xAC); + while (mlen > 28) { + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + romulus3_update_counter(ks->TK1); + m += 28; + mlen -= 28; + } + + /* Process the last message double block */ + temp = (unsigned)mlen; + if (temp == 28) { + /* Last message double block is full */ + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, 12); + skinny_128_256_encrypt(ks, S, S); + } else if (temp > 16) { + /* Last message double block is partial */ + temp -= 16; + romulus3_update_counter(ks->TK1); + lw_xor_block(S, m, 16); + memcpy(ks->TK1 + 4, m + 16, temp); + memset(ks->TK1 + 4 + temp, 0, 12 - temp - 1); + ks->TK1[15] = (unsigned char)temp; + skinny_128_256_encrypt(ks, S, S); + } else if (temp == 16) { + /* Last message single block is full */ + lw_xor_block(S, m, 16); + } else if (temp > 0) { + /* Last message single block is partial */ + lw_xor_block(S, m, temp); + S[15] ^= (unsigned char)temp; + } + + /* Process the last partial block */ + romulus3_set_domain(ks, final_domain); + romulus3_update_counter(ks->TK1); + memcpy(ks->TK1 + 4, npub, 12); + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Applies the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + */ +STATIC_INLINE void romulus_rho + (unsigned char S[16], unsigned char C[16], const unsigned char M[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } +} + +/** + * \brief Applies the inverse of the Romulus rho function. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + */ +STATIC_INLINE void romulus_rho_inverse + (unsigned char S[16], unsigned char M[16], const unsigned char C[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } +} + +/** + * \brief Applies the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param C Ciphertext message output block. + * \param M Plaintext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_short + (unsigned char S[16], unsigned char C[16], + const unsigned char M[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = M[index]; + S[index] ^= m; + C[index] = m ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Applies the inverse of the Romulus rho function to a short block. + * + * \param S The rolling Romulus state. + * \param M Plaintext message output block. + * \param C Ciphertext message input block. + * \param len Length of the short block, must be less than 16. + */ +STATIC_INLINE void romulus_rho_inverse_short + (unsigned char S[16], unsigned char M[16], + const unsigned char C[16], unsigned len) +{ + unsigned index; + for (index = 0; index < len; ++index) { + unsigned char s = S[index]; + unsigned char m = C[index] ^ ((s >> 1) ^ (s & 0x80) ^ (s << 7)); + S[index] ^= m; + M[index] = m; + } + S[15] ^= (unsigned char)len; /* Padding */ +} + +/** + * \brief Encrypts a plaintext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho(S, c, m); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus1_update_counter(ks->TK1); + romulus1_set_domain(ks, 0x15); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus1_set_domain(ks, 0x04); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus1_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus1_set_domain(ks, 0x15); + } else { + romulus_rho_inverse(S, m, c); + romulus1_set_domain(ks, 0x14); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho(S, c, m); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus2_update_counter(ks->TK1); + romulus2_set_domain(ks, 0x55); + skinny_128_384_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus2_set_domain(ks, 0x44); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + skinny_128_384_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus2_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus2_set_domain(ks, 0x55); + } else { + romulus_rho_inverse(S, m, c); + romulus2_set_domain(ks, 0x54); + } + skinny_128_384_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no plaintext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_short(S, c, m, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho(S, c, m); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-N3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_n3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + unsigned temp; + + /* Handle the special case of no ciphertext */ + if (mlen == 0) { + romulus3_update_counter(ks->TK1); + romulus3_set_domain(ks, 0x95); + skinny_128_256_encrypt(ks, S, S); + return; + } + + /* Process all blocks except the last */ + romulus3_set_domain(ks, 0x84); + while (mlen > 16) { + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + skinny_128_256_encrypt(ks, S, S); + c += 16; + m += 16; + mlen -= 16; + } + + /* Pad and process the last block */ + temp = (unsigned)mlen; + romulus3_update_counter(ks->TK1); + if (temp < 16) { + romulus_rho_inverse_short(S, m, c, temp); + romulus3_set_domain(ks, 0x95); + } else { + romulus_rho_inverse(S, m, c); + romulus3_set_domain(ks, 0x94); + } + skinny_128_256_encrypt(ks, S, S); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M1. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m1_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus1_set_domain(ks, 0x24); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus1_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M2. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m2_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus2_set_domain(ks, 0x64); + while (mlen > 16) { + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus2_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_384_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Encrypts a plaintext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the buffer containing the plaintext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *c, const unsigned char *m, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho(S, c, m); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_short(S, c, m, (unsigned)mlen); +} + +/** + * \brief Decrypts a ciphertext message with Romulus-M3. + * + * \param ks Points to the key schedule. + * \param S The rolling Romulus state. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the buffer containing the ciphertext. + * \param mlen Length of the plaintext in bytes. + */ +static void romulus_m3_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char S[16], + unsigned char *m, const unsigned char *c, unsigned long long mlen) +{ + /* Nothing to do if the message is empty */ + if (!mlen) + return; + + /* Process all block except the last */ + romulus3_set_domain(ks, 0xA4); + while (mlen > 16) { + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse(S, m, c); + romulus3_update_counter(ks->TK1); + c += 16; + m += 16; + mlen -= 16; + } + + /* Handle the last block */ + skinny_128_256_encrypt(ks, S, S); + romulus_rho_inverse_short(S, m, c, (unsigned)mlen); +} + +/** + * \brief Generates the authentication tag from the rolling Romulus state. + * + * \param T Buffer to receive the generated tag; can be the same as S. + * \param S The rolling Romulus state. + */ +STATIC_INLINE void romulus_generate_tag + (unsigned char T[16], const unsigned char S[16]) +{ + unsigned index; + for (index = 0; index < 16; ++index) { + unsigned char s = S[index]; + T[index] = (s >> 1) ^ (s & 0x80) ^ (s << 7); + } +} + +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n1_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n1_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n1_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n2_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n2_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n2_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypts the plaintext to produce the ciphertext */ + romulus_n3_encrypt(&ks, S, c, m, mlen); + + /* Generate the authentication tag */ + romulus_generate_tag(c + mlen, S); + return 0; +} + +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_n3_process_ad(&ks, S, npub, ad, adlen); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= ROMULUS_TAG_SIZE; + romulus_n3_decrypt(&ks, S, m, c, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m1_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus1_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m1_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus1_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m1_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m2_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus2_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m2_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus2_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m2_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} + +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || mlen > ROMULUS_DATA_LIMIT) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data and the plaintext message */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, mlen); + + /* Generate the authentication tag, which is also the initialization + * vector for the encryption portion of the packet processing */ + romulus_generate_tag(S, S); + memcpy(c + mlen, S, ROMULUS_TAG_SIZE); + + /* Re-initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Encrypt the plaintext to produce the ciphertext */ + romulus_m3_encrypt(&ks, S, c, m, mlen); + return 0; +} + +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char S[16]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < ROMULUS_TAG_SIZE) + return -1; + *mlen = clen - ROMULUS_TAG_SIZE; + + /* Validate the length of the associated data and message */ + if (adlen > ROMULUS_DATA_LIMIT || + clen > (ROMULUS_DATA_LIMIT + ROMULUS_TAG_SIZE)) + return -2; + + /* Initialize the key schedule with the key and nonce */ + romulus3_init(&ks, k, npub); + + /* Decrypt the ciphertext to produce the plaintext, using the + * authentication tag as the initialization vector for decryption */ + clen -= ROMULUS_TAG_SIZE; + memcpy(S, c + clen, ROMULUS_TAG_SIZE); + romulus_m3_decrypt(&ks, S, m, c, clen); + + /* Re-initialize the key schedule with the key and no nonce. Associated + * data processing varies the nonce from block to block */ + romulus3_init(&ks, k, 0); + + /* Process the associated data */ + memset(S, 0, sizeof(S)); + romulus_m3_process_ad(&ks, S, npub, ad, adlen, m, clen); + + /* Check the authentication tag */ + romulus_generate_tag(S, S); + return aead_check_tag(m, clen, S, c + clen, ROMULUS_TAG_SIZE); +} diff --git a/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.h b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.h new file mode 100644 index 0000000..e6da29d --- /dev/null +++ b/romulus/Implementations/crypto_aead/romulusn3v1/rhys-avr/romulus.h @@ -0,0 +1,476 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_ROMULUS_H +#define LWCRYPTO_ROMULUS_H + +#include "aead-common.h" + +/** + * \file romulus.h + * \brief Romulus authenticated encryption algorithm family. + * + * Romulus is a family of authenticated encryption algorithms that + * are built around the SKINNY-128 tweakable block cipher. There + * are six members in the family: + * + * \li Romulus-N1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li Romulus-N2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-N3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li Romulus-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li Romulus-M3 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The Romulus-M variants are resistant to nonce reuse as long as the + * combination of the associated data and plaintext is unique. If the + * same associated data and plaintext are reused under the same nonce, + * then the scheme will leak that the same plaintext has been sent for a + * second time but will not reveal the plaintext itself. + * + * References: https://romulusae.github.io/romulus/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all Romulus family members. + */ +#define ROMULUS_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all Romulus family members. + */ +#define ROMULUS_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N1 and Romulus-M1. + */ +#define ROMULUS1_NONCE_SIZE 16 + +/** + * \brief Size of the nonce for Romulus-N2 and Romulus-M2. + */ +#define ROMULUS2_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for Romulus-N3 and Romulus-M3. + */ +#define ROMULUS3_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the Romulus-N1 cipher. + */ +extern aead_cipher_t const romulus_n1_cipher; + +/** + * \brief Meta-information block for the Romulus-N2 cipher. + */ +extern aead_cipher_t const romulus_n2_cipher; + +/** + * \brief Meta-information block for the Romulus-N3 cipher. + */ +extern aead_cipher_t const romulus_n3_cipher; + +/** + * \brief Meta-information block for the Romulus-M1 cipher. + */ +extern aead_cipher_t const romulus_m1_cipher; + +/** + * \brief Meta-information block for the Romulus-M2 cipher. + */ +extern aead_cipher_t const romulus_m2_cipher; + +/** + * \brief Meta-information block for the Romulus-M3 cipher. + */ +extern aead_cipher_t const romulus_m3_cipher; + +/** + * \brief Encrypts and authenticates a packet with Romulus-N1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n1_aead_decrypt() + */ +int romulus_n1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n1_aead_encrypt() + */ +int romulus_n1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n2_aead_decrypt() + */ +int romulus_n2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n2_aead_encrypt() + */ +int romulus_n2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-N3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_n3_aead_decrypt() + */ +int romulus_n3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-N3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_n3_aead_encrypt() + */ +int romulus_n3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m1_aead_decrypt() + */ +int romulus_m1_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m1_aead_encrypt() + */ +int romulus_m1_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m2_aead_decrypt() + */ +int romulus_m2_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m2_aead_encrypt() + */ +int romulus_m2_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Romulus-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa romulus_m3_aead_decrypt() + */ +int romulus_m3_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Romulus-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa romulus_m3_aead_encrypt() + */ +int romulus_m3_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.c b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.h b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/api.h b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/api.h new file mode 100644 index 0000000..75fabd7 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 32 +#define CRYPTO_NOOVERLAP 1 diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/encrypt.c b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/encrypt.c new file mode 100644 index 0000000..9ce5559 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "saturnin.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return saturnin_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return saturnin_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/internal-util.h b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.c b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.c new file mode 100644 index 0000000..734fc69 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.c @@ -0,0 +1,781 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "saturnin.h" +#include "internal-util.h" +#include + +aead_cipher_t const saturnin_cipher = { + "SATURNIN-CTR-Cascade", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_aead_encrypt, + saturnin_aead_decrypt +}; + +aead_cipher_t const saturnin_short_cipher = { + "SATURNIN-Short", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_NONE, + saturnin_short_aead_encrypt, + saturnin_short_aead_decrypt +}; + +aead_hash_algorithm_t const saturnin_hash_algorithm = { + "SATURNIN-Hash", + sizeof(saturnin_hash_state_t), + SATURNIN_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_hash, + (aead_hash_init_t)saturnin_hash_init, + (aead_hash_update_t)saturnin_hash_update, + (aead_hash_finalize_t)saturnin_hash_finalize, + 0, /* absorb */ + 0 /* squeeze */ +}; + +/* Round constant tables for various combinations of rounds and domain_sep */ +static uint32_t const RC_10_1[] = { + 0x4eb026c2, 0x90595303, 0xaa8fe632, 0xfe928a92, 0x4115a419, + 0x93539532, 0x5db1cc4e, 0x541515ca, 0xbd1f55a8, 0x5a6e1a0d +}; +static uint32_t const RC_10_2[] = { + 0x4e4526b5, 0xa3565ff0, 0x0f8f20d8, 0x0b54bee1, 0x7d1a6c9d, + 0x17a6280a, 0xaa46c986, 0xc1199062, 0x182c5cde, 0xa00d53fe +}; +static uint32_t const RC_10_3[] = { + 0x4e162698, 0xb2535ba1, 0x6c8f9d65, 0x5816ad30, 0x691fd4fa, + 0x6bf5bcf9, 0xf8eb3525, 0xb21decfa, 0x7b3da417, 0xf62c94b4 +}; +static uint32_t const RC_10_4[] = { + 0x4faf265b, 0xc5484616, 0x45dcad21, 0xe08bd607, 0x0504fdb8, + 0x1e1f5257, 0x45fbc216, 0xeb529b1f, 0x52194e32, 0x5498c018 +}; +static uint32_t const RC_10_5[] = { + 0x4ffc2676, 0xd44d4247, 0x26dc109c, 0xb3c9c5d6, 0x110145df, + 0x624cc6a4, 0x17563eb5, 0x9856e787, 0x3108b6fb, 0x02b90752 +}; +static uint32_t const RC_10_6[] = { + 0x4f092601, 0xe7424eb4, 0x83dcd676, 0x460ff1a5, 0x2d0e8d5b, + 0xe6b97b9c, 0xe0a13b7d, 0x0d5a622f, 0x943bbf8d, 0xf8da4ea1 +}; +static uint32_t const RC_16_7[] = { + 0x3fba180c, 0x563ab9ab, 0x125ea5ef, 0x859da26c, 0xb8cf779b, + 0x7d4de793, 0x07efb49f, 0x8d525306, 0x1e08e6ab, 0x41729f87, + 0x8c4aef0a, 0x4aa0c9a7, 0xd93a95ef, 0xbb00d2af, 0xb62c5bf0, + 0x386d94d8 +}; +static uint32_t const RC_16_8[] = { + 0x3c9b19a7, 0xa9098694, 0x23f878da, 0xa7b647d3, 0x74fc9d78, + 0xeacaae11, 0x2f31a677, 0x4cc8c054, 0x2f51ca05, 0x5268f195, + 0x4f5b8a2b, 0xf614b4ac, 0xf1d95401, 0x764d2568, 0x6a493611, + 0x8eef9c3e +}; + +/* Rotate the 4-bit nibbles within a 16-bit word left */ +#define leftRotate4_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (4 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (4 - (bits2))); \ + } while (0) + +/* Rotate 16-bit subwords left */ +#define leftRotate16_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (16 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (16 - (bits2))); \ + } while (0) + +/* XOR the SATURNIN state with the key */ +#define saturnin_xor_key() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index]; \ + } while (0) + +/* XOR the SATURNIN state with a rotated version of the key */ +#define saturnin_xor_key_rotated() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index + 8]; \ + } while (0) + +/* Apply an SBOX layer for SATURNIN - definition from the specification */ +#define S_LAYER(a, b, c, d) \ + do { \ + (a) ^= (b) & (c); \ + (b) ^= (a) | (d); \ + (d) ^= (b) | (c); \ + (c) ^= (b) & (d); \ + (b) ^= (a) | (c); \ + (a) ^= (b) | (d); \ + } while (0) + +/* Apply an SBOX layer for SATURNIN in reverse */ +#define S_LAYER_INVERSE(a, b, c, d) \ + do { \ + (a) ^= (b) | (d); \ + (b) ^= (a) | (c); \ + (c) ^= (b) & (d); \ + (d) ^= (b) | (c); \ + (b) ^= (a) | (d); \ + (a) ^= (b) & (c); \ + } while (0) + +/** + * \brief Applies the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + a = S[0]; b = S[1]; c = S[2]; d = S[3]; + S_LAYER(a, b, c, d); + S[0] = b; S[1] = c; S[2] = d; S[3] = a; + + /* PI_1 on the second half of the state */ + a = S[4]; b = S[5]; c = S[6]; d = S[7]; + S_LAYER(a, b, c, d); + S[4] = d; S[5] = b; S[6] = a; S[7] = c; +} + +/** + * \brief Applies the inverse of the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox_inverse(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + b = S[0]; c = S[1]; d = S[2]; a = S[3]; + S_LAYER_INVERSE(a, b, c, d); + S[0] = a; S[1] = b; S[2] = c; S[3] = d; + + /* PI_1 on the second half of the state */ + d = S[4]; b = S[5]; a = S[6]; c = S[7]; + S_LAYER_INVERSE(a, b, c, d); + S[4] = a; S[5] = b; S[6] = c; S[7] = d; +} + +/** + * \brief Applies the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the MDS matrix to the state */ + #define SWAP(a) (((a) << 16) | ((a) >> 16)) + #define MUL(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x0; x0 = x1; x1 = x2; x2 = x3; x3 = tmp ^ x0; \ + } while (0) + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MUL(x4, x5, x6, x7, tmp); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + MUL(x0, x1, x2, x3, tmp); + MUL(x0, x1, x2, x3, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the inverse of the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds_inverse(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the inverse of the MDS matrix to the state */ + #define MULINV(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x3; x3 = x2; x2 = x1; x1 = x0; x0 = x1 ^ tmp; \ + } while (0) + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MULINV(x0, x1, x2, x3, tmp); + MULINV(x0, x1, x2, x3, tmp); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + MULINV(x4, x5, x6, x7, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[5], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[6], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[7], 0x7777U, 1, 0x1111, 3); +} + +/** + * \brief Applies the inverse of the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice_inverse(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[5], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[6], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[7], 0x1111U, 3, 0x7777, 1); +} + +/** + * \brief Applies the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[5], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[6], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[7], 0x0FFFU, 4, 0x000F, 12); +} + +/** + * \brief Applies the inverse of the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet_inverse(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[5], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[6], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[7], 0x000FU, 12, 0x0FFF, 4); +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Ciphertext output block, 32 bytes. + * \param input Plaintext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_decrypt() + */ +static void saturnin_block_encrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Perform all encryption rounds */ + for (; rounds > 0; rounds -= 2, RC += 2) { + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_slice(S); + saturnin_mds(S); + saturnin_slice_inverse(S); + S[0] ^= RC[0]; + saturnin_xor_key_rotated(); + + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_sheet(S); + saturnin_mds(S); + saturnin_sheet_inverse(S); + S[0] ^= RC[1]; + saturnin_xor_key(); + } + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Decrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Plaintext output block, 32 bytes. + * \param input Ciphertext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_encrypt() + */ +static void saturnin_block_decrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* Perform all decryption rounds */ + RC += rounds - 2; + for (; rounds > 0; rounds -= 2, RC -= 2) { + saturnin_xor_key(); + S[0] ^= RC[1]; + saturnin_sheet(S); + saturnin_mds_inverse(S); + saturnin_sheet_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + + saturnin_xor_key_rotated(); + S[0] ^= RC[0]; + saturnin_slice(S); + saturnin_mds_inverse(S); + saturnin_slice_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher and + * then XOR's itself to generate a new key. + * + * \param block Block to be encrypted and then XOR'ed with itself. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + */ +void saturnin_block_encrypt_xor + (const unsigned char *block, unsigned char *key, + unsigned rounds, const uint32_t *RC) +{ + unsigned char temp[32]; + saturnin_block_encrypt(temp, block, key, rounds, RC); + lw_xor_block_2_src(key, block, temp, 32); +} + +/** + * \brief Encrypts (or decrypts) a data packet in CTR mode. + * + * \param c Output ciphertext buffer. + * \param m Input plaintext buffer. + * \param mlen Length of the plaintext in bytes. + * \param k Points to the 32-byte key. + * \param block Points to the pre-formatted nonce block. + */ +static void saturnin_ctr_encrypt + (unsigned char *c, const unsigned char *m, unsigned long long mlen, + const unsigned char *k, unsigned char *block) +{ + /* Note: Specification requires a 95-bit counter but we only use 32-bit. + * This limits the maximum packet size to 128Gb. That should be OK */ + uint32_t counter = 1; + unsigned char out[32]; + while (mlen >= 32) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, 32); + c += 32; + m += 32; + mlen -= 32; + ++counter; + } + if (mlen > 0) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, (unsigned)mlen); + } +} + +/** + * \brief Pads an authenticates a message. + * + * \param tag Points to the authentication tag. + * \param block Temporary block of 32 bytes from the caller. + * \param m Points to the message to be authenticated. + * \param mlen Length of the message to be authenticated in bytes. + * \param rounds Number of rounds to perform. + * \param RC1 Round constants to use for domain separation on full blocks. + * \param RC2 Round constants to use for domain separation on the last block. + */ +static void saturnin_authenticate + (unsigned char *tag, unsigned char *block, + const unsigned char *m, unsigned long long mlen, + unsigned rounds, const uint32_t *RC1, const uint32_t *RC2) +{ + unsigned temp; + while (mlen >= 32) { + saturnin_block_encrypt_xor(m, tag, rounds, RC1); + m += 32; + mlen -= 32; + } + temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, 31 - temp); + saturnin_block_encrypt_xor(block, tag, rounds, RC2); +} + +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char *tag; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the plaintext in counter mode to produce the ciphertext */ + saturnin_ctr_encrypt(c, m, mlen, k, block); + + /* Set the counter back to zero and then encrypt the nonce */ + tag = c + mlen; + memcpy(tag, k, 32); + memset(block + 17, 0, 15); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, mlen, 10, RC_10_4, RC_10_5); + return 0; +} + +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char tag[32]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SATURNIN_TAG_SIZE) + return -1; + *mlen = clen - SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the nonce to initialize the authentication phase */ + memcpy(tag, k, 32); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, *mlen, 10, RC_10_4, RC_10_5); + + /* Decrypt the ciphertext in counter mode to produce the plaintext */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + saturnin_ctr_encrypt(m, c, *mlen, k, block); + + /* Check the authentication tag at the end of the message */ + return aead_check_tag + (m, *mlen, tag, c + *mlen, SATURNIN_TAG_SIZE); +} + +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned temp; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data allowed and m <= 15 bytes */ + if (adlen > 0 || mlen > 15) + return -2; + + /* Format the input block from the nonce and plaintext */ + temp = (unsigned)mlen; + memcpy(block, npub, 16); + memcpy(block + 16, m, temp); + block[16 + temp] = 0x80; /* Padding */ + memset(block + 17 + temp, 0, 15 - temp); + + /* Encrypt the input block to produce the output ciphertext */ + saturnin_block_encrypt(c, block, k, 10, RC_10_6); + *clen = 32; + return 0; +} + +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned check1, check2, len; + int index, result; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data and c is always 32 bytes */ + if (adlen > 0) + return -2; + if (clen != 32) + return -1; + + /* Decrypt the ciphertext block */ + saturnin_block_decrypt(block, c, k, 10, RC_10_6); + + /* Verify that the output block starts with the nonce and that it is + * padded correctly. We need to do this very carefully to avoid leaking + * any information that could be used in a padding oracle attack. Use the + * same algorithm as the reference implementation of SATURNIN-Short */ + check1 = 0; + for (index = 0; index < 16; ++index) + check1 |= npub[index] ^ block[index]; + check2 = 0xFF; + len = 0; + for (index = 15; index >= 0; --index) { + unsigned temp = block[16 + index]; + unsigned temp2 = check2 & -(1 - (((temp ^ 0x80) + 0xFF) >> 8)); + len |= temp2 & (unsigned)index; + check2 &= ~temp2; + check1 |= check2 & ((temp + 0xFF) >> 8); + } + check1 |= check2; + + /* At this point, check1 is zero if the nonce and plaintext are good, + * or non-zero if there was an error in the decrypted data */ + result = (((int)check1) - 1) >> 8; + + /* The "result" is -1 if the data is good or zero if the data is invalid. + * Copy either the plaintext or zeroes to the output buffer. We assume + * that the output buffer has space for up to 15 bytes. This may return + * some of the padding to the caller but as long as they restrict + * themselves to the first *mlen bytes then it shouldn't be a problem */ + for (index = 0; index < 15; ++index) + m[index] = block[16 + index] & result; + *mlen = len; + return ~result; +} + +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char tag[32]; + unsigned char block[32]; + memset(tag, 0, sizeof(tag)); + saturnin_authenticate(tag, block, in, inlen, 16, RC_16_7, RC_16_8); + memcpy(out, tag, 32); + return 0; +} + +void saturnin_hash_init(saturnin_hash_state_t *state) +{ + memset(state, 0, sizeof(saturnin_hash_state_t)); +} + +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned temp; + + /* Handle the partial left-over block from last time */ + if (state->s.count) { + temp = 32 - state->s.count; + if (temp > inlen) { + temp = (unsigned)inlen; + memcpy(state->s.block + state->s.count, in, temp); + state->s.count += temp; + return; + } + memcpy(state->s.block + state->s.count, in, temp); + state->s.count = 0; + in += temp; + inlen -= temp; + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_7); + } + + /* Process full blocks that are aligned at state->s.count == 0 */ + while (inlen >= 32) { + saturnin_block_encrypt_xor(in, state->s.hash, 16, RC_16_7); + in += 32; + inlen -= 32; + } + + /* Process the left-over block at the end of the input */ + temp = (unsigned)inlen; + memcpy(state->s.block, in, temp); + state->s.count = temp; +} + +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out) +{ + /* Pad the final block */ + state->s.block[state->s.count] = 0x80; + memset(state->s.block + state->s.count + 1, 0, 31 - state->s.count); + + /* Generate the final hash value */ + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_8); + memcpy(out, state->s.hash, 32); +} diff --git a/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.h b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.h new file mode 100644 index 0000000..873d950 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninctrcascadev2/rhys-avr/saturnin.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SATURNIN_H +#define LWCRYPTO_SATURNIN_H + +#include "aead-common.h" + +/** + * \file saturnin.h + * \brief Saturnin authenticated encryption algorithm. + * + * The Saturnin family consists of two members: SATURNIN-CTR-Cascade and + * SATURNIN-Short. Both take a 256-bit key and a 128-bit nonce. + * Internally they use a 256-bit block cipher similar in construction to AES. + * + * SATURNIN-Short does not support associated data or plaintext packets + * with more than 15 bytes. This makes it very efficient on short packets + * with only a single block operation involved. + * + * This implementation of SATURNIN-Short will return an error if the + * caller supplies associated data or more than 15 bytes of plaintext. + * + * References: https://project.inria.fr/saturnin/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SATURNIN family members. + */ +#define SATURNIN_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for SATURNIN-CTR-Cascade or the + * total size of the ciphertext for SATURNIN-Short. + */ +#define SATURNIN_TAG_SIZE 32 + +/** + * \brief Size of the nonce for all SATURNIN family members. + */ +#define SATURNIN_NONCE_SIZE 16 + +/** + * \brief Size of the hash for SATURNIN-Hash. + */ +#define SATURNIN_HASH_SIZE 32 + +/** + * \brief State information for SATURNIN-Hash incremental modes. + */ +typedef union +{ + struct { + unsigned char hash[32]; /**< Current hash state */ + unsigned char block[32]; /**< Left-over block data from last update */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} saturnin_hash_state_t; + +/** + * \brief Meta-information block for the SATURNIN-CTR-Cascade cipher. + */ +extern aead_cipher_t const saturnin_cipher; + +/** + * \brief Meta-information block for the SATURNIN-Short cipher. + */ +extern aead_cipher_t const saturnin_short_cipher; + +/** + * \brief Meta-information block for SATURNIN-Hash. + */ +extern aead_hash_algorithm_t const saturnin_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 32 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa saturnin_aead_decrypt() + */ +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 32 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa saturnin_aead_encrypt() + */ +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-Short. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which is always 32. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes, which must be + * less than or equal to 15 bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or -2 if the caller supplied too many bytes of + * plaintext or they supplied associated data. + * + * \sa saturnin_short_aead_decrypt() + */ +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-Short. + * + * \param m Buffer to receive the plaintext message on output. There must + * be at least 15 bytes of space in this buffer even if the caller expects + * to receive less data than that. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext to decrypt. + * \param clen Length of the input data in bytes, which must be 32. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or -2 if the caller supplied associated data. + * + * \sa saturnin_short_aead_encrypt() + */ +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with SATURNIN to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SATURNIN_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa saturnin_hash_update(), saturnin_hash_finalize(), saturnin_hash() + */ +void saturnin_hash_init(saturnin_hash_state_t *state); + +/** + * \brief Updates an SATURNIN-Hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa saturnin_hash_init(), saturnin_hash_finalize() + */ +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa saturnin_hash_init(), saturnin_hash_update() + */ +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.c b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.h b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/api.h b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/api.h new file mode 100644 index 0000000..75fabd7 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 32 +#define CRYPTO_NOOVERLAP 1 diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/encrypt.c b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/encrypt.c new file mode 100644 index 0000000..29d7d06 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "saturnin.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return saturnin_short_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return saturnin_short_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/internal-util.h b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.c b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.c new file mode 100644 index 0000000..734fc69 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.c @@ -0,0 +1,781 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "saturnin.h" +#include "internal-util.h" +#include + +aead_cipher_t const saturnin_cipher = { + "SATURNIN-CTR-Cascade", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_aead_encrypt, + saturnin_aead_decrypt +}; + +aead_cipher_t const saturnin_short_cipher = { + "SATURNIN-Short", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_NONE, + saturnin_short_aead_encrypt, + saturnin_short_aead_decrypt +}; + +aead_hash_algorithm_t const saturnin_hash_algorithm = { + "SATURNIN-Hash", + sizeof(saturnin_hash_state_t), + SATURNIN_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_hash, + (aead_hash_init_t)saturnin_hash_init, + (aead_hash_update_t)saturnin_hash_update, + (aead_hash_finalize_t)saturnin_hash_finalize, + 0, /* absorb */ + 0 /* squeeze */ +}; + +/* Round constant tables for various combinations of rounds and domain_sep */ +static uint32_t const RC_10_1[] = { + 0x4eb026c2, 0x90595303, 0xaa8fe632, 0xfe928a92, 0x4115a419, + 0x93539532, 0x5db1cc4e, 0x541515ca, 0xbd1f55a8, 0x5a6e1a0d +}; +static uint32_t const RC_10_2[] = { + 0x4e4526b5, 0xa3565ff0, 0x0f8f20d8, 0x0b54bee1, 0x7d1a6c9d, + 0x17a6280a, 0xaa46c986, 0xc1199062, 0x182c5cde, 0xa00d53fe +}; +static uint32_t const RC_10_3[] = { + 0x4e162698, 0xb2535ba1, 0x6c8f9d65, 0x5816ad30, 0x691fd4fa, + 0x6bf5bcf9, 0xf8eb3525, 0xb21decfa, 0x7b3da417, 0xf62c94b4 +}; +static uint32_t const RC_10_4[] = { + 0x4faf265b, 0xc5484616, 0x45dcad21, 0xe08bd607, 0x0504fdb8, + 0x1e1f5257, 0x45fbc216, 0xeb529b1f, 0x52194e32, 0x5498c018 +}; +static uint32_t const RC_10_5[] = { + 0x4ffc2676, 0xd44d4247, 0x26dc109c, 0xb3c9c5d6, 0x110145df, + 0x624cc6a4, 0x17563eb5, 0x9856e787, 0x3108b6fb, 0x02b90752 +}; +static uint32_t const RC_10_6[] = { + 0x4f092601, 0xe7424eb4, 0x83dcd676, 0x460ff1a5, 0x2d0e8d5b, + 0xe6b97b9c, 0xe0a13b7d, 0x0d5a622f, 0x943bbf8d, 0xf8da4ea1 +}; +static uint32_t const RC_16_7[] = { + 0x3fba180c, 0x563ab9ab, 0x125ea5ef, 0x859da26c, 0xb8cf779b, + 0x7d4de793, 0x07efb49f, 0x8d525306, 0x1e08e6ab, 0x41729f87, + 0x8c4aef0a, 0x4aa0c9a7, 0xd93a95ef, 0xbb00d2af, 0xb62c5bf0, + 0x386d94d8 +}; +static uint32_t const RC_16_8[] = { + 0x3c9b19a7, 0xa9098694, 0x23f878da, 0xa7b647d3, 0x74fc9d78, + 0xeacaae11, 0x2f31a677, 0x4cc8c054, 0x2f51ca05, 0x5268f195, + 0x4f5b8a2b, 0xf614b4ac, 0xf1d95401, 0x764d2568, 0x6a493611, + 0x8eef9c3e +}; + +/* Rotate the 4-bit nibbles within a 16-bit word left */ +#define leftRotate4_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (4 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (4 - (bits2))); \ + } while (0) + +/* Rotate 16-bit subwords left */ +#define leftRotate16_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (16 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (16 - (bits2))); \ + } while (0) + +/* XOR the SATURNIN state with the key */ +#define saturnin_xor_key() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index]; \ + } while (0) + +/* XOR the SATURNIN state with a rotated version of the key */ +#define saturnin_xor_key_rotated() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index + 8]; \ + } while (0) + +/* Apply an SBOX layer for SATURNIN - definition from the specification */ +#define S_LAYER(a, b, c, d) \ + do { \ + (a) ^= (b) & (c); \ + (b) ^= (a) | (d); \ + (d) ^= (b) | (c); \ + (c) ^= (b) & (d); \ + (b) ^= (a) | (c); \ + (a) ^= (b) | (d); \ + } while (0) + +/* Apply an SBOX layer for SATURNIN in reverse */ +#define S_LAYER_INVERSE(a, b, c, d) \ + do { \ + (a) ^= (b) | (d); \ + (b) ^= (a) | (c); \ + (c) ^= (b) & (d); \ + (d) ^= (b) | (c); \ + (b) ^= (a) | (d); \ + (a) ^= (b) & (c); \ + } while (0) + +/** + * \brief Applies the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + a = S[0]; b = S[1]; c = S[2]; d = S[3]; + S_LAYER(a, b, c, d); + S[0] = b; S[1] = c; S[2] = d; S[3] = a; + + /* PI_1 on the second half of the state */ + a = S[4]; b = S[5]; c = S[6]; d = S[7]; + S_LAYER(a, b, c, d); + S[4] = d; S[5] = b; S[6] = a; S[7] = c; +} + +/** + * \brief Applies the inverse of the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox_inverse(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + b = S[0]; c = S[1]; d = S[2]; a = S[3]; + S_LAYER_INVERSE(a, b, c, d); + S[0] = a; S[1] = b; S[2] = c; S[3] = d; + + /* PI_1 on the second half of the state */ + d = S[4]; b = S[5]; a = S[6]; c = S[7]; + S_LAYER_INVERSE(a, b, c, d); + S[4] = a; S[5] = b; S[6] = c; S[7] = d; +} + +/** + * \brief Applies the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the MDS matrix to the state */ + #define SWAP(a) (((a) << 16) | ((a) >> 16)) + #define MUL(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x0; x0 = x1; x1 = x2; x2 = x3; x3 = tmp ^ x0; \ + } while (0) + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MUL(x4, x5, x6, x7, tmp); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + MUL(x0, x1, x2, x3, tmp); + MUL(x0, x1, x2, x3, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the inverse of the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds_inverse(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the inverse of the MDS matrix to the state */ + #define MULINV(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x3; x3 = x2; x2 = x1; x1 = x0; x0 = x1 ^ tmp; \ + } while (0) + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MULINV(x0, x1, x2, x3, tmp); + MULINV(x0, x1, x2, x3, tmp); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + MULINV(x4, x5, x6, x7, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[5], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[6], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[7], 0x7777U, 1, 0x1111, 3); +} + +/** + * \brief Applies the inverse of the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice_inverse(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[5], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[6], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[7], 0x1111U, 3, 0x7777, 1); +} + +/** + * \brief Applies the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[5], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[6], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[7], 0x0FFFU, 4, 0x000F, 12); +} + +/** + * \brief Applies the inverse of the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet_inverse(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[5], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[6], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[7], 0x000FU, 12, 0x0FFF, 4); +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Ciphertext output block, 32 bytes. + * \param input Plaintext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_decrypt() + */ +static void saturnin_block_encrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Perform all encryption rounds */ + for (; rounds > 0; rounds -= 2, RC += 2) { + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_slice(S); + saturnin_mds(S); + saturnin_slice_inverse(S); + S[0] ^= RC[0]; + saturnin_xor_key_rotated(); + + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_sheet(S); + saturnin_mds(S); + saturnin_sheet_inverse(S); + S[0] ^= RC[1]; + saturnin_xor_key(); + } + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Decrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Plaintext output block, 32 bytes. + * \param input Ciphertext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_encrypt() + */ +static void saturnin_block_decrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* Perform all decryption rounds */ + RC += rounds - 2; + for (; rounds > 0; rounds -= 2, RC -= 2) { + saturnin_xor_key(); + S[0] ^= RC[1]; + saturnin_sheet(S); + saturnin_mds_inverse(S); + saturnin_sheet_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + + saturnin_xor_key_rotated(); + S[0] ^= RC[0]; + saturnin_slice(S); + saturnin_mds_inverse(S); + saturnin_slice_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher and + * then XOR's itself to generate a new key. + * + * \param block Block to be encrypted and then XOR'ed with itself. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + */ +void saturnin_block_encrypt_xor + (const unsigned char *block, unsigned char *key, + unsigned rounds, const uint32_t *RC) +{ + unsigned char temp[32]; + saturnin_block_encrypt(temp, block, key, rounds, RC); + lw_xor_block_2_src(key, block, temp, 32); +} + +/** + * \brief Encrypts (or decrypts) a data packet in CTR mode. + * + * \param c Output ciphertext buffer. + * \param m Input plaintext buffer. + * \param mlen Length of the plaintext in bytes. + * \param k Points to the 32-byte key. + * \param block Points to the pre-formatted nonce block. + */ +static void saturnin_ctr_encrypt + (unsigned char *c, const unsigned char *m, unsigned long long mlen, + const unsigned char *k, unsigned char *block) +{ + /* Note: Specification requires a 95-bit counter but we only use 32-bit. + * This limits the maximum packet size to 128Gb. That should be OK */ + uint32_t counter = 1; + unsigned char out[32]; + while (mlen >= 32) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, 32); + c += 32; + m += 32; + mlen -= 32; + ++counter; + } + if (mlen > 0) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, (unsigned)mlen); + } +} + +/** + * \brief Pads an authenticates a message. + * + * \param tag Points to the authentication tag. + * \param block Temporary block of 32 bytes from the caller. + * \param m Points to the message to be authenticated. + * \param mlen Length of the message to be authenticated in bytes. + * \param rounds Number of rounds to perform. + * \param RC1 Round constants to use for domain separation on full blocks. + * \param RC2 Round constants to use for domain separation on the last block. + */ +static void saturnin_authenticate + (unsigned char *tag, unsigned char *block, + const unsigned char *m, unsigned long long mlen, + unsigned rounds, const uint32_t *RC1, const uint32_t *RC2) +{ + unsigned temp; + while (mlen >= 32) { + saturnin_block_encrypt_xor(m, tag, rounds, RC1); + m += 32; + mlen -= 32; + } + temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, 31 - temp); + saturnin_block_encrypt_xor(block, tag, rounds, RC2); +} + +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char *tag; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the plaintext in counter mode to produce the ciphertext */ + saturnin_ctr_encrypt(c, m, mlen, k, block); + + /* Set the counter back to zero and then encrypt the nonce */ + tag = c + mlen; + memcpy(tag, k, 32); + memset(block + 17, 0, 15); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, mlen, 10, RC_10_4, RC_10_5); + return 0; +} + +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char tag[32]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SATURNIN_TAG_SIZE) + return -1; + *mlen = clen - SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the nonce to initialize the authentication phase */ + memcpy(tag, k, 32); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, *mlen, 10, RC_10_4, RC_10_5); + + /* Decrypt the ciphertext in counter mode to produce the plaintext */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + saturnin_ctr_encrypt(m, c, *mlen, k, block); + + /* Check the authentication tag at the end of the message */ + return aead_check_tag + (m, *mlen, tag, c + *mlen, SATURNIN_TAG_SIZE); +} + +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned temp; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data allowed and m <= 15 bytes */ + if (adlen > 0 || mlen > 15) + return -2; + + /* Format the input block from the nonce and plaintext */ + temp = (unsigned)mlen; + memcpy(block, npub, 16); + memcpy(block + 16, m, temp); + block[16 + temp] = 0x80; /* Padding */ + memset(block + 17 + temp, 0, 15 - temp); + + /* Encrypt the input block to produce the output ciphertext */ + saturnin_block_encrypt(c, block, k, 10, RC_10_6); + *clen = 32; + return 0; +} + +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned check1, check2, len; + int index, result; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data and c is always 32 bytes */ + if (adlen > 0) + return -2; + if (clen != 32) + return -1; + + /* Decrypt the ciphertext block */ + saturnin_block_decrypt(block, c, k, 10, RC_10_6); + + /* Verify that the output block starts with the nonce and that it is + * padded correctly. We need to do this very carefully to avoid leaking + * any information that could be used in a padding oracle attack. Use the + * same algorithm as the reference implementation of SATURNIN-Short */ + check1 = 0; + for (index = 0; index < 16; ++index) + check1 |= npub[index] ^ block[index]; + check2 = 0xFF; + len = 0; + for (index = 15; index >= 0; --index) { + unsigned temp = block[16 + index]; + unsigned temp2 = check2 & -(1 - (((temp ^ 0x80) + 0xFF) >> 8)); + len |= temp2 & (unsigned)index; + check2 &= ~temp2; + check1 |= check2 & ((temp + 0xFF) >> 8); + } + check1 |= check2; + + /* At this point, check1 is zero if the nonce and plaintext are good, + * or non-zero if there was an error in the decrypted data */ + result = (((int)check1) - 1) >> 8; + + /* The "result" is -1 if the data is good or zero if the data is invalid. + * Copy either the plaintext or zeroes to the output buffer. We assume + * that the output buffer has space for up to 15 bytes. This may return + * some of the padding to the caller but as long as they restrict + * themselves to the first *mlen bytes then it shouldn't be a problem */ + for (index = 0; index < 15; ++index) + m[index] = block[16 + index] & result; + *mlen = len; + return ~result; +} + +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char tag[32]; + unsigned char block[32]; + memset(tag, 0, sizeof(tag)); + saturnin_authenticate(tag, block, in, inlen, 16, RC_16_7, RC_16_8); + memcpy(out, tag, 32); + return 0; +} + +void saturnin_hash_init(saturnin_hash_state_t *state) +{ + memset(state, 0, sizeof(saturnin_hash_state_t)); +} + +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned temp; + + /* Handle the partial left-over block from last time */ + if (state->s.count) { + temp = 32 - state->s.count; + if (temp > inlen) { + temp = (unsigned)inlen; + memcpy(state->s.block + state->s.count, in, temp); + state->s.count += temp; + return; + } + memcpy(state->s.block + state->s.count, in, temp); + state->s.count = 0; + in += temp; + inlen -= temp; + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_7); + } + + /* Process full blocks that are aligned at state->s.count == 0 */ + while (inlen >= 32) { + saturnin_block_encrypt_xor(in, state->s.hash, 16, RC_16_7); + in += 32; + inlen -= 32; + } + + /* Process the left-over block at the end of the input */ + temp = (unsigned)inlen; + memcpy(state->s.block, in, temp); + state->s.count = temp; +} + +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out) +{ + /* Pad the final block */ + state->s.block[state->s.count] = 0x80; + memset(state->s.block + state->s.count + 1, 0, 31 - state->s.count); + + /* Generate the final hash value */ + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_8); + memcpy(out, state->s.hash, 32); +} diff --git a/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.h b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.h new file mode 100644 index 0000000..873d950 --- /dev/null +++ b/saturnin/Implementations/crypto_aead/saturninshortv2/rhys-avr/saturnin.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SATURNIN_H +#define LWCRYPTO_SATURNIN_H + +#include "aead-common.h" + +/** + * \file saturnin.h + * \brief Saturnin authenticated encryption algorithm. + * + * The Saturnin family consists of two members: SATURNIN-CTR-Cascade and + * SATURNIN-Short. Both take a 256-bit key and a 128-bit nonce. + * Internally they use a 256-bit block cipher similar in construction to AES. + * + * SATURNIN-Short does not support associated data or plaintext packets + * with more than 15 bytes. This makes it very efficient on short packets + * with only a single block operation involved. + * + * This implementation of SATURNIN-Short will return an error if the + * caller supplies associated data or more than 15 bytes of plaintext. + * + * References: https://project.inria.fr/saturnin/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SATURNIN family members. + */ +#define SATURNIN_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for SATURNIN-CTR-Cascade or the + * total size of the ciphertext for SATURNIN-Short. + */ +#define SATURNIN_TAG_SIZE 32 + +/** + * \brief Size of the nonce for all SATURNIN family members. + */ +#define SATURNIN_NONCE_SIZE 16 + +/** + * \brief Size of the hash for SATURNIN-Hash. + */ +#define SATURNIN_HASH_SIZE 32 + +/** + * \brief State information for SATURNIN-Hash incremental modes. + */ +typedef union +{ + struct { + unsigned char hash[32]; /**< Current hash state */ + unsigned char block[32]; /**< Left-over block data from last update */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} saturnin_hash_state_t; + +/** + * \brief Meta-information block for the SATURNIN-CTR-Cascade cipher. + */ +extern aead_cipher_t const saturnin_cipher; + +/** + * \brief Meta-information block for the SATURNIN-Short cipher. + */ +extern aead_cipher_t const saturnin_short_cipher; + +/** + * \brief Meta-information block for SATURNIN-Hash. + */ +extern aead_hash_algorithm_t const saturnin_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 32 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa saturnin_aead_decrypt() + */ +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 32 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa saturnin_aead_encrypt() + */ +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-Short. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which is always 32. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes, which must be + * less than or equal to 15 bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or -2 if the caller supplied too many bytes of + * plaintext or they supplied associated data. + * + * \sa saturnin_short_aead_decrypt() + */ +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-Short. + * + * \param m Buffer to receive the plaintext message on output. There must + * be at least 15 bytes of space in this buffer even if the caller expects + * to receive less data than that. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext to decrypt. + * \param clen Length of the input data in bytes, which must be 32. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or -2 if the caller supplied associated data. + * + * \sa saturnin_short_aead_encrypt() + */ +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with SATURNIN to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SATURNIN_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa saturnin_hash_update(), saturnin_hash_finalize(), saturnin_hash() + */ +void saturnin_hash_init(saturnin_hash_state_t *state); + +/** + * \brief Updates an SATURNIN-Hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa saturnin_hash_init(), saturnin_hash_finalize() + */ +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa saturnin_hash_init(), saturnin_hash_update() + */ +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.c b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.h b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/api.h b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/hash.c b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/hash.c new file mode 100644 index 0000000..76a7173 --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "saturnin.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return saturnin_hash(out, in, inlen); +} diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/internal-util.h b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.c b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.c new file mode 100644 index 0000000..734fc69 --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.c @@ -0,0 +1,781 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "saturnin.h" +#include "internal-util.h" +#include + +aead_cipher_t const saturnin_cipher = { + "SATURNIN-CTR-Cascade", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_aead_encrypt, + saturnin_aead_decrypt +}; + +aead_cipher_t const saturnin_short_cipher = { + "SATURNIN-Short", + SATURNIN_KEY_SIZE, + SATURNIN_NONCE_SIZE, + SATURNIN_TAG_SIZE, + AEAD_FLAG_NONE, + saturnin_short_aead_encrypt, + saturnin_short_aead_decrypt +}; + +aead_hash_algorithm_t const saturnin_hash_algorithm = { + "SATURNIN-Hash", + sizeof(saturnin_hash_state_t), + SATURNIN_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + saturnin_hash, + (aead_hash_init_t)saturnin_hash_init, + (aead_hash_update_t)saturnin_hash_update, + (aead_hash_finalize_t)saturnin_hash_finalize, + 0, /* absorb */ + 0 /* squeeze */ +}; + +/* Round constant tables for various combinations of rounds and domain_sep */ +static uint32_t const RC_10_1[] = { + 0x4eb026c2, 0x90595303, 0xaa8fe632, 0xfe928a92, 0x4115a419, + 0x93539532, 0x5db1cc4e, 0x541515ca, 0xbd1f55a8, 0x5a6e1a0d +}; +static uint32_t const RC_10_2[] = { + 0x4e4526b5, 0xa3565ff0, 0x0f8f20d8, 0x0b54bee1, 0x7d1a6c9d, + 0x17a6280a, 0xaa46c986, 0xc1199062, 0x182c5cde, 0xa00d53fe +}; +static uint32_t const RC_10_3[] = { + 0x4e162698, 0xb2535ba1, 0x6c8f9d65, 0x5816ad30, 0x691fd4fa, + 0x6bf5bcf9, 0xf8eb3525, 0xb21decfa, 0x7b3da417, 0xf62c94b4 +}; +static uint32_t const RC_10_4[] = { + 0x4faf265b, 0xc5484616, 0x45dcad21, 0xe08bd607, 0x0504fdb8, + 0x1e1f5257, 0x45fbc216, 0xeb529b1f, 0x52194e32, 0x5498c018 +}; +static uint32_t const RC_10_5[] = { + 0x4ffc2676, 0xd44d4247, 0x26dc109c, 0xb3c9c5d6, 0x110145df, + 0x624cc6a4, 0x17563eb5, 0x9856e787, 0x3108b6fb, 0x02b90752 +}; +static uint32_t const RC_10_6[] = { + 0x4f092601, 0xe7424eb4, 0x83dcd676, 0x460ff1a5, 0x2d0e8d5b, + 0xe6b97b9c, 0xe0a13b7d, 0x0d5a622f, 0x943bbf8d, 0xf8da4ea1 +}; +static uint32_t const RC_16_7[] = { + 0x3fba180c, 0x563ab9ab, 0x125ea5ef, 0x859da26c, 0xb8cf779b, + 0x7d4de793, 0x07efb49f, 0x8d525306, 0x1e08e6ab, 0x41729f87, + 0x8c4aef0a, 0x4aa0c9a7, 0xd93a95ef, 0xbb00d2af, 0xb62c5bf0, + 0x386d94d8 +}; +static uint32_t const RC_16_8[] = { + 0x3c9b19a7, 0xa9098694, 0x23f878da, 0xa7b647d3, 0x74fc9d78, + 0xeacaae11, 0x2f31a677, 0x4cc8c054, 0x2f51ca05, 0x5268f195, + 0x4f5b8a2b, 0xf614b4ac, 0xf1d95401, 0x764d2568, 0x6a493611, + 0x8eef9c3e +}; + +/* Rotate the 4-bit nibbles within a 16-bit word left */ +#define leftRotate4_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (4 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (4 - (bits2))); \ + } while (0) + +/* Rotate 16-bit subwords left */ +#define leftRotate16_N(a, mask1, bits1, mask2, bits2) \ + do { \ + uint32_t _temp = (a); \ + (a) = ((_temp & (mask1)) << (bits1)) | \ + ((_temp & ((mask1) ^ (uint32_t)0xFFFFU)) >> (16 - (bits1))) | \ + ((_temp & (((uint32_t)(mask2)) << 16)) << (bits2)) | \ + ((_temp & (((uint32_t)((mask2)) << 16) ^ 0xFFFF0000U)) >> (16 - (bits2))); \ + } while (0) + +/* XOR the SATURNIN state with the key */ +#define saturnin_xor_key() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index]; \ + } while (0) + +/* XOR the SATURNIN state with a rotated version of the key */ +#define saturnin_xor_key_rotated() \ + do { \ + for (index = 0; index < 8; ++index) \ + S[index] ^= K[index + 8]; \ + } while (0) + +/* Apply an SBOX layer for SATURNIN - definition from the specification */ +#define S_LAYER(a, b, c, d) \ + do { \ + (a) ^= (b) & (c); \ + (b) ^= (a) | (d); \ + (d) ^= (b) | (c); \ + (c) ^= (b) & (d); \ + (b) ^= (a) | (c); \ + (a) ^= (b) | (d); \ + } while (0) + +/* Apply an SBOX layer for SATURNIN in reverse */ +#define S_LAYER_INVERSE(a, b, c, d) \ + do { \ + (a) ^= (b) | (d); \ + (b) ^= (a) | (c); \ + (c) ^= (b) & (d); \ + (d) ^= (b) | (c); \ + (b) ^= (a) | (d); \ + (a) ^= (b) & (c); \ + } while (0) + +/** + * \brief Applies the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + a = S[0]; b = S[1]; c = S[2]; d = S[3]; + S_LAYER(a, b, c, d); + S[0] = b; S[1] = c; S[2] = d; S[3] = a; + + /* PI_1 on the second half of the state */ + a = S[4]; b = S[5]; c = S[6]; d = S[7]; + S_LAYER(a, b, c, d); + S[4] = d; S[5] = b; S[6] = a; S[7] = c; +} + +/** + * \brief Applies the inverse of the SBOX to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sbox_inverse(uint32_t S[8]) +{ + uint32_t a, b, c, d; + + /* PI_0 on the first half of the state */ + b = S[0]; c = S[1]; d = S[2]; a = S[3]; + S_LAYER_INVERSE(a, b, c, d); + S[0] = a; S[1] = b; S[2] = c; S[3] = d; + + /* PI_1 on the second half of the state */ + d = S[4]; b = S[5]; a = S[6]; c = S[7]; + S_LAYER_INVERSE(a, b, c, d); + S[4] = a; S[5] = b; S[6] = c; S[7] = d; +} + +/** + * \brief Applies the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the MDS matrix to the state */ + #define SWAP(a) (((a) << 16) | ((a) >> 16)) + #define MUL(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x0; x0 = x1; x1 = x2; x2 = x3; x3 = tmp ^ x0; \ + } while (0) + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MUL(x4, x5, x6, x7, tmp); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + MUL(x0, x1, x2, x3, tmp); + MUL(x0, x1, x2, x3, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the inverse of the MDS matrix to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_mds_inverse(uint32_t S[8]) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t tmp; + + /* Load the state into temporary working variables */ + x0 = S[0]; x1 = S[1]; x2 = S[2]; x3 = S[3]; + x4 = S[4]; x5 = S[5]; x6 = S[6]; x7 = S[7]; + + /* Apply the inverse of the MDS matrix to the state */ + #define MULINV(x0, x1, x2, x3, tmp) \ + do { \ + tmp = x3; x3 = x2; x2 = x1; x1 = x0; x0 = x1 ^ tmp; \ + } while (0) + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + MULINV(x0, x1, x2, x3, tmp); + MULINV(x0, x1, x2, x3, tmp); + x6 ^= SWAP(x2); x7 ^= SWAP(x3); + x4 ^= SWAP(x0); x5 ^= SWAP(x1); + MULINV(x4, x5, x6, x7, tmp); + x0 ^= x4; x1 ^= x5; x2 ^= x6; x3 ^= x7; + + /* Store the temporary working variables back into the state */ + S[0] = x0; S[1] = x1; S[2] = x2; S[3] = x3; + S[4] = x4; S[5] = x5; S[6] = x6; S[7] = x7; +} + +/** + * \brief Applies the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[5], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[6], 0x7777U, 1, 0x1111, 3); + leftRotate4_N(S[7], 0x7777U, 1, 0x1111, 3); +} + +/** + * \brief Applies the inverse of the slice permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_slice_inverse(uint32_t S[8]) +{ + leftRotate4_N(S[0], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[1], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[2], 0xFFFFU, 0, 0x3333, 2); + leftRotate4_N(S[3], 0xFFFFU, 0, 0x3333, 2); + + leftRotate4_N(S[4], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[5], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[6], 0x1111U, 3, 0x7777, 1); + leftRotate4_N(S[7], 0x1111U, 3, 0x7777, 1); +} + +/** + * \brief Applies the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[5], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[6], 0x0FFFU, 4, 0x000F, 12); + leftRotate16_N(S[7], 0x0FFFU, 4, 0x000F, 12); +} + +/** + * \brief Applies the inverse of the sheet permutation to the SATURNIN state. + * + * \param S The state. + */ +static void saturnin_sheet_inverse(uint32_t S[8]) +{ + leftRotate16_N(S[0], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[1], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[2], 0xFFFFU, 0, 0x00FF, 8); + leftRotate16_N(S[3], 0xFFFFU, 0, 0x00FF, 8); + + leftRotate16_N(S[4], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[5], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[6], 0x000FU, 12, 0x0FFF, 4); + leftRotate16_N(S[7], 0x000FU, 12, 0x0FFF, 4); +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Ciphertext output block, 32 bytes. + * \param input Plaintext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_decrypt() + */ +static void saturnin_block_encrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Perform all encryption rounds */ + for (; rounds > 0; rounds -= 2, RC += 2) { + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_slice(S); + saturnin_mds(S); + saturnin_slice_inverse(S); + S[0] ^= RC[0]; + saturnin_xor_key_rotated(); + + saturnin_sbox(S); + saturnin_mds(S); + saturnin_sbox(S); + saturnin_sheet(S); + saturnin_mds(S); + saturnin_sheet_inverse(S); + S[0] ^= RC[1]; + saturnin_xor_key(); + } + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Decrypts a 256-bit block with the SATURNIN block cipher. + * + * \param output Plaintext output block, 32 bytes. + * \param input Ciphertext input block, 32 bytes. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + * + * The \a input and \a output buffers can be the same. + * + * \sa saturnin_block_encrypt() + */ +static void saturnin_block_decrypt + (unsigned char *output, const unsigned char *input, + const unsigned char *key, unsigned rounds, const uint32_t *RC) +{ + uint32_t K[16]; + uint32_t S[8]; + uint32_t temp; + unsigned index; + + /* Unpack the key and the input block */ + for (index = 0; index < 16; index += 2) { + temp = ((uint32_t)(key[index])) | + (((uint32_t)(key[index + 1])) << 8) | + (((uint32_t)(key[index + 16])) << 16) | + (((uint32_t)(key[index + 17])) << 24); + K[index / 2] = temp; + K[8 + (index / 2)] = ((temp & 0x001F001FU) << 11) | + ((temp >> 5) & 0x07FF07FFU); + S[index / 2] = ((uint32_t)(input[index])) | + (((uint32_t)(input[index + 1])) << 8) | + (((uint32_t)(input[index + 16])) << 16) | + (((uint32_t)(input[index + 17])) << 24); + } + + /* Perform all decryption rounds */ + RC += rounds - 2; + for (; rounds > 0; rounds -= 2, RC -= 2) { + saturnin_xor_key(); + S[0] ^= RC[1]; + saturnin_sheet(S); + saturnin_mds_inverse(S); + saturnin_sheet_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + + saturnin_xor_key_rotated(); + S[0] ^= RC[0]; + saturnin_slice(S); + saturnin_mds_inverse(S); + saturnin_slice_inverse(S); + saturnin_sbox_inverse(S); + saturnin_mds_inverse(S); + saturnin_sbox_inverse(S); + } + + /* XOR the key into the state */ + saturnin_xor_key(); + + /* Encode the state into the output block */ + for (index = 0; index < 16; index += 2) { + temp = S[index / 2]; + output[index] = (uint8_t)temp; + output[index + 1] = (uint8_t)(temp >> 8); + output[index + 16] = (uint8_t)(temp >> 16); + output[index + 17] = (uint8_t)(temp >> 24); + } +} + +/** + * \brief Encrypts a 256-bit block with the SATURNIN block cipher and + * then XOR's itself to generate a new key. + * + * \param block Block to be encrypted and then XOR'ed with itself. + * \param key Points to the 32 byte key for the block cipher. + * \param rounds Number of rounds to perform. + * \param RC Round constants to use for domain separation. + */ +void saturnin_block_encrypt_xor + (const unsigned char *block, unsigned char *key, + unsigned rounds, const uint32_t *RC) +{ + unsigned char temp[32]; + saturnin_block_encrypt(temp, block, key, rounds, RC); + lw_xor_block_2_src(key, block, temp, 32); +} + +/** + * \brief Encrypts (or decrypts) a data packet in CTR mode. + * + * \param c Output ciphertext buffer. + * \param m Input plaintext buffer. + * \param mlen Length of the plaintext in bytes. + * \param k Points to the 32-byte key. + * \param block Points to the pre-formatted nonce block. + */ +static void saturnin_ctr_encrypt + (unsigned char *c, const unsigned char *m, unsigned long long mlen, + const unsigned char *k, unsigned char *block) +{ + /* Note: Specification requires a 95-bit counter but we only use 32-bit. + * This limits the maximum packet size to 128Gb. That should be OK */ + uint32_t counter = 1; + unsigned char out[32]; + while (mlen >= 32) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, 32); + c += 32; + m += 32; + mlen -= 32; + ++counter; + } + if (mlen > 0) { + be_store_word32(block + 28, counter); + saturnin_block_encrypt(out, block, k, 10, RC_10_1); + lw_xor_block_2_src(c, out, m, (unsigned)mlen); + } +} + +/** + * \brief Pads an authenticates a message. + * + * \param tag Points to the authentication tag. + * \param block Temporary block of 32 bytes from the caller. + * \param m Points to the message to be authenticated. + * \param mlen Length of the message to be authenticated in bytes. + * \param rounds Number of rounds to perform. + * \param RC1 Round constants to use for domain separation on full blocks. + * \param RC2 Round constants to use for domain separation on the last block. + */ +static void saturnin_authenticate + (unsigned char *tag, unsigned char *block, + const unsigned char *m, unsigned long long mlen, + unsigned rounds, const uint32_t *RC1, const uint32_t *RC2) +{ + unsigned temp; + while (mlen >= 32) { + saturnin_block_encrypt_xor(m, tag, rounds, RC1); + m += 32; + mlen -= 32; + } + temp = (unsigned)mlen; + memcpy(block, m, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, 31 - temp); + saturnin_block_encrypt_xor(block, tag, rounds, RC2); +} + +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char *tag; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the plaintext in counter mode to produce the ciphertext */ + saturnin_ctr_encrypt(c, m, mlen, k, block); + + /* Set the counter back to zero and then encrypt the nonce */ + tag = c + mlen; + memcpy(tag, k, 32); + memset(block + 17, 0, 15); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, mlen, 10, RC_10_4, RC_10_5); + return 0; +} + +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned char tag[32]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SATURNIN_TAG_SIZE) + return -1; + *mlen = clen - SATURNIN_TAG_SIZE; + + /* Format the input block from the padded nonce */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + + /* Encrypt the nonce to initialize the authentication phase */ + memcpy(tag, k, 32); + saturnin_block_encrypt_xor(block, tag, 10, RC_10_2); + + /* Authenticate the associated data and the ciphertext */ + saturnin_authenticate(tag, block, ad, adlen, 10, RC_10_2, RC_10_3); + saturnin_authenticate(tag, block, c, *mlen, 10, RC_10_4, RC_10_5); + + /* Decrypt the ciphertext in counter mode to produce the plaintext */ + memcpy(block, npub, 16); + block[16] = 0x80; + memset(block + 17, 0, 15); + saturnin_ctr_encrypt(m, c, *mlen, k, block); + + /* Check the authentication tag at the end of the message */ + return aead_check_tag + (m, *mlen, tag, c + *mlen, SATURNIN_TAG_SIZE); +} + +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned temp; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data allowed and m <= 15 bytes */ + if (adlen > 0 || mlen > 15) + return -2; + + /* Format the input block from the nonce and plaintext */ + temp = (unsigned)mlen; + memcpy(block, npub, 16); + memcpy(block + 16, m, temp); + block[16 + temp] = 0x80; /* Padding */ + memset(block + 17 + temp, 0, 15 - temp); + + /* Encrypt the input block to produce the output ciphertext */ + saturnin_block_encrypt(c, block, k, 10, RC_10_6); + *clen = 32; + return 0; +} + +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char block[32]; + unsigned check1, check2, len; + int index, result; + (void)nsec; + (void)ad; + + /* Validate the parameters: no associated data and c is always 32 bytes */ + if (adlen > 0) + return -2; + if (clen != 32) + return -1; + + /* Decrypt the ciphertext block */ + saturnin_block_decrypt(block, c, k, 10, RC_10_6); + + /* Verify that the output block starts with the nonce and that it is + * padded correctly. We need to do this very carefully to avoid leaking + * any information that could be used in a padding oracle attack. Use the + * same algorithm as the reference implementation of SATURNIN-Short */ + check1 = 0; + for (index = 0; index < 16; ++index) + check1 |= npub[index] ^ block[index]; + check2 = 0xFF; + len = 0; + for (index = 15; index >= 0; --index) { + unsigned temp = block[16 + index]; + unsigned temp2 = check2 & -(1 - (((temp ^ 0x80) + 0xFF) >> 8)); + len |= temp2 & (unsigned)index; + check2 &= ~temp2; + check1 |= check2 & ((temp + 0xFF) >> 8); + } + check1 |= check2; + + /* At this point, check1 is zero if the nonce and plaintext are good, + * or non-zero if there was an error in the decrypted data */ + result = (((int)check1) - 1) >> 8; + + /* The "result" is -1 if the data is good or zero if the data is invalid. + * Copy either the plaintext or zeroes to the output buffer. We assume + * that the output buffer has space for up to 15 bytes. This may return + * some of the padding to the caller but as long as they restrict + * themselves to the first *mlen bytes then it shouldn't be a problem */ + for (index = 0; index < 15; ++index) + m[index] = block[16 + index] & result; + *mlen = len; + return ~result; +} + +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char tag[32]; + unsigned char block[32]; + memset(tag, 0, sizeof(tag)); + saturnin_authenticate(tag, block, in, inlen, 16, RC_16_7, RC_16_8); + memcpy(out, tag, 32); + return 0; +} + +void saturnin_hash_init(saturnin_hash_state_t *state) +{ + memset(state, 0, sizeof(saturnin_hash_state_t)); +} + +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + unsigned temp; + + /* Handle the partial left-over block from last time */ + if (state->s.count) { + temp = 32 - state->s.count; + if (temp > inlen) { + temp = (unsigned)inlen; + memcpy(state->s.block + state->s.count, in, temp); + state->s.count += temp; + return; + } + memcpy(state->s.block + state->s.count, in, temp); + state->s.count = 0; + in += temp; + inlen -= temp; + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_7); + } + + /* Process full blocks that are aligned at state->s.count == 0 */ + while (inlen >= 32) { + saturnin_block_encrypt_xor(in, state->s.hash, 16, RC_16_7); + in += 32; + inlen -= 32; + } + + /* Process the left-over block at the end of the input */ + temp = (unsigned)inlen; + memcpy(state->s.block, in, temp); + state->s.count = temp; +} + +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out) +{ + /* Pad the final block */ + state->s.block[state->s.count] = 0x80; + memset(state->s.block + state->s.count + 1, 0, 31 - state->s.count); + + /* Generate the final hash value */ + saturnin_block_encrypt_xor(state->s.block, state->s.hash, 16, RC_16_8); + memcpy(out, state->s.hash, 32); +} diff --git a/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.h b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.h new file mode 100644 index 0000000..873d950 --- /dev/null +++ b/saturnin/Implementations/crypto_hash/saturninhashv2/rhys-avr/saturnin.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SATURNIN_H +#define LWCRYPTO_SATURNIN_H + +#include "aead-common.h" + +/** + * \file saturnin.h + * \brief Saturnin authenticated encryption algorithm. + * + * The Saturnin family consists of two members: SATURNIN-CTR-Cascade and + * SATURNIN-Short. Both take a 256-bit key and a 128-bit nonce. + * Internally they use a 256-bit block cipher similar in construction to AES. + * + * SATURNIN-Short does not support associated data or plaintext packets + * with more than 15 bytes. This makes it very efficient on short packets + * with only a single block operation involved. + * + * This implementation of SATURNIN-Short will return an error if the + * caller supplies associated data or more than 15 bytes of plaintext. + * + * References: https://project.inria.fr/saturnin/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SATURNIN family members. + */ +#define SATURNIN_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for SATURNIN-CTR-Cascade or the + * total size of the ciphertext for SATURNIN-Short. + */ +#define SATURNIN_TAG_SIZE 32 + +/** + * \brief Size of the nonce for all SATURNIN family members. + */ +#define SATURNIN_NONCE_SIZE 16 + +/** + * \brief Size of the hash for SATURNIN-Hash. + */ +#define SATURNIN_HASH_SIZE 32 + +/** + * \brief State information for SATURNIN-Hash incremental modes. + */ +typedef union +{ + struct { + unsigned char hash[32]; /**< Current hash state */ + unsigned char block[32]; /**< Left-over block data from last update */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: 0 for absorb, 1 for squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} saturnin_hash_state_t; + +/** + * \brief Meta-information block for the SATURNIN-CTR-Cascade cipher. + */ +extern aead_cipher_t const saturnin_cipher; + +/** + * \brief Meta-information block for the SATURNIN-Short cipher. + */ +extern aead_cipher_t const saturnin_short_cipher; + +/** + * \brief Meta-information block for SATURNIN-Hash. + */ +extern aead_hash_algorithm_t const saturnin_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 32 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa saturnin_aead_decrypt() + */ +int saturnin_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-CTR-Cascade. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 32 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa saturnin_aead_encrypt() + */ +int saturnin_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SATURNIN-Short. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which is always 32. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes, which must be + * less than or equal to 15 bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or -2 if the caller supplied too many bytes of + * plaintext or they supplied associated data. + * + * \sa saturnin_short_aead_decrypt() + */ +int saturnin_short_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SATURNIN-Short. + * + * \param m Buffer to receive the plaintext message on output. There must + * be at least 15 bytes of space in this buffer even if the caller expects + * to receive less data than that. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext to decrypt. + * \param clen Length of the input data in bytes, which must be 32. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes, which must be zero. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or -2 if the caller supplied associated data. + * + * \sa saturnin_short_aead_encrypt() + */ +int saturnin_short_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with SATURNIN to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SATURNIN_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int saturnin_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa saturnin_hash_update(), saturnin_hash_finalize(), saturnin_hash() + */ +void saturnin_hash_init(saturnin_hash_state_t *state); + +/** + * \brief Updates an SATURNIN-Hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa saturnin_hash_init(), saturnin_hash_finalize() + */ +void saturnin_hash_update + (saturnin_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an SATURNIN-Hash hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa saturnin_hash_init(), saturnin_hash_update() + */ +void saturnin_hash_finalize + (saturnin_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..64c6ea2 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m5_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m5_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk296128v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..d304a40 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m6_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m6_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk29664v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..00e9d2e --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m1_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m1_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk3128128v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/api.h new file mode 100644 index 0000000..4bf8f5c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..db41b19 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m3_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m3_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk312864v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..92605fe --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m2_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m2_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk396128v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.c b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/api.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/encrypt.c b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..0623826 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "skinny-aead.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m4_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return skinny_aead_m4_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-util.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.c b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.c new file mode 100644 index 0000000..7558527 --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.c @@ -0,0 +1,804 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-aead.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_cipher_t const skinny_aead_m1_cipher = { + "SKINNY-AEAD-M1", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M1_NONCE_SIZE, + SKINNY_AEAD_M1_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m1_encrypt, + skinny_aead_m1_decrypt +}; + +aead_cipher_t const skinny_aead_m2_cipher = { + "SKINNY-AEAD-M2", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M2_NONCE_SIZE, + SKINNY_AEAD_M2_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m2_encrypt, + skinny_aead_m2_decrypt +}; + +aead_cipher_t const skinny_aead_m3_cipher = { + "SKINNY-AEAD-M3", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M3_NONCE_SIZE, + SKINNY_AEAD_M3_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m3_encrypt, + skinny_aead_m3_decrypt +}; + +aead_cipher_t const skinny_aead_m4_cipher = { + "SKINNY-AEAD-M4", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M4_NONCE_SIZE, + SKINNY_AEAD_M4_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m4_encrypt, + skinny_aead_m4_decrypt +}; + +aead_cipher_t const skinny_aead_m5_cipher = { + "SKINNY-AEAD-M5", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M5_NONCE_SIZE, + SKINNY_AEAD_M5_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m5_encrypt, + skinny_aead_m5_decrypt +}; + +aead_cipher_t const skinny_aead_m6_cipher = { + "SKINNY-AEAD-M6", + SKINNY_AEAD_KEY_SIZE, + SKINNY_AEAD_M6_NONCE_SIZE, + SKINNY_AEAD_M6_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + skinny_aead_m6_encrypt, + skinny_aead_m6_decrypt +}; + +/* Domain separator prefixes for all of the SKINNY-AEAD family members */ +#define DOMAIN_SEP_M1 0x00 +#define DOMAIN_SEP_M2 0x10 +#define DOMAIN_SEP_M3 0x08 +#define DOMAIN_SEP_M4 0x18 +#define DOMAIN_SEP_M5 0x10 +#define DOMAIN_SEP_M6 0x18 + +/** + * \brief Initialize the key and nonce for SKINNY-128-384 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[48]; + memset(k, 0, 16); + memcpy(k + 16, nonce, nonce_len); + memset(k + 16 + nonce_len, 0, 16 - nonce_len); + memcpy(k + 32, key, 16); + skinny_128_384_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_384_set_domain(ks,d) ((ks)->TK1[15] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-384. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 64-bit LFSR value. + */ +#define skinny_aead_128_384_set_lfsr(ks,lfsr) le_store_word64((ks)->TK1, (lfsr)) + +/** + * \brief Updates the LFSR value for SKINNY-128-384. + * + * \param lfsr 64-bit LFSR value to be updated. + */ +#define skinny_aead_128_384_update_lfsr(lfsr) \ + do { \ + uint8_t feedback = ((lfsr) & (1ULL << 63)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ feedback; \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_384_authenticate + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + skinny_aead_128_384_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_384_encrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-384 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_384_decrypt + (skinny_128_384_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint64_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_384_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_128_384_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_384_update_lfsr(lfsr); + } + skinny_aead_128_384_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_384_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_384_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_384_update_lfsr(lfsr); + skinny_aead_128_384_set_lfsr(ks, lfsr); + skinny_aead_128_384_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_384_set_domain(ks, prefix | 4); + } + skinny_128_384_encrypt(ks, sum, sum); +} + +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M1, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M1_TAG_SIZE); + return 0; +} + +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M1_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M1_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M1_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M1, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M1, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M1_TAG_SIZE); +} + +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M2, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M2_TAG_SIZE); + return 0; +} + +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M2_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M2_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M2_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M2, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M2, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M2_TAG_SIZE); +} + +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M3, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M3_TAG_SIZE); + return 0; +} + +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M3_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M3_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M3_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M3, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M3, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M3_TAG_SIZE); +} + +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_384_encrypt(&ks, DOMAIN_SEP_M4, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M4_TAG_SIZE); + return 0; +} + +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_384_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M4_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M4_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_384_init(&ks, k, npub, SKINNY_AEAD_M4_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_384_decrypt(&ks, DOMAIN_SEP_M4, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_384_authenticate(&ks, DOMAIN_SEP_M4, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M4_TAG_SIZE); +} + +/** + * \brief Initialize the key and nonce for SKINNY-128-256 based AEAD schemes. + * + * \param ks The key schedule to initialize. + * \param key Points to the 16 bytes of the key. + * \param nonce Points to the nonce. + * \param nonce_len Length of the nonce in bytes. + */ +static void skinny_aead_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char *key, + const unsigned char *nonce, unsigned nonce_len) +{ + unsigned char k[32]; + memset(k, 0, 16 - nonce_len); + memcpy(k + 16 - nonce_len, nonce, nonce_len); + memcpy(k + 16, key, 16); + skinny_128_256_init(ks, k); +} + +/** + * \brief Set the domain separation value in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param d Domain separation value to write into the tweak. + */ +#define skinny_aead_128_256_set_domain(ks,d) ((ks)->TK1[3] = (d)) + +/** + * \brief Sets the LFSR field in the tweak for SKINNY-128-256. + * + * \param ks Key schedule for the block cipher. + * \param lfsr 24-bit LFSR value. + */ +#define skinny_aead_128_256_set_lfsr(ks,lfsr) \ + do { \ + (ks)->TK1[0] = (uint8_t)(lfsr); \ + (ks)->TK1[1] = (uint8_t)((lfsr) >> 8); \ + (ks)->TK1[2] = (uint8_t)((lfsr) >> 16); \ + } while (0) + +/** + * \brief Updates the LFSR value for SKINNY-128-256. + * + * \param lfsr 24-bit LFSR value to be updated. + */ +#define skinny_aead_128_256_update_lfsr(lfsr) \ + do { \ + uint32_t feedback = ((lfsr) & (((uint32_t)1) << 23)) ? 0x1B : 0x00; \ + (lfsr) = ((lfsr) << 1) ^ (feedback); \ + } while (0) + +/** + * \brief Authenticates the associated data for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param tag Final tag to XOR the authentication checksum into. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void skinny_aead_128_256_authenticate + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char tag[SKINNY_128_BLOCK_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + skinny_aead_128_256_set_domain(ks, prefix | 2); + while (adlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_encrypt(ks, block, ad); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + ad += SKINNY_128_BLOCK_SIZE; + adlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 3); + memcpy(block, ad, temp); + block[temp] = 0x80; + memset(block + temp + 1, 0, SKINNY_128_BLOCK_SIZE - temp - 1); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block(tag, block, SKINNY_128_BLOCK_SIZE); + } +} + +/** + * \brief Encrypts the plaintext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param c Points to the buffer to receive the ciphertext. + * \param m Points to the plaintext buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void skinny_aead_128_256_encrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, c, m); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(c, block, m, temp); + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +/** + * \brief Decrypts the ciphertext for a SKINNY-128-256 based AEAD. + * + * \param ks The key schedule to use. + * \param prefix Domain separation prefix for the family member. + * \param sum Authenticated checksum over the plaintext. + * \param m Points to the buffer to receive the plaintext. + * \param c Points to the ciphertext buffer. + * \param mlen Number of bytes of ciphertext to be decrypted. + */ +static void skinny_aead_128_256_decrypt + (skinny_128_256_key_schedule_t *ks, unsigned char prefix, + unsigned char sum[SKINNY_128_BLOCK_SIZE], unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + unsigned char block[SKINNY_128_BLOCK_SIZE]; + uint32_t lfsr = 1; + memset(sum, 0, SKINNY_128_BLOCK_SIZE); + skinny_aead_128_256_set_domain(ks, prefix | 0); + while (mlen >= SKINNY_128_BLOCK_SIZE) { + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_128_256_decrypt(ks, m, c); + lw_xor_block(sum, m, SKINNY_128_BLOCK_SIZE); + c += SKINNY_128_BLOCK_SIZE; + m += SKINNY_128_BLOCK_SIZE; + mlen -= SKINNY_128_BLOCK_SIZE; + skinny_aead_128_256_update_lfsr(lfsr); + } + skinny_aead_128_256_set_lfsr(ks, lfsr); + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + skinny_aead_128_256_set_domain(ks, prefix | 1); + memset(block, 0, SKINNY_128_BLOCK_SIZE); + skinny_128_256_encrypt(ks, block, block); + lw_xor_block_2_src(m, block, c, temp); + lw_xor_block(sum, m, temp); + sum[temp] ^= 0x80; + skinny_aead_128_256_update_lfsr(lfsr); + skinny_aead_128_256_set_lfsr(ks, lfsr); + skinny_aead_128_256_set_domain(ks, prefix | 5); + } else { + skinny_aead_128_256_set_domain(ks, prefix | 4); + } + skinny_128_256_encrypt(ks, sum, sum); +} + +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M5, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M5_TAG_SIZE); + return 0; +} + +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M5_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M5_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M5_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M5, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M5, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M5_TAG_SIZE); +} + +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Encrypt to plaintext to produce the ciphertext */ + skinny_aead_128_256_encrypt(&ks, DOMAIN_SEP_M6, sum, c, m, mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Generate the authentication tag */ + memcpy(c + mlen, sum, SKINNY_AEAD_M6_TAG_SIZE); + return 0; +} + +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + skinny_128_256_key_schedule_t ks; + unsigned char sum[SKINNY_128_BLOCK_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SKINNY_AEAD_M6_TAG_SIZE) + return -1; + *mlen = clen - SKINNY_AEAD_M6_TAG_SIZE; + + /* Set up the key schedule with the key and the nonce */ + skinny_aead_128_256_init(&ks, k, npub, SKINNY_AEAD_M6_NONCE_SIZE); + + /* Decrypt to ciphertext to produce the plaintext */ + skinny_aead_128_256_decrypt(&ks, DOMAIN_SEP_M6, sum, m, c, *mlen); + + /* Process the associated data */ + skinny_aead_128_256_authenticate(&ks, DOMAIN_SEP_M6, sum, ad, adlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, sum, c + *mlen, SKINNY_AEAD_M6_TAG_SIZE); +} diff --git a/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.h b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.h new file mode 100644 index 0000000..c6b54fb --- /dev/null +++ b/skinny/Implementations/crypto_aead/skinnyaeadtk39664v1/rhys-avr/skinny-aead.h @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_AEAD_H +#define LWCRYPTO_SKINNY_AEAD_H + +#include "aead-common.h" + +/** + * \file skinny-aead.h + * \brief Authenticated encryption based on the SKINNY block cipher. + * + * SKINNY-AEAD is a family of authenticated encryption algorithms + * that are built around the SKINNY tweakable block cipher. There + * are six members in the family: + * + * \li SKINNY-AEAD-M1 has a 128-bit key, a 128-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. This is the + * primary member of the family. + * \li SKINNY-AEAD-M2 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M3 has a 128-bit key, a 128-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M4 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-384 tweakable block cipher. + * \li SKINNY-AEAD-M5 has a 128-bit key, a 96-bit nonce, and a 128-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * \li SKINNY-AEAD-M6 has a 128-bit key, a 96-bit nonce, and a 64-bit tag, + * based around the SKINNY-128-256 tweakable block cipher. + * + * The SKINNY-AEAD family also includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SKINNY-AEAD family members. + */ +#define SKINNY_AEAD_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M1. + */ +#define SKINNY_AEAD_M1_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M2. + */ +#define SKINNY_AEAD_M2_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M3. + */ +#define SKINNY_AEAD_M3_NONCE_SIZE 16 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M4. + */ +#define SKINNY_AEAD_M4_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M5. + */ +#define SKINNY_AEAD_M5_NONCE_SIZE 12 + +/** + * \brief Size of the authentication tag for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_TAG_SIZE 8 + +/** + * \brief Size of the nonce for SKINNY-AEAD-M6. + */ +#define SKINNY_AEAD_M6_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the SKINNY-AEAD-M1 cipher. + */ +extern aead_cipher_t const skinny_aead_m1_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M2 cipher. + */ +extern aead_cipher_t const skinny_aead_m2_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M3 cipher. + */ +extern aead_cipher_t const skinny_aead_m3_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M4 cipher. + */ +extern aead_cipher_t const skinny_aead_m4_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M5 cipher. + */ +extern aead_cipher_t const skinny_aead_m5_cipher; + +/** + * \brief Meta-information block for the SKINNY-AEAD-M6 cipher. + */ +extern aead_cipher_t const skinny_aead_m6_cipher; + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m1_decrypt() + */ +int skinny_aead_m1_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M1. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m1_encrypt() + */ +int skinny_aead_m1_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m2_decrypt() + */ +int skinny_aead_m2_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M2. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m2_encrypt() + */ +int skinny_aead_m2_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m3_decrypt() + */ +int skinny_aead_m3_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M3. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m3_encrypt() + */ +int skinny_aead_m3_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m4_decrypt() + */ +int skinny_aead_m4_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M4. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m4_encrypt() + */ +int skinny_aead_m4_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m5_decrypt() + */ +int skinny_aead_m5_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M5. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m5_encrypt() + */ +int skinny_aead_m5_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa skinny_aead_m6_decrypt() + */ +int skinny_aead_m6_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SKINNY-AEAD-M6. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa skinny_aead_m6_encrypt() + */ +int skinny_aead_m6_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.c b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/api.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/hash.c b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/hash.c new file mode 100644 index 0000000..e0118e9 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "skinny-hash.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return skinny_tk2_hash(out, in, inlen); +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-util.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.c b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.c new file mode 100644 index 0000000..0abdeff --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-hash.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_hash_algorithm_t const skinny_tk3_hash_algorithm = { + "SKINNY-tk3-HASH", + sizeof(int), + SKINNY_HASH_SIZE, + AEAD_FLAG_NONE, + skinny_tk3_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const skinny_tk2_hash_algorithm = { + "SKINNY-tk2-HASH", + sizeof(int), + SKINNY_HASH_SIZE, + AEAD_FLAG_NONE, + skinny_tk2_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Size of the permutation state for SKINNY-tk3-HASH. + */ +#define SKINNY_TK3_STATE_SIZE 48 + +/** + * \brief Size of the permutation state for SKINNY-tk2-HASH. + */ +#define SKINNY_TK2_STATE_SIZE 32 + +/** + * \brief Rate of absorbing data for SKINNY-tk3-HASH. + */ +#define SKINNY_TK3_HASH_RATE 16 + +/** + * \brief Rate of absorbing data for SKINNY-tk2-HASH. + */ +#define SKINNY_TK2_HASH_RATE 4 + +/** + * \brief Input block that is encrypted with the state for each + * block permutation of SKINNY-tk3-HASH or SKINNY-tk2-HASH. + */ +static unsigned char const skinny_hash_block[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/** + * \brief Permutes the internal state for SKINNY-tk3-HASH. + * + * \param state The state to be permuted. + */ +static void skinny_tk3_permute(unsigned char state[SKINNY_TK3_STATE_SIZE]) +{ + unsigned char temp[SKINNY_TK3_STATE_SIZE]; + skinny_128_384_encrypt_tk_full(state, temp, skinny_hash_block); + skinny_128_384_encrypt_tk_full(state, temp + 16, skinny_hash_block + 16); + skinny_128_384_encrypt_tk_full(state, temp + 32, skinny_hash_block + 32); + memcpy(state, temp, SKINNY_TK3_STATE_SIZE); +} + +/** + * \brief Permutes the internal state for SKINNY-tk2-HASH. + * + * \param state The state to be permuted. + */ +static void skinny_tk2_permute(unsigned char state[SKINNY_TK2_STATE_SIZE]) +{ + unsigned char temp[SKINNY_TK2_STATE_SIZE]; + skinny_128_256_encrypt_tk_full(state, temp, skinny_hash_block); + skinny_128_256_encrypt_tk_full(state, temp + 16, skinny_hash_block + 16); + memcpy(state, temp, SKINNY_TK2_STATE_SIZE); +} + +int skinny_tk3_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[SKINNY_TK3_STATE_SIZE]; + unsigned temp; + + /* Initialize the hash state */ + memset(state, 0, sizeof(state)); + state[SKINNY_TK3_HASH_RATE] = 0x80; + + /* Process as many full blocks as possible */ + while (inlen >= SKINNY_TK3_HASH_RATE) { + lw_xor_block(state, in, SKINNY_TK3_HASH_RATE); + skinny_tk3_permute(state); + in += SKINNY_TK3_HASH_RATE; + inlen -= SKINNY_TK3_HASH_RATE; + } + + /* Pad and process the last block */ + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + skinny_tk3_permute(state); + + /* Generate the hash output */ + memcpy(out, state, 16); + skinny_tk3_permute(state); + memcpy(out + 16, state, 16); + return 0; +} + +int skinny_tk2_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[SKINNY_TK2_STATE_SIZE]; + unsigned temp; + + /* Initialize the hash state */ + memset(state, 0, sizeof(state)); + state[SKINNY_TK2_HASH_RATE] = 0x80; + + /* Process as many full blocks as possible */ + while (inlen >= SKINNY_TK2_HASH_RATE) { + lw_xor_block(state, in, SKINNY_TK2_HASH_RATE); + skinny_tk2_permute(state); + in += SKINNY_TK2_HASH_RATE; + inlen -= SKINNY_TK2_HASH_RATE; + } + + /* Pad and process the last block */ + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + skinny_tk2_permute(state); + + /* Generate the hash output */ + memcpy(out, state, 16); + skinny_tk2_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.h b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.h new file mode 100644 index 0000000..f75ce9f --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk2/rhys-avr/skinny-hash.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_HASH_H +#define LWCRYPTO_SKINNY_HASH_H + +#include "aead-common.h" + +/** + * \file skinny-hash.h + * \brief Hash algorithms based on the SKINNY block cipher. + * + * The SKINNY-AEAD family includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the hash output for SKINNY-tk3-HASH and SKINNY-tk2-HASH. + */ +#define SKINNY_HASH_SIZE 32 + +/** + * \brief Meta-information block for the SKINNY-tk3-HASH algorithm. + */ +extern aead_hash_algorithm_t const skinny_tk3_hash_algorithm; + +/** + * \brief Meta-information block for the SKINNY-tk2-HASH algorithm. + */ +extern aead_hash_algorithm_t const skinny_tk2_hash_algorithm; + +/** + * \brief Hashes a block of input data with SKINNY-tk3-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SKINNY_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int skinny_tk3_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with SKINNY-tk2-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SKINNY_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int skinny_tk2_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.c b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/api.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/hash.c b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/hash.c new file mode 100644 index 0000000..c51ca3f --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "skinny-hash.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return skinny_tk3_hash(out, in, inlen); +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128-avr.S b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128-avr.S new file mode 100644 index 0000000..d342cd5 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128-avr.S @@ -0,0 +1,10099 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 256 +table_0: + .byte 101 + .byte 76 + .byte 106 + .byte 66 + .byte 75 + .byte 99 + .byte 67 + .byte 107 + .byte 85 + .byte 117 + .byte 90 + .byte 122 + .byte 83 + .byte 115 + .byte 91 + .byte 123 + .byte 53 + .byte 140 + .byte 58 + .byte 129 + .byte 137 + .byte 51 + .byte 128 + .byte 59 + .byte 149 + .byte 37 + .byte 152 + .byte 42 + .byte 144 + .byte 35 + .byte 153 + .byte 43 + .byte 229 + .byte 204 + .byte 232 + .byte 193 + .byte 201 + .byte 224 + .byte 192 + .byte 233 + .byte 213 + .byte 245 + .byte 216 + .byte 248 + .byte 208 + .byte 240 + .byte 217 + .byte 249 + .byte 165 + .byte 28 + .byte 168 + .byte 18 + .byte 27 + .byte 160 + .byte 19 + .byte 169 + .byte 5 + .byte 181 + .byte 10 + .byte 184 + .byte 3 + .byte 176 + .byte 11 + .byte 185 + .byte 50 + .byte 136 + .byte 60 + .byte 133 + .byte 141 + .byte 52 + .byte 132 + .byte 61 + .byte 145 + .byte 34 + .byte 156 + .byte 44 + .byte 148 + .byte 36 + .byte 157 + .byte 45 + .byte 98 + .byte 74 + .byte 108 + .byte 69 + .byte 77 + .byte 100 + .byte 68 + .byte 109 + .byte 82 + .byte 114 + .byte 92 + .byte 124 + .byte 84 + .byte 116 + .byte 93 + .byte 125 + .byte 161 + .byte 26 + .byte 172 + .byte 21 + .byte 29 + .byte 164 + .byte 20 + .byte 173 + .byte 2 + .byte 177 + .byte 12 + .byte 188 + .byte 4 + .byte 180 + .byte 13 + .byte 189 + .byte 225 + .byte 200 + .byte 236 + .byte 197 + .byte 205 + .byte 228 + .byte 196 + .byte 237 + .byte 209 + .byte 241 + .byte 220 + .byte 252 + .byte 212 + .byte 244 + .byte 221 + .byte 253 + .byte 54 + .byte 142 + .byte 56 + .byte 130 + .byte 139 + .byte 48 + .byte 131 + .byte 57 + .byte 150 + .byte 38 + .byte 154 + .byte 40 + .byte 147 + .byte 32 + .byte 155 + .byte 41 + .byte 102 + .byte 78 + .byte 104 + .byte 65 + .byte 73 + .byte 96 + .byte 64 + .byte 105 + .byte 86 + .byte 118 + .byte 88 + .byte 120 + .byte 80 + .byte 112 + .byte 89 + .byte 121 + .byte 166 + .byte 30 + .byte 170 + .byte 17 + .byte 25 + .byte 163 + .byte 16 + .byte 171 + .byte 6 + .byte 182 + .byte 8 + .byte 186 + .byte 0 + .byte 179 + .byte 9 + .byte 187 + .byte 230 + .byte 206 + .byte 234 + .byte 194 + .byte 203 + .byte 227 + .byte 195 + .byte 235 + .byte 214 + .byte 246 + .byte 218 + .byte 250 + .byte 211 + .byte 243 + .byte 219 + .byte 251 + .byte 49 + .byte 138 + .byte 62 + .byte 134 + .byte 143 + .byte 55 + .byte 135 + .byte 63 + .byte 146 + .byte 33 + .byte 158 + .byte 46 + .byte 151 + .byte 39 + .byte 159 + .byte 47 + .byte 97 + .byte 72 + .byte 110 + .byte 70 + .byte 79 + .byte 103 + .byte 71 + .byte 111 + .byte 81 + .byte 113 + .byte 94 + .byte 126 + .byte 87 + .byte 119 + .byte 95 + .byte 127 + .byte 162 + .byte 24 + .byte 174 + .byte 22 + .byte 31 + .byte 167 + .byte 23 + .byte 175 + .byte 1 + .byte 178 + .byte 14 + .byte 190 + .byte 7 + .byte 183 + .byte 15 + .byte 191 + .byte 226 + .byte 202 + .byte 238 + .byte 198 + .byte 207 + .byte 231 + .byte 199 + .byte 239 + .byte 210 + .byte 242 + .byte 222 + .byte 254 + .byte 215 + .byte 247 + .byte 223 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 256 +table_1: + .byte 172 + .byte 232 + .byte 104 + .byte 60 + .byte 108 + .byte 56 + .byte 168 + .byte 236 + .byte 170 + .byte 174 + .byte 58 + .byte 62 + .byte 106 + .byte 110 + .byte 234 + .byte 238 + .byte 166 + .byte 163 + .byte 51 + .byte 54 + .byte 102 + .byte 99 + .byte 227 + .byte 230 + .byte 225 + .byte 164 + .byte 97 + .byte 52 + .byte 49 + .byte 100 + .byte 161 + .byte 228 + .byte 141 + .byte 201 + .byte 73 + .byte 29 + .byte 77 + .byte 25 + .byte 137 + .byte 205 + .byte 139 + .byte 143 + .byte 27 + .byte 31 + .byte 75 + .byte 79 + .byte 203 + .byte 207 + .byte 133 + .byte 192 + .byte 64 + .byte 21 + .byte 69 + .byte 16 + .byte 128 + .byte 197 + .byte 130 + .byte 135 + .byte 18 + .byte 23 + .byte 66 + .byte 71 + .byte 194 + .byte 199 + .byte 150 + .byte 147 + .byte 3 + .byte 6 + .byte 86 + .byte 83 + .byte 211 + .byte 214 + .byte 209 + .byte 148 + .byte 81 + .byte 4 + .byte 1 + .byte 84 + .byte 145 + .byte 212 + .byte 156 + .byte 216 + .byte 88 + .byte 12 + .byte 92 + .byte 8 + .byte 152 + .byte 220 + .byte 154 + .byte 158 + .byte 10 + .byte 14 + .byte 90 + .byte 94 + .byte 218 + .byte 222 + .byte 149 + .byte 208 + .byte 80 + .byte 5 + .byte 85 + .byte 0 + .byte 144 + .byte 213 + .byte 146 + .byte 151 + .byte 2 + .byte 7 + .byte 82 + .byte 87 + .byte 210 + .byte 215 + .byte 157 + .byte 217 + .byte 89 + .byte 13 + .byte 93 + .byte 9 + .byte 153 + .byte 221 + .byte 155 + .byte 159 + .byte 11 + .byte 15 + .byte 91 + .byte 95 + .byte 219 + .byte 223 + .byte 22 + .byte 19 + .byte 131 + .byte 134 + .byte 70 + .byte 67 + .byte 195 + .byte 198 + .byte 65 + .byte 20 + .byte 193 + .byte 132 + .byte 17 + .byte 68 + .byte 129 + .byte 196 + .byte 28 + .byte 72 + .byte 200 + .byte 140 + .byte 76 + .byte 24 + .byte 136 + .byte 204 + .byte 26 + .byte 30 + .byte 138 + .byte 142 + .byte 74 + .byte 78 + .byte 202 + .byte 206 + .byte 53 + .byte 96 + .byte 224 + .byte 165 + .byte 101 + .byte 48 + .byte 160 + .byte 229 + .byte 50 + .byte 55 + .byte 162 + .byte 167 + .byte 98 + .byte 103 + .byte 226 + .byte 231 + .byte 61 + .byte 105 + .byte 233 + .byte 173 + .byte 109 + .byte 57 + .byte 169 + .byte 237 + .byte 59 + .byte 63 + .byte 171 + .byte 175 + .byte 107 + .byte 111 + .byte 235 + .byte 239 + .byte 38 + .byte 35 + .byte 179 + .byte 182 + .byte 118 + .byte 115 + .byte 243 + .byte 246 + .byte 113 + .byte 36 + .byte 241 + .byte 180 + .byte 33 + .byte 116 + .byte 177 + .byte 244 + .byte 44 + .byte 120 + .byte 248 + .byte 188 + .byte 124 + .byte 40 + .byte 184 + .byte 252 + .byte 42 + .byte 46 + .byte 186 + .byte 190 + .byte 122 + .byte 126 + .byte 250 + .byte 254 + .byte 37 + .byte 112 + .byte 240 + .byte 181 + .byte 117 + .byte 32 + .byte 176 + .byte 245 + .byte 34 + .byte 39 + .byte 178 + .byte 183 + .byte 114 + .byte 119 + .byte 242 + .byte 247 + .byte 45 + .byte 121 + .byte 249 + .byte 189 + .byte 125 + .byte 41 + .byte 185 + .byte 253 + .byte 43 + .byte 47 + .byte 187 + .byte 191 + .byte 123 + .byte 127 + .byte 251 + .byte 255 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_2, @object + .size table_2, 256 +table_2: + .byte 0 + .byte 2 + .byte 4 + .byte 6 + .byte 8 + .byte 10 + .byte 12 + .byte 14 + .byte 16 + .byte 18 + .byte 20 + .byte 22 + .byte 24 + .byte 26 + .byte 28 + .byte 30 + .byte 32 + .byte 34 + .byte 36 + .byte 38 + .byte 40 + .byte 42 + .byte 44 + .byte 46 + .byte 48 + .byte 50 + .byte 52 + .byte 54 + .byte 56 + .byte 58 + .byte 60 + .byte 62 + .byte 65 + .byte 67 + .byte 69 + .byte 71 + .byte 73 + .byte 75 + .byte 77 + .byte 79 + .byte 81 + .byte 83 + .byte 85 + .byte 87 + .byte 89 + .byte 91 + .byte 93 + .byte 95 + .byte 97 + .byte 99 + .byte 101 + .byte 103 + .byte 105 + .byte 107 + .byte 109 + .byte 111 + .byte 113 + .byte 115 + .byte 117 + .byte 119 + .byte 121 + .byte 123 + .byte 125 + .byte 127 + .byte 128 + .byte 130 + .byte 132 + .byte 134 + .byte 136 + .byte 138 + .byte 140 + .byte 142 + .byte 144 + .byte 146 + .byte 148 + .byte 150 + .byte 152 + .byte 154 + .byte 156 + .byte 158 + .byte 160 + .byte 162 + .byte 164 + .byte 166 + .byte 168 + .byte 170 + .byte 172 + .byte 174 + .byte 176 + .byte 178 + .byte 180 + .byte 182 + .byte 184 + .byte 186 + .byte 188 + .byte 190 + .byte 193 + .byte 195 + .byte 197 + .byte 199 + .byte 201 + .byte 203 + .byte 205 + .byte 207 + .byte 209 + .byte 211 + .byte 213 + .byte 215 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 225 + .byte 227 + .byte 229 + .byte 231 + .byte 233 + .byte 235 + .byte 237 + .byte 239 + .byte 241 + .byte 243 + .byte 245 + .byte 247 + .byte 249 + .byte 251 + .byte 253 + .byte 255 + .byte 1 + .byte 3 + .byte 5 + .byte 7 + .byte 9 + .byte 11 + .byte 13 + .byte 15 + .byte 17 + .byte 19 + .byte 21 + .byte 23 + .byte 25 + .byte 27 + .byte 29 + .byte 31 + .byte 33 + .byte 35 + .byte 37 + .byte 39 + .byte 41 + .byte 43 + .byte 45 + .byte 47 + .byte 49 + .byte 51 + .byte 53 + .byte 55 + .byte 57 + .byte 59 + .byte 61 + .byte 63 + .byte 64 + .byte 66 + .byte 68 + .byte 70 + .byte 72 + .byte 74 + .byte 76 + .byte 78 + .byte 80 + .byte 82 + .byte 84 + .byte 86 + .byte 88 + .byte 90 + .byte 92 + .byte 94 + .byte 96 + .byte 98 + .byte 100 + .byte 102 + .byte 104 + .byte 106 + .byte 108 + .byte 110 + .byte 112 + .byte 114 + .byte 116 + .byte 118 + .byte 120 + .byte 122 + .byte 124 + .byte 126 + .byte 129 + .byte 131 + .byte 133 + .byte 135 + .byte 137 + .byte 139 + .byte 141 + .byte 143 + .byte 145 + .byte 147 + .byte 149 + .byte 151 + .byte 153 + .byte 155 + .byte 157 + .byte 159 + .byte 161 + .byte 163 + .byte 165 + .byte 167 + .byte 169 + .byte 171 + .byte 173 + .byte 175 + .byte 177 + .byte 179 + .byte 181 + .byte 183 + .byte 185 + .byte 187 + .byte 189 + .byte 191 + .byte 192 + .byte 194 + .byte 196 + .byte 198 + .byte 200 + .byte 202 + .byte 204 + .byte 206 + .byte 208 + .byte 210 + .byte 212 + .byte 214 + .byte 216 + .byte 218 + .byte 220 + .byte 222 + .byte 224 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 234 + .byte 236 + .byte 238 + .byte 240 + .byte 242 + .byte 244 + .byte 246 + .byte 248 + .byte 250 + .byte 252 + .byte 254 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_3, @object + .size table_3, 256 +table_3: + .byte 0 + .byte 128 + .byte 1 + .byte 129 + .byte 2 + .byte 130 + .byte 3 + .byte 131 + .byte 4 + .byte 132 + .byte 5 + .byte 133 + .byte 6 + .byte 134 + .byte 7 + .byte 135 + .byte 8 + .byte 136 + .byte 9 + .byte 137 + .byte 10 + .byte 138 + .byte 11 + .byte 139 + .byte 12 + .byte 140 + .byte 13 + .byte 141 + .byte 14 + .byte 142 + .byte 15 + .byte 143 + .byte 16 + .byte 144 + .byte 17 + .byte 145 + .byte 18 + .byte 146 + .byte 19 + .byte 147 + .byte 20 + .byte 148 + .byte 21 + .byte 149 + .byte 22 + .byte 150 + .byte 23 + .byte 151 + .byte 24 + .byte 152 + .byte 25 + .byte 153 + .byte 26 + .byte 154 + .byte 27 + .byte 155 + .byte 28 + .byte 156 + .byte 29 + .byte 157 + .byte 30 + .byte 158 + .byte 31 + .byte 159 + .byte 160 + .byte 32 + .byte 161 + .byte 33 + .byte 162 + .byte 34 + .byte 163 + .byte 35 + .byte 164 + .byte 36 + .byte 165 + .byte 37 + .byte 166 + .byte 38 + .byte 167 + .byte 39 + .byte 168 + .byte 40 + .byte 169 + .byte 41 + .byte 170 + .byte 42 + .byte 171 + .byte 43 + .byte 172 + .byte 44 + .byte 173 + .byte 45 + .byte 174 + .byte 46 + .byte 175 + .byte 47 + .byte 176 + .byte 48 + .byte 177 + .byte 49 + .byte 178 + .byte 50 + .byte 179 + .byte 51 + .byte 180 + .byte 52 + .byte 181 + .byte 53 + .byte 182 + .byte 54 + .byte 183 + .byte 55 + .byte 184 + .byte 56 + .byte 185 + .byte 57 + .byte 186 + .byte 58 + .byte 187 + .byte 59 + .byte 188 + .byte 60 + .byte 189 + .byte 61 + .byte 190 + .byte 62 + .byte 191 + .byte 63 + .byte 64 + .byte 192 + .byte 65 + .byte 193 + .byte 66 + .byte 194 + .byte 67 + .byte 195 + .byte 68 + .byte 196 + .byte 69 + .byte 197 + .byte 70 + .byte 198 + .byte 71 + .byte 199 + .byte 72 + .byte 200 + .byte 73 + .byte 201 + .byte 74 + .byte 202 + .byte 75 + .byte 203 + .byte 76 + .byte 204 + .byte 77 + .byte 205 + .byte 78 + .byte 206 + .byte 79 + .byte 207 + .byte 80 + .byte 208 + .byte 81 + .byte 209 + .byte 82 + .byte 210 + .byte 83 + .byte 211 + .byte 84 + .byte 212 + .byte 85 + .byte 213 + .byte 86 + .byte 214 + .byte 87 + .byte 215 + .byte 88 + .byte 216 + .byte 89 + .byte 217 + .byte 90 + .byte 218 + .byte 91 + .byte 219 + .byte 92 + .byte 220 + .byte 93 + .byte 221 + .byte 94 + .byte 222 + .byte 95 + .byte 223 + .byte 224 + .byte 96 + .byte 225 + .byte 97 + .byte 226 + .byte 98 + .byte 227 + .byte 99 + .byte 228 + .byte 100 + .byte 229 + .byte 101 + .byte 230 + .byte 102 + .byte 231 + .byte 103 + .byte 232 + .byte 104 + .byte 233 + .byte 105 + .byte 234 + .byte 106 + .byte 235 + .byte 107 + .byte 236 + .byte 108 + .byte 237 + .byte 109 + .byte 238 + .byte 110 + .byte 239 + .byte 111 + .byte 240 + .byte 112 + .byte 241 + .byte 113 + .byte 242 + .byte 114 + .byte 243 + .byte 115 + .byte 244 + .byte 116 + .byte 245 + .byte 117 + .byte 246 + .byte 118 + .byte 247 + .byte 119 + .byte 248 + .byte 120 + .byte 249 + .byte 121 + .byte 250 + .byte 122 + .byte 251 + .byte 123 + .byte 252 + .byte 124 + .byte 253 + .byte 125 + .byte 254 + .byte 126 + .byte 255 + .byte 127 + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_4, @object + .size table_4, 112 +table_4: + .byte 1 + .byte 0 + .byte 3 + .byte 0 + .byte 7 + .byte 0 + .byte 15 + .byte 0 + .byte 15 + .byte 1 + .byte 14 + .byte 3 + .byte 13 + .byte 3 + .byte 11 + .byte 3 + .byte 7 + .byte 3 + .byte 15 + .byte 2 + .byte 14 + .byte 1 + .byte 12 + .byte 3 + .byte 9 + .byte 3 + .byte 3 + .byte 3 + .byte 7 + .byte 2 + .byte 14 + .byte 0 + .byte 13 + .byte 1 + .byte 10 + .byte 3 + .byte 5 + .byte 3 + .byte 11 + .byte 2 + .byte 6 + .byte 1 + .byte 12 + .byte 2 + .byte 8 + .byte 1 + .byte 0 + .byte 3 + .byte 1 + .byte 2 + .byte 2 + .byte 0 + .byte 5 + .byte 0 + .byte 11 + .byte 0 + .byte 7 + .byte 1 + .byte 14 + .byte 2 + .byte 12 + .byte 1 + .byte 8 + .byte 3 + .byte 1 + .byte 3 + .byte 3 + .byte 2 + .byte 6 + .byte 0 + .byte 13 + .byte 0 + .byte 11 + .byte 1 + .byte 6 + .byte 3 + .byte 13 + .byte 2 + .byte 10 + .byte 1 + .byte 4 + .byte 3 + .byte 9 + .byte 2 + .byte 2 + .byte 1 + .byte 4 + .byte 2 + .byte 8 + .byte 0 + .byte 1 + .byte 1 + .byte 2 + .byte 2 + .byte 4 + .byte 0 + .byte 9 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 2 + .byte 12 + .byte 0 + .byte 9 + .byte 1 + .byte 2 + .byte 3 + .byte 5 + .byte 2 + .byte 10 + .byte 0 + + .text +.global skinny_128_384_init + .type skinny_128_384_init, @function +skinny_128_384_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,12 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_384_init, .-skinny_128_384_init + + .text +.global skinny_128_384_encrypt + .type skinny_128_384_encrypt, @function +skinny_128_384_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + std Y+33,r18 + std Y+34,r19 + std Y+35,r20 + std Y+36,r21 + ldd r18,Z+36 + ldd r19,Z+37 + ldd r20,Z+38 + ldd r21,Z+39 + std Y+37,r18 + std Y+38,r19 + std Y+39,r20 + std Y+40,r21 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + std Y+41,r18 + std Y+42,r19 + std Y+43,r20 + std Y+44,r21 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + std Y+45,r18 + std Y+46,r19 + std Y+47,r20 + std Y+48,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +114: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r13 + std Y+42,r17 + std Y+43,r12 + std Y+44,r25 + std Y+45,r14 + std Y+46,r16 + std Y+47,r24 + std Y+48,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,112 + brne 5721f + rjmp 790f +5721: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r13 + std Y+34,r17 + std Y+35,r12 + std Y+36,r25 + std Y+37,r14 + std Y+38,r16 + std Y+39,r24 + std Y+40,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 114b +790: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_encrypt, .-skinny_128_384_encrypt + +.global skinny_128_384_encrypt_tk_full + .set skinny_128_384_encrypt_tk_full,skinny_128_384_encrypt + + .text +.global skinny_128_384_decrypt + .type skinny_128_384_decrypt, @function +skinny_128_384_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,48 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 68 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r23 + std Y+2,r2 + std Y+3,r21 + std Y+4,r20 + std Y+5,r3 + std Y+6,r18 + std Y+7,r19 + std Y+8,r22 + std Y+9,r9 + std Y+10,r10 + std Y+11,r7 + std Y+12,r6 + std Y+13,r11 + std Y+14,r4 + std Y+15,r5 + std Y+16,r8 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r23 + std Y+18,r2 + std Y+19,r21 + std Y+20,r20 + std Y+21,r3 + std Y+22,r18 + std Y+23,r19 + std Y+24,r22 + std Y+25,r9 + std Y+26,r10 + std Y+27,r7 + std Y+28,r6 + std Y+29,r11 + std Y+30,r4 + std Y+31,r5 + std Y+32,r8 + ldd r18,Z+32 + ldd r19,Z+33 + ldd r20,Z+34 + ldd r21,Z+35 + ldd r22,Z+36 + ldd r23,Z+37 + ldd r2,Z+38 + ldd r3,Z+39 + ldd r4,Z+40 + ldd r5,Z+41 + ldd r6,Z+42 + ldd r7,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + std Y+33,r23 + std Y+34,r2 + std Y+35,r21 + std Y+36,r20 + std Y+37,r3 + std Y+38,r18 + std Y+39,r19 + std Y+40,r22 + std Y+41,r9 + std Y+42,r10 + std Y+43,r7 + std Y+44,r6 + std Y+45,r11 + std Y+46,r4 + std Y+47,r5 + std Y+48,r8 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +122: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 122b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,28 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +150: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 150b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,28 + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 +179: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 179b + std Y+33,r12 + std Y+34,r13 + std Y+35,r14 + std Y+36,r15 + std Y+37,r24 + std Y+38,r25 + std Y+39,r16 + std Y+40,r17 + ldi r26,28 + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 +207: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 207b + std Y+41,r12 + std Y+42,r13 + std Y+43,r14 + std Y+44,r15 + std Y+45,r24 + std Y+46,r25 + std Y+47,r16 + std Y+48,r17 + ldi r26,112 +227: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+41 + eor r22,r0 + ldd r0,Y+42 + eor r23,r0 + ldd r0,Y+43 + eor r2,r0 + ldd r0,Y+44 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldd r0,Y+45 + eor r4,r0 + ldd r0,Y+46 + eor r5,r0 + ldd r0,Y+47 + eor r6,r0 + ldd r0,Y+48 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+33 + eor r4,r0 + ldd r0,Y+34 + eor r5,r0 + ldd r0,Y+35 + eor r6,r0 + ldd r0,Y+36 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldd r0,Y+37 + eor r8,r0 + ldd r0,Y+38 + eor r9,r0 + ldd r0,Y+39 + eor r10,r0 + ldd r0,Y+40 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+33 + ldd r13,Y+34 + ldd r14,Y+35 + ldd r15,Y+36 + ldd r24,Y+37 + ldd r25,Y+38 + ldd r16,Y+39 + ldd r17,Y+40 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+33,r14 + std Y+34,r12 + std Y+35,r24 + std Y+36,r17 + std Y+37,r16 + std Y+38,r15 + std Y+39,r25 + std Y+40,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+41 + eor r8,r0 + ldd r0,Y+42 + eor r9,r0 + ldd r0,Y+43 + eor r10,r0 + ldd r0,Y+44 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldd r0,Y+45 + eor r18,r0 + ldd r0,Y+46 + eor r19,r0 + ldd r0,Y+47 + eor r20,r0 + ldd r0,Y+48 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+41 + ldd r13,Y+42 + ldd r14,Y+43 + ldd r15,Y+44 + ldd r24,Y+45 + ldd r25,Y+46 + ldd r16,Y+47 + ldd r17,Y+48 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+41,r14 + std Y+42,r12 + std Y+43,r24 + std Y+44,r17 + std Y+45,r16 + std Y+46,r15 + std Y+47,r25 + std Y+48,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+33 + eor r18,r0 + ldd r0,Y+34 + eor r19,r0 + ldd r0,Y+35 + eor r20,r0 + ldd r0,Y+36 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldd r0,Y+37 + eor r22,r0 + ldd r0,Y+38 + eor r23,r0 + ldd r0,Y+39 + eor r2,r0 + ldd r0,Y+40 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 903f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 227b +903: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+49 + ldd r27,Y+50 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,50 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_384_decrypt, .-skinny_128_384_decrypt + + .text +.global skinny_128_256_init + .type skinny_128_256_init, @function +skinny_128_256_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ldi r22,8 +1: + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + st Z+,r18 + st Z+,r19 + st Z+,r20 + st Z+,r21 + dec r22 + brne 1b + ret + .size skinny_128_256_init, .-skinny_128_256_init + + .text +.global skinny_128_256_encrypt + .type skinny_128_256_encrypt, @function +skinny_128_256_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Y+5,r18 + std Y+6,r19 + std Y+7,r20 + std Y+8,r21 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + std Y+9,r18 + std Y+10,r19 + std Y+11,r20 + std Y+12,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + std Y+13,r18 + std Y+14,r19 + std Y+15,r20 + std Y+16,r21 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + ldd r18,Z+20 + ldd r19,Z+21 + ldd r20,Z+22 + ldd r21,Z+23 + std Y+21,r18 + std Y+22,r19 + std Y+23,r20 + std Y+24,r21 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + std Y+25,r18 + std Y+26,r19 + std Y+27,r20 + std Y+28,r21 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + std Y+29,r18 + std Y+30,r19 + std Y+31,r20 + std Y+32,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r26,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + mov r26,r1 +82: + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + ldi r27,2 + eor r4,r27 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + inc r26 + ldi r27,2 + eor r22,r27 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + mov r0,r2 + mov r2,r22 + mov r22,r0 + mov r0,r3 + mov r3,r23 + mov r23,r0 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + inc r26 + ldi r27,2 + eor r18,r27 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r20 + mov r20,r18 + mov r18,r0 + mov r0,r21 + mov r21,r19 + mov r19,r0 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r13 + std Y+10,r17 + std Y+11,r12 + std Y+12,r25 + std Y+13,r14 + std Y+14,r16 + std Y+15,r24 + std Y+16,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r13 + std Y+26,r17 + std Y+27,r12 + std Y+28,r25 + std Y+29,r14 + std Y+30,r16 + std Y+31,r24 + std Y+32,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + inc r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + inc r26 + ldi r27,2 + eor r8,r27 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + cpi r26,96 + breq 594f + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r13 + std Y+2,r17 + std Y+3,r12 + std Y+4,r25 + std Y+5,r14 + std Y+6,r16 + std Y+7,r24 + std Y+8,r15 + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r27,hh8(table_2) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r13 + std Y+18,r17 + std Y+19,r12 + std Y+20,r25 + std Y+21,r14 + std Y+22,r16 + std Y+23,r24 + std Y+24,r15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r27,hh8(table_0) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 82b +594: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_encrypt, .-skinny_128_256_encrypt + +.global skinny_128_256_encrypt_tk_full + .set skinny_128_256_encrypt_tk_full,skinny_128_256_encrypt + + .text +.global skinny_128_256_decrypt + .type skinny_128_256_decrypt, @function +skinny_128_256_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,32 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 52 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + ldd r4,Z+8 + ldd r5,Z+9 + ldd r6,Z+10 + ldd r7,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r18,Z+16 + ldd r19,Z+17 + ldd r20,Z+18 + ldd r21,Z+19 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + ldd r4,Z+24 + ldd r5,Z+25 + ldd r6,Z+26 + ldd r7,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Y+17,r18 + std Y+18,r19 + std Y+19,r20 + std Y+20,r21 + std Y+21,r22 + std Y+22,r23 + std Y+23,r2 + std Y+24,r3 + std Y+25,r4 + std Y+26,r5 + std Y+27,r6 + std Y+28,r7 + std Y+29,r8 + std Y+30,r9 + std Y+31,r10 + std Y+32,r11 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ldi r30,lo8(table_2) + ldi r31,hi8(table_2) +#if defined(RAMPZ) + ldi r26,hh8(table_2) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,24 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 +90: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 90b + std Y+17,r12 + std Y+18,r13 + std Y+19,r14 + std Y+20,r15 + std Y+21,r24 + std Y+22,r25 + std Y+23,r16 + std Y+24,r17 + ldi r26,24 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 +118: + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + dec r26 + brne 118b + std Y+25,r12 + std Y+26,r13 + std Y+27,r14 + std Y+28,r15 + std Y+29,r24 + std Y+30,r25 + std Y+31,r16 + std Y+32,r17 + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r26,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r26 +#endif + ldi r26,96 +139: + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + eor r8,r22 + eor r9,r23 + eor r10,r2 + eor r11,r3 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + mov r0,r4 + mov r4,r5 + mov r5,r6 + mov r6,r7 + mov r7,r0 + mov r0,r8 + mov r8,r10 + mov r10,r0 + mov r0,r9 + mov r9,r11 + mov r11,r0 + mov r0,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + ldd r0,Y+9 + eor r22,r0 + ldd r0,Y+10 + eor r23,r0 + ldd r0,Y+11 + eor r2,r0 + ldd r0,Y+12 + eor r3,r0 + ldd r0,Y+25 + eor r22,r0 + ldd r0,Y+26 + eor r23,r0 + ldd r0,Y+27 + eor r2,r0 + ldd r0,Y+28 + eor r3,r0 + ldd r0,Y+13 + eor r4,r0 + ldd r0,Y+14 + eor r5,r0 + ldd r0,Y+15 + eor r6,r0 + ldd r0,Y+16 + eor r7,r0 + ldd r0,Y+29 + eor r4,r0 + ldd r0,Y+30 + eor r5,r0 + ldd r0,Y+31 + eor r6,r0 + ldd r0,Y+32 + eor r7,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + ldi r27,2 + eor r8,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r18 + mov r18,r20 + mov r20,r0 + mov r0,r19 + mov r19,r21 + mov r21,r0 + mov r0,r3 + mov r3,r2 + mov r2,r23 + mov r23,r22 + mov r22,r0 + ldd r0,Y+1 + eor r4,r0 + ldd r0,Y+2 + eor r5,r0 + ldd r0,Y+3 + eor r6,r0 + ldd r0,Y+4 + eor r7,r0 + ldd r0,Y+17 + eor r4,r0 + ldd r0,Y+18 + eor r5,r0 + ldd r0,Y+19 + eor r6,r0 + ldd r0,Y+20 + eor r7,r0 + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + ldd r0,Y+21 + eor r8,r0 + ldd r0,Y+22 + eor r9,r0 + ldd r0,Y+23 + eor r10,r0 + ldd r0,Y+24 + eor r11,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r4,r27 + ldi r27,2 + eor r18,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + ldd r24,Y+5 + ldd r25,Y+6 + ldd r16,Y+7 + ldd r17,Y+8 + std Y+1,r14 + std Y+2,r12 + std Y+3,r24 + std Y+4,r17 + std Y+5,r16 + std Y+6,r15 + std Y+7,r25 + std Y+8,r13 + ldd r12,Y+17 + ldd r13,Y+18 + ldd r14,Y+19 + ldd r15,Y+20 + ldd r24,Y+21 + ldd r25,Y+22 + ldd r16,Y+23 + ldd r17,Y+24 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+17,r14 + std Y+18,r12 + std Y+19,r24 + std Y+20,r17 + std Y+21,r16 + std Y+22,r15 + std Y+23,r25 + std Y+24,r13 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + mov r0,r18 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r7 + mov r7,r6 + mov r6,r5 + mov r5,r4 + mov r4,r0 + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + ldd r0,Y+25 + eor r8,r0 + ldd r0,Y+26 + eor r9,r0 + ldd r0,Y+27 + eor r10,r0 + ldd r0,Y+28 + eor r11,r0 + ldd r0,Y+13 + eor r18,r0 + ldd r0,Y+14 + eor r19,r0 + ldd r0,Y+15 + eor r20,r0 + ldd r0,Y+16 + eor r21,r0 + ldd r0,Y+29 + eor r18,r0 + ldd r0,Y+30 + eor r19,r0 + ldd r0,Y+31 + eor r20,r0 + ldd r0,Y+32 + eor r21,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r8,r27 + ldi r27,2 + eor r22,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + ldd r12,Y+9 + ldd r13,Y+10 + ldd r14,Y+11 + ldd r15,Y+12 + ldd r24,Y+13 + ldd r25,Y+14 + ldd r16,Y+15 + ldd r17,Y+16 + std Y+9,r14 + std Y+10,r12 + std Y+11,r24 + std Y+12,r17 + std Y+13,r16 + std Y+14,r15 + std Y+15,r25 + std Y+16,r13 + ldd r12,Y+25 + ldd r13,Y+26 + ldd r14,Y+27 + ldd r15,Y+28 + ldd r24,Y+29 + ldd r25,Y+30 + ldd r16,Y+31 + ldd r17,Y+32 + mov r30,r12 +#if defined(RAMPZ) + elpm r12,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r12,Z +#elif defined(__AVR_TINY__) + ld r12,Z +#else + lpm + mov r12,r0 +#endif + mov r30,r13 +#if defined(RAMPZ) + elpm r13,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r13,Z +#elif defined(__AVR_TINY__) + ld r13,Z +#else + lpm + mov r13,r0 +#endif + mov r30,r14 +#if defined(RAMPZ) + elpm r14,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r14,Z +#elif defined(__AVR_TINY__) + ld r14,Z +#else + lpm + mov r14,r0 +#endif + mov r30,r15 +#if defined(RAMPZ) + elpm r15,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r15,Z +#elif defined(__AVR_TINY__) + ld r15,Z +#else + lpm + mov r15,r0 +#endif + mov r30,r24 +#if defined(RAMPZ) + elpm r24,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r24,Z +#elif defined(__AVR_TINY__) + ld r24,Z +#else + lpm + mov r24,r0 +#endif + mov r30,r25 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + mov r30,r16 +#if defined(RAMPZ) + elpm r16,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r16,Z +#elif defined(__AVR_TINY__) + ld r16,Z +#else + lpm + mov r16,r0 +#endif + mov r30,r17 +#if defined(RAMPZ) + elpm r17,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r17,Z +#elif defined(__AVR_TINY__) + ld r17,Z +#else + lpm + mov r17,r0 +#endif + std Y+25,r14 + std Y+26,r12 + std Y+27,r24 + std Y+28,r17 + std Y+29,r16 + std Y+30,r15 + std Y+31,r25 + std Y+32,r13 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + eor r22,r4 + eor r23,r5 + eor r2,r6 + eor r3,r7 + mov r0,r22 + mov r22,r23 + mov r23,r2 + mov r2,r3 + mov r3,r0 + mov r0,r4 + mov r4,r6 + mov r6,r0 + mov r0,r5 + mov r5,r7 + mov r7,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + ldd r0,Y+1 + eor r18,r0 + ldd r0,Y+2 + eor r19,r0 + ldd r0,Y+3 + eor r20,r0 + ldd r0,Y+4 + eor r21,r0 + ldd r0,Y+17 + eor r18,r0 + ldd r0,Y+18 + eor r19,r0 + ldd r0,Y+19 + eor r20,r0 + ldd r0,Y+20 + eor r21,r0 + ldd r0,Y+5 + eor r22,r0 + ldd r0,Y+6 + eor r23,r0 + ldd r0,Y+7 + eor r2,r0 + ldd r0,Y+8 + eor r3,r0 + ldd r0,Y+21 + eor r22,r0 + ldd r0,Y+22 + eor r23,r0 + ldd r0,Y+23 + eor r2,r0 + ldd r0,Y+24 + eor r3,r0 + ldi r30,lo8(table_4) + ldi r31,hi8(table_4) +#if defined(RAMPZ) + ldi r24,hh8(table_4) + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r22,r27 + dec r26 + mov r30,r26 +#if defined(RAMPZ) + elpm r27,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r27,Z +#elif defined(__AVR_TINY__) + ld r27,Z +#else + lpm + mov r27,r0 +#endif + eor r18,r27 + ldi r27,2 + eor r4,r27 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r27,hh8(table_1) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + mov r30,r18 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + mov r30,r19 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + mov r30,r20 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + mov r30,r21 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + mov r30,r22 +#if defined(RAMPZ) + elpm r22,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r22,Z +#elif defined(__AVR_TINY__) + ld r22,Z +#else + lpm + mov r22,r0 +#endif + mov r30,r23 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + mov r30,r2 +#if defined(RAMPZ) + elpm r2,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r2,Z +#elif defined(__AVR_TINY__) + ld r2,Z +#else + lpm + mov r2,r0 +#endif + mov r30,r3 +#if defined(RAMPZ) + elpm r3,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r3,Z +#elif defined(__AVR_TINY__) + ld r3,Z +#else + lpm + mov r3,r0 +#endif + mov r30,r4 +#if defined(RAMPZ) + elpm r4,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r4,Z +#elif defined(__AVR_TINY__) + ld r4,Z +#else + lpm + mov r4,r0 +#endif + mov r30,r5 +#if defined(RAMPZ) + elpm r5,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r5,Z +#elif defined(__AVR_TINY__) + ld r5,Z +#else + lpm + mov r5,r0 +#endif + mov r30,r6 +#if defined(RAMPZ) + elpm r6,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r6,Z +#elif defined(__AVR_TINY__) + ld r6,Z +#else + lpm + mov r6,r0 +#endif + mov r30,r7 +#if defined(RAMPZ) + elpm r7,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r7,Z +#elif defined(__AVR_TINY__) + ld r7,Z +#else + lpm + mov r7,r0 +#endif + mov r30,r8 +#if defined(RAMPZ) + elpm r8,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r8,Z +#elif defined(__AVR_TINY__) + ld r8,Z +#else + lpm + mov r8,r0 +#endif + mov r30,r9 +#if defined(RAMPZ) + elpm r9,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r9,Z +#elif defined(__AVR_TINY__) + ld r9,Z +#else + lpm + mov r9,r0 +#endif + mov r30,r10 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + mov r30,r11 +#if defined(RAMPZ) + elpm r11,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r11,Z +#elif defined(__AVR_TINY__) + ld r11,Z +#else + lpm + mov r11,r0 +#endif + cp r26,r1 + breq 651f + ldi r30,lo8(table_3) + ldi r31,hi8(table_3) +#if defined(RAMPZ) + ldi r27,hh8(table_3) + out _SFR_IO_ADDR(RAMPZ),r27 +#endif + rjmp 139b +651: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+33 + ldd r27,Y+34 + st X+,r18 + st X+,r19 + st X+,r20 + st X+,r21 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + adiw r28,34 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size skinny_128_256_decrypt, .-skinny_128_256_decrypt + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.c b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.c new file mode 100644 index 0000000..579ced1 --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.c @@ -0,0 +1,801 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-skinny128.h" +#include "internal-skinnyutil.h" +#include "internal-util.h" +#include + +#if !defined(__AVR__) + +STATIC_INLINE void skinny128_fast_forward_tk(uint32_t *tk) +{ + /* This function is used to fast-forward the TK1 tweak value + * to the value at the end of the key schedule for decryption. + * + * The tweak permutation repeats every 16 rounds, so SKINNY-128-256 + * with 48 rounds does not need any fast forwarding applied. + * SKINNY-128-128 with 40 rounds and SKINNY-128-384 with 56 rounds + * are equivalent to applying the permutation 8 times: + * + * PT*8 = [5, 6, 3, 2, 7, 0, 1, 4, 13, 14, 11, 10, 15, 8, 9, 12] + */ + uint32_t row0 = tk[0]; + uint32_t row1 = tk[1]; + uint32_t row2 = tk[2]; + uint32_t row3 = tk[3]; + tk[0] = ((row1 >> 8) & 0x0000FFFFU) | + ((row0 >> 8) & 0x00FF0000U) | + ((row0 << 8) & 0xFF000000U); + tk[1] = ((row1 >> 24) & 0x000000FFU) | + ((row0 << 8) & 0x00FFFF00U) | + ((row1 << 24) & 0xFF000000U); + tk[2] = ((row3 >> 8) & 0x0000FFFFU) | + ((row2 >> 8) & 0x00FF0000U) | + ((row2 << 8) & 0xFF000000U); + tk[3] = ((row3 >> 24) & 0x000000FFU) | + ((row2 << 8) & 0x00FFFF00U) | + ((row3 << 24) & 0xFF000000U); +} + +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); + memcpy(ks->TK3, key + 32, sizeof(ks->TK3)); +#else + /* Set the initial states of TK1, TK2, and TK3 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Set up the key schedule using TK2 and TK3. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ TK3[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ TK3[1] ^ (rc >> 4); + + /* Permute TK2 and TK3 for the next round */ + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + + /* Apply the LFSR's to TK2 and TK3 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } +#endif +} + +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t TK3[4]; + uint8_t rc = 0x15; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_384_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Permute TK1 to fast-forward it to the end of the key schedule */ + skinny128_fast_forward_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_fast_forward_tk(TK2); + skinny128_fast_forward_tk(TK3); + for (round = 0; round < SKINNY_128_384_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2 and TK3. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + skinny128_LFSR3(TK3[2]); + skinny128_LFSR3(TK3[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_inv_permute_tk(TK3); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); + skinny128_LFSR2(TK3[2]); + skinny128_LFSR2(TK3[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK3[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); + TK2[0] = le_load_word32(tk2); + TK2[1] = le_load_word32(tk2 + 4); + TK2[2] = le_load_word32(tk2 + 8); + TK2[3] = le_load_word32(tk2 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK3[0] = le_load_word32(ks->TK3); + TK3[1] = le_load_word32(ks->TK3 + 4); + TK3[2] = le_load_word32(ks->TK3 + 8); + TK3[3] = le_load_word32(ks->TK3 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0] ^ TK2[0]; + s1 ^= schedule[1] ^ TK1[1] ^ TK2[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK3); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t TK3[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + TK3[0] = le_load_word32(key + 32); + TK3[1] = le_load_word32(key + 36); + TK3[2] = le_load_word32(key + 40); + TK3[3] = le_load_word32(key + 44); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_384_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ TK3[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ TK3[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1, TK2, and TK3 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_permute_tk(TK3); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR3(TK3[0]); + skinny128_LFSR3(TK3[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]) +{ +#if !SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint32_t *schedule; + unsigned round; + uint8_t rc; +#endif + +#if SKINNY_128_SMALL_SCHEDULE + /* Copy the input key as-is when using the small key schedule version */ + memcpy(ks->TK1, key, sizeof(ks->TK1)); + memcpy(ks->TK2, key + 16, sizeof(ks->TK2)); +#else + /* Set the initial states of TK1 and TK2 */ + memcpy(ks->TK1, key, 16); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Set up the key schedule using TK2. TK1 is not added + * to the key schedule because we will derive that part of the + * schedule during encryption operations */ + schedule = ks->k; + rc = 0; + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round, schedule += 2) { + /* XOR the round constants with the current schedule words. + * The round constants for the 3rd and 4th rows are + * fixed and will be applied during encryption. */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + schedule[0] = TK2[0] ^ (rc & 0x0F); + schedule[1] = TK2[1] ^ (rc >> 4); + + /* Permute TK2 for the next round */ + skinny128_permute_tk(TK2); + + /* Apply the LFSR to TK2 */ + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } +#endif +} + +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0; +#else + const uint32_t *schedule = ks->k; +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1 */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); +#endif + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; +#endif + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); +#else + schedule += 2; +#endif + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; +#if SKINNY_128_SMALL_SCHEDULE + uint32_t TK2[4]; + uint8_t rc = 0x09; +#else + const uint32_t *schedule = &(ks->k[SKINNY_128_256_ROUNDS * 2 - 2]); +#endif + uint32_t temp; + unsigned round; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakable part of the state, TK1. + * There is no need to fast-forward TK1 because the value at + * the end of the key schedule is the same as at the start */ + TK1[0] = le_load_word32(ks->TK1); + TK1[1] = le_load_word32(ks->TK1 + 4); + TK1[2] = le_load_word32(ks->TK1 + 8); + TK1[3] = le_load_word32(ks->TK1 + 12); +#if SKINNY_128_SMALL_SCHEDULE + TK2[0] = le_load_word32(ks->TK2); + TK2[1] = le_load_word32(ks->TK2 + 4); + TK2[2] = le_load_word32(ks->TK2 + 8); + TK2[3] = le_load_word32(ks->TK2 + 12); + for (round = 0; round < SKINNY_128_256_ROUNDS; round += 2) { + // Also fast-forward the LFSR's on every byte of TK2. + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + skinny128_LFSR2(TK2[2]); + skinny128_LFSR2(TK2[3]); + } +#endif + + /* Perform all decryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Inverse permutation on TK1 for this round */ + skinny128_inv_permute_tk(TK1); +#if SKINNY_128_SMALL_SCHEDULE + skinny128_inv_permute_tk(TK2); + skinny128_LFSR3(TK2[2]); + skinny128_LFSR3(TK2[3]); +#endif + + /* Inverse mix of the columns */ + temp = s3; + s3 = s0; + s0 = s1; + s1 = s2; + s3 ^= temp; + s2 = temp ^ s0; + s1 ^= s2; + + /* Inverse shift of the rows */ + s1 = leftRotate24(s1); + s2 = leftRotate16(s2); + s3 = leftRotate8(s3); + + /* Apply the subkey for this round */ +#if SKINNY_128_SMALL_SCHEDULE + rc = (rc >> 1) ^ (((rc << 5) ^ rc ^ 0x20) & 0x20); + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); +#else + s0 ^= schedule[0] ^ TK1[0]; + s1 ^= schedule[1] ^ TK1[1]; + schedule -= 2; +#endif + s2 ^= 0x02; + + /* Apply the inverse of the S-box to all bytes in the state */ + skinny128_inv_sbox(s0); + skinny128_inv_sbox(s1); + skinny128_inv_sbox(s2); + skinny128_inv_sbox(s3); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t TK1[4]; + uint32_t TK2[4]; + uint32_t temp; + unsigned round; + uint8_t rc = 0; + + /* Unpack the input block into the state array */ + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Make a local copy of the tweakey */ + TK1[0] = le_load_word32(key); + TK1[1] = le_load_word32(key + 4); + TK1[2] = le_load_word32(key + 8); + TK1[3] = le_load_word32(key + 12); + TK2[0] = le_load_word32(key + 16); + TK2[1] = le_load_word32(key + 20); + TK2[2] = le_load_word32(key + 24); + TK2[3] = le_load_word32(key + 28); + + /* Perform all encryption rounds */ + for (round = 0; round < SKINNY_128_256_ROUNDS; ++round) { + /* Apply the S-box to all bytes in the state */ + skinny128_sbox(s0); + skinny128_sbox(s1); + skinny128_sbox(s2); + skinny128_sbox(s3); + + /* XOR the round constant and the subkey for this round */ + rc = (rc << 1) ^ ((rc >> 5) & 0x01) ^ ((rc >> 4) & 0x01) ^ 0x01; + rc &= 0x3F; + s0 ^= TK1[0] ^ TK2[0] ^ (rc & 0x0F); + s1 ^= TK1[1] ^ TK2[1] ^ (rc >> 4); + s2 ^= 0x02; + + /* Shift the cells in the rows right, which moves the cell + * values up closer to the MSB. That is, we do a left rotate + * on the word to rotate the cells in the word right */ + s1 = leftRotate8(s1); + s2 = leftRotate16(s2); + s3 = leftRotate24(s3); + + /* Mix the columns */ + s1 ^= s2; + s2 ^= s0; + temp = s3 ^ s2; + s3 = s2; + s2 = s1; + s1 = s0; + s0 = temp; + + /* Permute TK1 and TK2 for the next round */ + skinny128_permute_tk(TK1); + skinny128_permute_tk(TK2); + skinny128_LFSR2(TK2[0]); + skinny128_LFSR2(TK2[1]); + } + + /* Pack the result into the output buffer */ + le_store_word32(output, s0); + le_store_word32(output + 4, s1); + le_store_word32(output + 8, s2); + le_store_word32(output + 12, s3); +} + +#else /* __AVR__ */ + +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2) +{ + memcpy(ks->TK2, tk2, 16); + skinny_128_384_encrypt(ks, output, input); +} + +#endif /* __AVR__ */ diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.h new file mode 100644 index 0000000..2bfda3c --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinny128.h @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNY128_H +#define LW_INTERNAL_SKINNY128_H + +/** + * \file internal-skinny128.h + * \brief SKINNY-128 block cipher family. + * + * References: https://eprint.iacr.org/2016/660.pdf, + * https://sites.google.com/site/skinnycipher/ + */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \def SKINNY_128_SMALL_SCHEDULE + * \brief Defined to 1 to use the small key schedule version of SKINNY-128. + */ +#if defined(__AVR__) +#define SKINNY_128_SMALL_SCHEDULE 1 +#else +#define SKINNY_128_SMALL_SCHEDULE 0 +#endif + +/** + * \brief Size of a block for SKINNY-128 block ciphers. + */ +#define SKINNY_128_BLOCK_SIZE 16 + +/** + * \brief Number of rounds for SKINNY-128-384. + */ +#define SKINNY_128_384_ROUNDS 56 + +/** + * \brief Structure of the key schedule for SKINNY-128-384. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; + + /** TK3 for the small key schedule */ + uint8_t TK3[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_384_ROUNDS * 2]; +#endif + +} skinny_128_384_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-384. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_384_init + (skinny_128_384_key_schedule_t *ks, const unsigned char key[48]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_encrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-384. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_384_decrypt + (const skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and an explicitly + * provided TK2 value. + * + * \param ks Points to the SKINNY-128-384 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tk2 TK2 value that should be updated on the fly. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when both TK1 and TK2 change from block to block. + * When the key is initialized with skinny_128_384_init(), the TK2 part of + * the key value should be set to zero. + * + * \note Some versions of this function may modify the key schedule to + * copy tk2 into place. + */ +void skinny_128_384_encrypt_tk2 + (skinny_128_384_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, const unsigned char *tk2); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-384 and a + * fully specified tweakey value. + * + * \param key Points to the 384-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-384 but + * more memory-efficient. + */ +void skinny_128_384_encrypt_tk_full + (const unsigned char key[48], unsigned char *output, + const unsigned char *input); + +/** + * \brief Number of rounds for SKINNY-128-256. + */ +#define SKINNY_128_256_ROUNDS 48 + +/** + * \brief Structure of the key schedule for SKINNY-128-256. + */ +typedef struct +{ + /** TK1 for the tweakable part of the key schedule */ + uint8_t TK1[16]; + +#if SKINNY_128_SMALL_SCHEDULE + /** TK2 for the small key schedule */ + uint8_t TK2[16]; +#else + /** Words of the full key schedule */ + uint32_t k[SKINNY_128_256_ROUNDS * 2]; +#endif + +} skinny_128_256_key_schedule_t; + +/** + * \brief Initializes the key schedule for SKINNY-128-256. + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the key data. + */ +void skinny_128_256_init + (skinny_128_256_key_schedule_t *ks, const unsigned char key[32]); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_encrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with SKINNY-128-256. + * + * \param ks Points to the SKINNY-128-256 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void skinny_128_256_decrypt + (const skinny_128_256_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with SKINNY-128-256 and a + * fully specified tweakey value. + * + * \param key Points to the 256-bit tweakey value. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version is useful when the entire tweakey changes from block to + * block. It is slower than the other versions of SKINNY-128-256 but + * more memory-efficient. + */ +void skinny_128_256_encrypt_tk_full + (const unsigned char key[32], unsigned char *output, + const unsigned char *input); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinnyutil.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinnyutil.h new file mode 100644 index 0000000..83136cb --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-skinnyutil.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SKINNYUTIL_H +#define LW_INTERNAL_SKINNYUTIL_H + +/** + * \file internal-skinnyutil.h + * \brief Utilities to help implement SKINNY and its variants. + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond skinnyutil */ + +/* Utilities for implementing SKINNY-128 */ + +#define skinny128_LFSR2(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x << 1) & 0xFEFEFEFEU) ^ \ + (((_x >> 7) ^ (_x >> 5)) & 0x01010101U); \ + } while (0) + + +#define skinny128_LFSR3(x) \ + do { \ + uint32_t _x = (x); \ + (x) = ((_x >> 1) & 0x7F7F7F7FU) ^ \ + (((_x << 7) ^ (_x << 1)) & 0x80808080U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny128_inv_LFSR2(x) skinny128_LFSR3(x) +#define skinny128_inv_LFSR3(x) skinny128_LFSR2(x) + +#define skinny128_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint32_t row2 = tk[2]; \ + uint32_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 16) | (row3 >> 16); \ + tk[0] = ((row2 >> 8) & 0x000000FFU) | \ + ((row2 << 16) & 0x00FF0000U) | \ + ( row3 & 0xFF00FF00U); \ + tk[1] = ((row2 >> 16) & 0x000000FFU) | \ + (row2 & 0xFF000000U) | \ + ((row3 << 8) & 0x0000FF00U) | \ + ( row3 & 0x00FF0000U); \ + } while (0) + +#define skinny128_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint32_t row0 = tk[0]; \ + uint32_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 >> 16) & 0x000000FFU) | \ + ((row0 << 8) & 0x0000FF00U) | \ + ((row1 << 16) & 0x00FF0000U) | \ + ( row1 & 0xFF000000U); \ + tk[3] = ((row0 >> 16) & 0x0000FF00U) | \ + ((row0 << 16) & 0xFF000000U) | \ + ((row1 >> 16) & 0x000000FFU) | \ + ((row1 << 8) & 0x00FF0000U); \ + } while (0) + +/* + * Apply the SKINNY sbox. The original version from the specification is + * equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE(x) + * ((((x) & 0x01010101U) << 2) | + * (((x) & 0x06060606U) << 5) | + * (((x) & 0x20202020U) >> 5) | + * (((x) & 0xC8C8C8C8U) >> 2) | + * (((x) & 0x10101010U) >> 1)) + * + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE(x); + * x = SBOX_MIX(x); + * return SBOX_SWAP(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + x ^= (((x >> 2) & (x >> 3)) & 0x11111111U); \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 5) & (x << 4)) & 0x40404040U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 2) & (x << 1)) & 0x02020202U) ^ y; \ + y = (((x >> 5) & (x << 1)) & 0x04040404U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [2 7 6 1 3 0 4 5] */ \ + x = ((x & 0x08080808U) << 1) | \ + ((x & 0x32323232U) << 2) | \ + ((x & 0x01010101U) << 5) | \ + ((x & 0x80808080U) >> 6) | \ + ((x & 0x40404040U) >> 4) | \ + ((x & 0x04040404U) >> 2); \ +} while (0) + +/* + * Apply the inverse of the SKINNY sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x11111111U) ^ (x)) + * #define SBOX_SWAP(x) + * (((x) & 0xF9F9F9F9U) | + * (((x) >> 1) & 0x02020202U) | + * (((x) << 1) & 0x04040404U)) + * #define SBOX_PERMUTE_INV(x) + * ((((x) & 0x08080808U) << 1) | + * (((x) & 0x32323232U) << 2) | + * (((x) & 0x01010101U) << 5) | + * (((x) & 0xC0C0C0C0U) >> 5) | + * (((x) & 0x04040404U) >> 2)) + * + * x = SBOX_SWAP(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_PERMUTE_INV(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_PERMUTE_INV and SBOX_SWAP steps to be performed with one + * final permuatation. This reduces the number of shift operations. + */ +#define skinny128_inv_sbox(x) \ +do { \ + uint32_t y; \ + \ + /* Mix the bits */ \ + x = ~x; \ + y = (((x >> 1) & (x >> 3)) & 0x01010101U); \ + x ^= (((x >> 2) & (x >> 3)) & 0x10101010U) ^ y; \ + y = (((x >> 6) & (x >> 1)) & 0x02020202U); \ + x ^= (((x >> 1) & (x >> 2)) & 0x08080808U) ^ y; \ + y = (((x << 2) & (x << 1)) & 0x80808080U); \ + x ^= (((x >> 1) & (x << 2)) & 0x04040404U) ^ y; \ + y = (((x << 5) & (x << 1)) & 0x20202020U); \ + x ^= (((x << 4) & (x << 5)) & 0x40404040U) ^ y; \ + x = ~x; \ + \ + /* Permutation generated by http://programming.sirrida.de/calcperm.php */ \ + /* The final permutation for each byte is [5 3 0 4 6 7 2 1] */ \ + x = ((x & 0x01010101U) << 2) | \ + ((x & 0x04040404U) << 4) | \ + ((x & 0x02020202U) << 6) | \ + ((x & 0x20202020U) >> 5) | \ + ((x & 0xC8C8C8C8U) >> 2) | \ + ((x & 0x10101010U) >> 1); \ +} while (0) + +/* Utilities for implementing SKINNY-64 */ + +#define skinny64_LFSR2(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x << 1) & 0xEEEEU) ^ (((_x >> 3) ^ (_x >> 2)) & 0x1111U); \ + } while (0) + +#define skinny64_LFSR3(x) \ + do { \ + uint16_t _x = (x); \ + (x) = ((_x >> 1) & 0x7777U) ^ ((_x ^ (_x << 3)) & 0x8888U); \ + } while (0) + +/* LFSR2 and LFSR3 are inverses of each other */ +#define skinny64_inv_LFSR2(x) skinny64_LFSR3(x) +#define skinny64_inv_LFSR3(x) skinny64_LFSR2(x) + +#define skinny64_permute_tk(tk) \ + do { \ + /* PT = [9, 15, 8, 13, 10, 14, 12, 11, 0, 1, 2, 3, 4, 5, 6, 7] */ \ + uint16_t row2 = tk[2]; \ + uint16_t row3 = tk[3]; \ + tk[2] = tk[0]; \ + tk[3] = tk[1]; \ + row3 = (row3 << 8) | (row3 >> 8); \ + tk[0] = ((row2 << 4) & 0xF000U) | \ + ((row2 >> 8) & 0x00F0U) | \ + ( row3 & 0x0F0FU); \ + tk[1] = ((row2 << 8) & 0xF000U) | \ + ((row3 >> 4) & 0x0F00U) | \ + ( row3 & 0x00F0U) | \ + ( row2 & 0x000FU); \ + } while (0) + +#define skinny64_inv_permute_tk(tk) \ + do { \ + /* PT' = [8, 9, 10, 11, 12, 13, 14, 15, 2, 0, 4, 7, 6, 3, 5, 1] */ \ + uint16_t row0 = tk[0]; \ + uint16_t row1 = tk[1]; \ + tk[0] = tk[2]; \ + tk[1] = tk[3]; \ + tk[2] = ((row0 << 8) & 0xF000U) | \ + ((row0 >> 4) & 0x0F00U) | \ + ((row1 >> 8) & 0x00F0U) | \ + ( row1 & 0x000FU); \ + tk[3] = ((row1 << 8) & 0xF000U) | \ + ((row0 << 8) & 0x0F00U) | \ + ((row1 >> 4) & 0x00F0U) | \ + ((row0 >> 8) & 0x000FU); \ + } while (0) + +/* + * Apply the SKINNY-64 sbox. The original version from the + * specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT(x) + * ((((x) << 1) & 0xEEEEU) | (((x) >> 3) & 0x1111U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT(x); + * return SBOX_MIX(x); + * + * However, we can mix the bits in their original positions and then + * delay the SBOX_SHIFT steps to be performed with one final rotation. + * This reduces the number of required shift operations from 14 to 10. + * + * We can further reduce the number of NOT operations from 4 to 2 + * using the technique from https://github.com/kste/skinny_avx to + * convert NOR-XOR operations into AND-XOR operations by converting + * the S-box into its NOT-inverse. + */ +#define skinny64_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x >> 2) & (x << 1)) & 0x2222U) ^ x; \ + x = ~x; \ + x = ((x >> 1) & 0x7777U) | ((x << 3) & 0x8888U); \ +} while (0) + +/* + * Apply the inverse of the SKINNY-64 sbox. The original version + * from the specification is equivalent to: + * + * #define SBOX_MIX(x) + * (((~((((x) >> 1) | (x)) >> 2)) & 0x1111U) ^ (x)) + * #define SBOX_SHIFT_INV(x) + * ((((x) >> 1) & 0x7777U) | (((x) << 3) & 0x8888U)) + * + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * x = SBOX_MIX(x); + * x = SBOX_SHIFT_INV(x); + * return SBOX_MIX(x); + */ +#define skinny64_inv_sbox(x) \ +do { \ + x = ~x; \ + x = (((x >> 3) & (x >> 2)) & 0x1111U) ^ x; \ + x = (((x << 1) & (x >> 2)) & 0x2222U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x4444U) ^ x; \ + x = (((x << 1) & (x << 2)) & 0x8888U) ^ x; \ + x = ~x; \ + x = ((x << 1) & 0xEEEEU) | ((x >> 3) & 0x1111U); \ +} while (0) + +/** @endcond */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-util.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.c b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.c new file mode 100644 index 0000000..0abdeff --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "skinny-hash.h" +#include "internal-skinny128.h" +#include "internal-util.h" +#include + +aead_hash_algorithm_t const skinny_tk3_hash_algorithm = { + "SKINNY-tk3-HASH", + sizeof(int), + SKINNY_HASH_SIZE, + AEAD_FLAG_NONE, + skinny_tk3_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const skinny_tk2_hash_algorithm = { + "SKINNY-tk2-HASH", + sizeof(int), + SKINNY_HASH_SIZE, + AEAD_FLAG_NONE, + skinny_tk2_hash, + (aead_hash_init_t)0, + (aead_hash_update_t)0, + (aead_hash_finalize_t)0, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \brief Size of the permutation state for SKINNY-tk3-HASH. + */ +#define SKINNY_TK3_STATE_SIZE 48 + +/** + * \brief Size of the permutation state for SKINNY-tk2-HASH. + */ +#define SKINNY_TK2_STATE_SIZE 32 + +/** + * \brief Rate of absorbing data for SKINNY-tk3-HASH. + */ +#define SKINNY_TK3_HASH_RATE 16 + +/** + * \brief Rate of absorbing data for SKINNY-tk2-HASH. + */ +#define SKINNY_TK2_HASH_RATE 4 + +/** + * \brief Input block that is encrypted with the state for each + * block permutation of SKINNY-tk3-HASH or SKINNY-tk2-HASH. + */ +static unsigned char const skinny_hash_block[48] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/** + * \brief Permutes the internal state for SKINNY-tk3-HASH. + * + * \param state The state to be permuted. + */ +static void skinny_tk3_permute(unsigned char state[SKINNY_TK3_STATE_SIZE]) +{ + unsigned char temp[SKINNY_TK3_STATE_SIZE]; + skinny_128_384_encrypt_tk_full(state, temp, skinny_hash_block); + skinny_128_384_encrypt_tk_full(state, temp + 16, skinny_hash_block + 16); + skinny_128_384_encrypt_tk_full(state, temp + 32, skinny_hash_block + 32); + memcpy(state, temp, SKINNY_TK3_STATE_SIZE); +} + +/** + * \brief Permutes the internal state for SKINNY-tk2-HASH. + * + * \param state The state to be permuted. + */ +static void skinny_tk2_permute(unsigned char state[SKINNY_TK2_STATE_SIZE]) +{ + unsigned char temp[SKINNY_TK2_STATE_SIZE]; + skinny_128_256_encrypt_tk_full(state, temp, skinny_hash_block); + skinny_128_256_encrypt_tk_full(state, temp + 16, skinny_hash_block + 16); + memcpy(state, temp, SKINNY_TK2_STATE_SIZE); +} + +int skinny_tk3_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[SKINNY_TK3_STATE_SIZE]; + unsigned temp; + + /* Initialize the hash state */ + memset(state, 0, sizeof(state)); + state[SKINNY_TK3_HASH_RATE] = 0x80; + + /* Process as many full blocks as possible */ + while (inlen >= SKINNY_TK3_HASH_RATE) { + lw_xor_block(state, in, SKINNY_TK3_HASH_RATE); + skinny_tk3_permute(state); + in += SKINNY_TK3_HASH_RATE; + inlen -= SKINNY_TK3_HASH_RATE; + } + + /* Pad and process the last block */ + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + skinny_tk3_permute(state); + + /* Generate the hash output */ + memcpy(out, state, 16); + skinny_tk3_permute(state); + memcpy(out + 16, state, 16); + return 0; +} + +int skinny_tk2_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + unsigned char state[SKINNY_TK2_STATE_SIZE]; + unsigned temp; + + /* Initialize the hash state */ + memset(state, 0, sizeof(state)); + state[SKINNY_TK2_HASH_RATE] = 0x80; + + /* Process as many full blocks as possible */ + while (inlen >= SKINNY_TK2_HASH_RATE) { + lw_xor_block(state, in, SKINNY_TK2_HASH_RATE); + skinny_tk2_permute(state); + in += SKINNY_TK2_HASH_RATE; + inlen -= SKINNY_TK2_HASH_RATE; + } + + /* Pad and process the last block */ + temp = (unsigned)inlen; + lw_xor_block(state, in, temp); + state[temp] ^= 0x80; /* padding */ + skinny_tk2_permute(state); + + /* Generate the hash output */ + memcpy(out, state, 16); + skinny_tk2_permute(state); + memcpy(out + 16, state, 16); + return 0; +} diff --git a/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.h b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.h new file mode 100644 index 0000000..f75ce9f --- /dev/null +++ b/skinny/Implementations/crypto_hash/skinnyhashtk3/rhys-avr/skinny-hash.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SKINNY_HASH_H +#define LWCRYPTO_SKINNY_HASH_H + +#include "aead-common.h" + +/** + * \file skinny-hash.h + * \brief Hash algorithms based on the SKINNY block cipher. + * + * The SKINNY-AEAD family includes two hash algorithms: + * + * \li SKINNY-tk3-HASH with a 256-bit hash output, based around the + * SKINNY-128-384 tweakable block cipher. This is the primary hashing + * member of the family. + * \li SKINNY-tk2-HASH with a 256-bit hash output, based around the + * SKINNY-128-256 tweakable block cipher. + * + * References: https://sites.google.com/site/skinnycipher/home + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the hash output for SKINNY-tk3-HASH and SKINNY-tk2-HASH. + */ +#define SKINNY_HASH_SIZE 32 + +/** + * \brief Meta-information block for the SKINNY-tk3-HASH algorithm. + */ +extern aead_hash_algorithm_t const skinny_tk3_hash_algorithm; + +/** + * \brief Meta-information block for the SKINNY-tk2-HASH algorithm. + */ +extern aead_hash_algorithm_t const skinny_tk2_hash_algorithm; + +/** + * \brief Hashes a block of input data with SKINNY-tk3-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SKINNY_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int skinny_tk3_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Hashes a block of input data with SKINNY-tk2-HASH to + * generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * SKINNY_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int skinny_tk2_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/api.h b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/encrypt.c b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..a56e57a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sparkle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_128_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_128_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm128128v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/api.h b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/api.h new file mode 100644 index 0000000..c340ebc --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 24 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 24 +#define CRYPTO_ABYTES 24 +#define CRYPTO_NOOVERLAP 1 diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/encrypt.c b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..43a4aac --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sparkle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_192_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_192_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm192192v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/api.h b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/api.h new file mode 100644 index 0000000..420cea6 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 32 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/encrypt.c b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..6063cb6 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sparkle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_256_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_256_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256128v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/api.h b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/api.h new file mode 100644 index 0000000..c11fc10 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 32 +#define CRYPTO_ABYTES 32 +#define CRYPTO_NOOVERLAP 1 diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/encrypt.c b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..c5f15f6 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sparkle.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_256_256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return schwaemm_256_256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_aead/schwaemm256256v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/api.h b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/hash.c b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/hash.c new file mode 100644 index 0000000..b9163f6 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "sparkle.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return esch_256_hash(out, in, inlen); +} diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch256v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.c b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.h b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/api.h b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/api.h new file mode 100644 index 0000000..d507385 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 48 diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/hash.c b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/hash.c new file mode 100644 index 0000000..9acc9f9 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "sparkle.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return esch_384_hash(out, in, inlen); +} diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle-avr.S b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle-avr.S new file mode 100644 index 0000000..753ea2f --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle-avr.S @@ -0,0 +1,2887 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global sparkle_256 + .type sparkle_256, @function +sparkle_256: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 129f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 129f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 129f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 129f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 129f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 129f + pop r18 + cpi r18,7 + brne 5094f + rjmp 615f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 129f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 129f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 129f + rjmp 615f +129: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + movw r18,r4 + movw r20,r6 + movw r4,r14 + movw r6,r12 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + movw r8,r18 + movw r10,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + ld r18,Z + ldd r19,Z+1 + ldd r20,Z+2 + ldd r21,Z+3 + movw r14,r22 + movw r12,r26 + eor r14,r18 + eor r15,r19 + eor r12,r20 + eor r13,r21 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + movw r22,r16 + movw r26,r24 + eor r22,r28 + eor r23,r29 + eor r26,r2 + eor r27,r3 + movw r28,r14 + movw r2,r12 + ret +615: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_256, .-sparkle_256 + + .text +.global sparkle_384 + .type sparkle_384, @function +sparkle_384: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 140f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 140f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 140f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 140f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 140f + pop r18 + cpi r18,7 + brne 5094f + rjmp 886f +5094: + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 140f + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 140f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 140f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 140f + rjmp 886f +140: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + ldd r18,Z+28 + ldd r19,Z+29 + ldd r20,Z+30 + ldd r21,Z+31 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+20 + ldd r9,Z+21 + ldd r10,Z+22 + ldd r11,Z+23 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r0,Z+4 + eor r18,r0 + ldd r0,Z+5 + eor r19,r0 + ldd r0,Z+6 + eor r20,r0 + ldd r0,Z+7 + eor r21,r0 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + ldd r18,Z+4 + ldd r19,Z+5 + ldd r20,Z+6 + ldd r21,Z+7 + std Z+28,r18 + std Z+29,r19 + std Z+30,r20 + std Z+31,r21 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + std Z+36,r18 + std Z+37,r19 + std Z+38,r20 + std Z+39,r21 + eor r8,r14 + eor r9,r15 + eor r10,r12 + eor r11,r13 + ldd r18,Z+24 + ldd r19,Z+25 + ldd r20,Z+26 + ldd r21,Z+27 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r28,Z+16 + ldd r29,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+24,r14 + std Z+25,r15 + std Z+26,r12 + std Z+27,r13 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + std Z+32,r18 + std Z+33,r19 + std Z+34,r20 + std Z+35,r21 + eor r28,r16 + eor r29,r17 + eor r2,r24 + eor r3,r25 + ret +886: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_384, .-sparkle_384 + + .text +.global sparkle_512 + .type sparkle_512, @function +sparkle_512: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + push r22 + ld r22,Z + ldd r23,Z+1 + ldd r26,Z+2 + ldd r27,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r28,Z+8 + ldd r29,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,1 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,2 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,3 + eor r8,r18 + rcall 151f + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,4 + eor r8,r18 + rcall 151f + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,5 + eor r8,r18 + rcall 151f + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,6 + eor r8,r18 + rcall 151f + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,7 + eor r8,r18 + rcall 151f + pop r18 + cpi r18,8 + brne 5105f + rjmp 1189f +5105: + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,8 + eor r8,r18 + rcall 151f + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,9 + eor r8,r18 + rcall 151f + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,10 + eor r8,r18 + rcall 151f + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,11 + eor r8,r18 + rcall 151f + rjmp 1189f +151: + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,98 + ldi r19,81 + ldi r20,225 + ldi r21,183 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,128 + ldi r19,88 + ldi r20,113 + ldi r21,191 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + movw r12,r22 + movw r14,r26 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + movw r24,r4 + movw r16,r6 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + ldd r28,Z+24 + ldd r29,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,86 + ldi r19,218 + ldi r20,180 + ldi r21,56 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,56 + ldi r19,119 + ldi r20,78 + ldi r21,50 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r22 + std Z+17,r23 + std Z+18,r26 + std Z+19,r27 + std Z+20,r4 + std Z+21,r5 + std Z+22,r6 + std Z+23,r7 + std Z+24,r28 + std Z+25,r29 + std Z+26,r2 + std Z+27,r3 + std Z+28,r8 + std Z+29,r9 + std Z+30,r10 + std Z+31,r11 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + eor r12,r28 + eor r13,r29 + eor r14,r2 + eor r15,r3 + eor r24,r4 + eor r25,r5 + eor r16,r6 + eor r17,r7 + eor r24,r8 + eor r25,r9 + eor r16,r10 + eor r17,r11 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + ldd r28,Z+40 + ldd r29,Z+41 + ldd r2,Z+42 + ldd r3,Z+43 + ldd r8,Z+44 + ldd r9,Z+45 + ldd r10,Z+46 + ldd r11,Z+47 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,235 + ldi r19,133 + ldi r20,17 + ldi r21,187 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,87 + ldi r19,123 + ldi r20,124 + ldi r21,79 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + std Z+32,r22 + std Z+33,r23 + std Z+34,r26 + std Z+35,r27 + std Z+36,r4 + std Z+37,r5 + std Z+38,r6 + std Z+39,r7 + std Z+40,r28 + std Z+41,r29 + std Z+42,r2 + std Z+43,r3 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r22,Z+48 + ldd r23,Z+49 + ldd r26,Z+50 + ldd r27,Z+51 + ldd r4,Z+52 + ldd r5,Z+53 + ldd r6,Z+54 + ldd r7,Z+55 + ldd r28,Z+56 + ldd r29,Z+57 + ldd r2,Z+58 + ldd r3,Z+59 + ldd r8,Z+60 + ldd r9,Z+61 + ldd r10,Z+62 + ldd r11,Z+63 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r22,r18 + adc r23,r19 + adc r26,r20 + adc r27,r21 + eor r4,r27 + eor r5,r22 + eor r6,r23 + eor r7,r26 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r4 + movw r20,r6 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r22,r20 + adc r23,r21 + adc r26,r18 + adc r27,r19 + movw r18,r22 + movw r20,r26 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r4,r20 + eor r5,r21 + eor r6,r18 + eor r7,r19 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r4 + adc r23,r5 + adc r26,r6 + adc r27,r7 + movw r18,r22 + movw r20,r26 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r18,200 + ldi r19,161 + ldi r20,191 + ldi r21,207 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + add r22,r7 + adc r23,r4 + adc r26,r5 + adc r27,r6 + eor r4,r26 + eor r5,r27 + eor r6,r22 + eor r7,r23 + eor r22,r18 + eor r23,r19 + eor r26,r20 + eor r27,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + add r28,r18 + adc r29,r19 + adc r2,r20 + adc r3,r21 + eor r8,r3 + eor r9,r28 + eor r10,r29 + eor r11,r2 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + movw r18,r8 + movw r20,r10 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + add r28,r20 + adc r29,r21 + adc r2,r18 + adc r3,r19 + movw r18,r28 + movw r20,r2 + bst r18,0 + lsr r21 + ror r20 + ror r19 + ror r18 + bld r21,7 + eor r8,r20 + eor r9,r21 + eor r10,r18 + eor r11,r19 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r8 + adc r29,r9 + adc r2,r10 + adc r3,r11 + movw r18,r28 + movw r20,r2 + lsl r18 + rol r19 + rol r20 + rol r21 + adc r18,r1 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ldi r18,61 + ldi r19,41 + ldi r20,179 + ldi r21,194 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + add r28,r11 + adc r29,r8 + adc r2,r9 + adc r3,r10 + eor r8,r2 + eor r9,r3 + eor r10,r28 + eor r11,r29 + eor r28,r18 + eor r29,r19 + eor r2,r20 + eor r3,r21 + eor r14,r12 + eor r15,r13 + eor r16,r24 + eor r17,r25 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r4,Z+36 + ldd r5,Z+37 + ldd r6,Z+38 + ldd r7,Z+39 + eor r4,r14 + eor r5,r15 + eor r6,r12 + eor r7,r13 + ldd r18,Z+44 + ldd r19,Z+45 + ldd r20,Z+46 + ldd r21,Z+47 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + eor r14,r8 + eor r15,r9 + eor r12,r10 + eor r13,r11 + ldd r8,Z+28 + ldd r9,Z+29 + ldd r10,Z+30 + ldd r11,Z+31 + std Z+60,r8 + std Z+61,r9 + std Z+62,r10 + std Z+63,r11 + ldd r8,Z+4 + ldd r9,Z+5 + ldd r10,Z+6 + ldd r11,Z+7 + eor r4,r8 + eor r5,r9 + eor r6,r10 + eor r7,r11 + std Z+28,r4 + std Z+29,r5 + std Z+30,r6 + std Z+31,r7 + std Z+36,r8 + std Z+37,r9 + std Z+38,r10 + std Z+39,r11 + ldd r8,Z+12 + ldd r9,Z+13 + ldd r10,Z+14 + ldd r11,Z+15 + eor r18,r8 + eor r19,r9 + eor r20,r10 + eor r21,r11 + std Z+44,r8 + std Z+45,r9 + std Z+46,r10 + std Z+47,r11 + ldd r8,Z+52 + ldd r9,Z+53 + ldd r10,Z+54 + ldd r11,Z+55 + ldd r4,Z+20 + ldd r5,Z+21 + ldd r6,Z+22 + ldd r7,Z+23 + eor r8,r4 + eor r9,r5 + eor r10,r6 + eor r11,r7 + std Z+52,r4 + std Z+53,r5 + std Z+54,r6 + std Z+55,r7 + ldd r0,Z+60 + eor r14,r0 + ldd r0,Z+61 + eor r15,r0 + ldd r0,Z+62 + eor r12,r0 + ldd r0,Z+63 + eor r13,r0 + std Z+20,r14 + std Z+21,r15 + std Z+22,r12 + std Z+23,r13 + movw r4,r18 + movw r6,r20 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + std Z+48,r22 + std Z+49,r23 + std Z+50,r26 + std Z+51,r27 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r26,Z+34 + ldd r27,Z+35 + eor r22,r16 + eor r23,r17 + eor r26,r24 + eor r27,r25 + ldd r18,Z+40 + ldd r19,Z+41 + ldd r20,Z+42 + ldd r21,Z+43 + eor r18,r16 + eor r19,r17 + eor r20,r24 + eor r21,r25 + eor r16,r28 + eor r17,r29 + eor r24,r2 + eor r25,r3 + ldd r14,Z+24 + ldd r15,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+56,r14 + std Z+57,r15 + std Z+58,r12 + std Z+59,r13 + ld r14,Z + ldd r15,Z+1 + ldd r12,Z+2 + ldd r13,Z+3 + eor r22,r14 + eor r23,r15 + eor r26,r12 + eor r27,r13 + std Z+24,r22 + std Z+25,r23 + std Z+26,r26 + std Z+27,r27 + std Z+32,r14 + std Z+33,r15 + std Z+34,r12 + std Z+35,r13 + ldd r14,Z+8 + ldd r15,Z+9 + ldd r12,Z+10 + ldd r13,Z+11 + eor r18,r14 + eor r19,r15 + eor r20,r12 + eor r21,r13 + movw r22,r18 + movw r26,r20 + std Z+40,r14 + std Z+41,r15 + std Z+42,r12 + std Z+43,r13 + ldd r28,Z+48 + ldd r29,Z+49 + ldd r2,Z+50 + ldd r3,Z+51 + ldd r14,Z+16 + ldd r15,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + eor r28,r14 + eor r29,r15 + eor r2,r12 + eor r3,r13 + std Z+48,r14 + std Z+49,r15 + std Z+50,r12 + std Z+51,r13 + ldd r0,Z+56 + eor r16,r0 + ldd r0,Z+57 + eor r17,r0 + ldd r0,Z+58 + eor r24,r0 + ldd r0,Z+59 + eor r25,r0 + std Z+16,r16 + std Z+17,r17 + std Z+18,r24 + std Z+19,r25 + ret +1189: + st Z,r22 + std Z+1,r23 + std Z+2,r26 + std Z+3,r27 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r28 + std Z+9,r29 + std Z+10,r2 + std Z+11,r3 + std Z+12,r8 + std Z+13,r9 + std Z+14,r10 + std Z+15,r11 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sparkle_512, .-sparkle_512 + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.c b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.c new file mode 100644 index 0000000..4a4c0fb --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.c @@ -0,0 +1,382 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sparkle.h" + +#if !defined(__AVR__) + +/* The 8 basic round constants from the specification */ +#define RC_0 0xB7E15162 +#define RC_1 0xBF715880 +#define RC_2 0x38B4DA56 +#define RC_3 0x324E7738 +#define RC_4 0xBB1185EB +#define RC_5 0x4F7C7B57 +#define RC_6 0xCFBFA1C8 +#define RC_7 0xC2B3293D + +/* Round constants for all SPARKLE steps; maximum of 12 for SPARKLE-512 */ +static uint32_t const sparkle_rc[12] = { + RC_0, RC_1, RC_2, RC_3, RC_4, RC_5, RC_6, RC_7, + RC_0, RC_1, RC_2, RC_3 +}; + +/** + * \brief Alzette block cipher that implements the ARXbox layer of the + * SPARKLE permutation. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param k 32-bit round key. + */ +#define alzette(x, y, k) \ + do { \ + (x) += leftRotate1((y)); \ + (y) ^= leftRotate8((x)); \ + (x) ^= (k); \ + (x) += leftRotate15((y)); \ + (y) ^= leftRotate15((x)); \ + (x) ^= (k); \ + (x) += (y); \ + (y) ^= leftRotate1((x)); \ + (x) ^= (k); \ + (x) += leftRotate8((y)); \ + (y) ^= leftRotate16((x)); \ + (x) ^= (k); \ + } while (0) + +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-256 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + + /* Linear layer */ + tx = x0 ^ x1; + ty = y0 ^ y1; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y2 ^= tx; + tx ^= y3; + y3 = y1; + y1 = y2 ^ y0; + y2 = y0; + y0 = tx ^ y3; + x2 ^= ty; + ty ^= x3; + x3 = x1; + x1 = x2 ^ x0; + x2 = x0; + x0 = ty ^ x3; + } + + /* Write the local variables back to the SPARKLE-256 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); +#endif +} + +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5; + uint32_t y0, y1, y2, y3, y4, y5; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-384 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2; + ty = y0 ^ y1 ^ y2; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y3 ^= tx; + y4 ^= tx; + tx ^= y5; + y5 = y2; + y2 = y3 ^ y0; + y3 = y0; + y0 = y4 ^ y1; + y4 = y1; + y1 = tx ^ y5; + x3 ^= ty; + x4 ^= ty; + ty ^= x5; + x5 = x2; + x2 = x3 ^ x0; + x3 = x0; + x0 = x4 ^ x1; + x4 = x1; + x1 = ty ^ x5; + } + + /* Write the local variables back to the SPARKLE-384 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); +#endif +} + +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t y0, y1, y2, y3, y4, y5, y6, y7; + uint32_t tx, ty; + unsigned step; + + /* Load the SPARKLE-512 state up into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x0 = s[0]; + y0 = s[1]; + x1 = s[2]; + y1 = s[3]; + x2 = s[4]; + y2 = s[5]; + x3 = s[6]; + y3 = s[7]; + x4 = s[8]; + y4 = s[9]; + x5 = s[10]; + y5 = s[11]; + x6 = s[12]; + y6 = s[13]; + x7 = s[14]; + y7 = s[15]; +#else + x0 = le_load_word32((const uint8_t *)&(s[0])); + y0 = le_load_word32((const uint8_t *)&(s[1])); + x1 = le_load_word32((const uint8_t *)&(s[2])); + y1 = le_load_word32((const uint8_t *)&(s[3])); + x2 = le_load_word32((const uint8_t *)&(s[4])); + y2 = le_load_word32((const uint8_t *)&(s[5])); + x3 = le_load_word32((const uint8_t *)&(s[6])); + y3 = le_load_word32((const uint8_t *)&(s[7])); + x4 = le_load_word32((const uint8_t *)&(s[8])); + y4 = le_load_word32((const uint8_t *)&(s[9])); + x5 = le_load_word32((const uint8_t *)&(s[10])); + y5 = le_load_word32((const uint8_t *)&(s[11])); + x6 = le_load_word32((const uint8_t *)&(s[12])); + y6 = le_load_word32((const uint8_t *)&(s[13])); + x7 = le_load_word32((const uint8_t *)&(s[14])); + y7 = le_load_word32((const uint8_t *)&(s[15])); +#endif + + /* Perform all requested steps */ + for (step = 0; step < steps; ++step) { + /* Add round constants */ + y0 ^= sparkle_rc[step]; + y1 ^= step; + + /* ARXbox layer */ + alzette(x0, y0, RC_0); + alzette(x1, y1, RC_1); + alzette(x2, y2, RC_2); + alzette(x3, y3, RC_3); + alzette(x4, y4, RC_4); + alzette(x5, y5, RC_5); + alzette(x6, y6, RC_6); + alzette(x7, y7, RC_7); + + /* Linear layer */ + tx = x0 ^ x1 ^ x2 ^ x3; + ty = y0 ^ y1 ^ y2 ^ y3; + tx = leftRotate16(tx ^ (tx << 16)); + ty = leftRotate16(ty ^ (ty << 16)); + y4 ^= tx; + y5 ^= tx; + y6 ^= tx; + tx ^= y7; + y7 = y3; + y3 = y4 ^ y0; + y4 = y0; + y0 = y5 ^ y1; + y5 = y1; + y1 = y6 ^ y2; + y6 = y2; + y2 = tx ^ y7; + x4 ^= ty; + x5 ^= ty; + x6 ^= ty; + ty ^= x7; + x7 = x3; + x3 = x4 ^ x0; + x4 = x0; + x0 = x5 ^ x1; + x5 = x1; + x1 = x6 ^ x2; + x6 = x2; + x2 = ty ^ x7; + } + + /* Write the local variables back to the SPARKLE-512 state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s[0] = x0; + s[1] = y0; + s[2] = x1; + s[3] = y1; + s[4] = x2; + s[5] = y2; + s[6] = x3; + s[7] = y3; + s[8] = x4; + s[9] = y4; + s[10] = x5; + s[11] = y5; + s[12] = x6; + s[13] = y6; + s[14] = x7; + s[15] = y7; +#else + le_store_word32((uint8_t *)&(s[0]), x0); + le_store_word32((uint8_t *)&(s[1]), y0); + le_store_word32((uint8_t *)&(s[2]), x1); + le_store_word32((uint8_t *)&(s[3]), y1); + le_store_word32((uint8_t *)&(s[4]), x2); + le_store_word32((uint8_t *)&(s[5]), y2); + le_store_word32((uint8_t *)&(s[6]), x3); + le_store_word32((uint8_t *)&(s[7]), y3); + le_store_word32((uint8_t *)&(s[8]), x4); + le_store_word32((uint8_t *)&(s[9]), y4); + le_store_word32((uint8_t *)&(s[10]), x5); + le_store_word32((uint8_t *)&(s[11]), y5); + le_store_word32((uint8_t *)&(s[12]), x6); + le_store_word32((uint8_t *)&(s[13]), y6); + le_store_word32((uint8_t *)&(s[14]), x7); + le_store_word32((uint8_t *)&(s[15]), y7); +#endif +} + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.h b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.h new file mode 100644 index 0000000..fbdabc1 --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-sparkle.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPARKLE_H +#define LW_INTERNAL_SPARKLE_H + +#include "internal-util.h" + +/** + * \file internal-sparkle.h + * \brief Internal implementation of the SPARKLE permutation. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for SPARKLE-256. + */ +#define SPARKLE_256_STATE_SIZE 8 + +/** + * \brief Size of the state for SPARKLE-384. + */ +#define SPARKLE_384_STATE_SIZE 12 + +/** + * \brief Size of the state for SPARKLE-512. + */ +#define SPARKLE_512_STATE_SIZE 16 + +/** + * \brief Performs the SPARKLE-256 permutation. + * + * \param s The words of the SPARKLE-256 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 10. + */ +void sparkle_256(uint32_t s[SPARKLE_256_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-384 permutation. + * + * \param s The words of the SPARKLE-384 state in little-endian byte order. + * \param steps The number of steps to perform, 7 or 11. + */ +void sparkle_384(uint32_t s[SPARKLE_384_STATE_SIZE], unsigned steps); + +/** + * \brief Performs the SPARKLE-512 permutation. + * + * \param s The words of the SPARKLE-512 state in little-endian byte order. + * \param steps The number of steps to perform, 8 or 12. + */ +void sparkle_512(uint32_t s[SPARKLE_512_STATE_SIZE], unsigned steps); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-util.h b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.c b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.c new file mode 100644 index 0000000..e2aa25a --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.c @@ -0,0 +1,1135 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sparkle.h" +#include "internal-sparkle.h" +#include + +aead_cipher_t const schwaemm_256_128_cipher = { + "Schwaemm256-128", + SCHWAEMM_256_128_KEY_SIZE, + SCHWAEMM_256_128_NONCE_SIZE, + SCHWAEMM_256_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_128_aead_encrypt, + schwaemm_256_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_192_192_cipher = { + "Schwaemm192-192", + SCHWAEMM_192_192_KEY_SIZE, + SCHWAEMM_192_192_NONCE_SIZE, + SCHWAEMM_192_192_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_192_192_aead_encrypt, + schwaemm_192_192_aead_decrypt +}; + +aead_cipher_t const schwaemm_128_128_cipher = { + "Schwaemm128-128", + SCHWAEMM_128_128_KEY_SIZE, + SCHWAEMM_128_128_NONCE_SIZE, + SCHWAEMM_128_128_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_128_128_aead_encrypt, + schwaemm_128_128_aead_decrypt +}; + +aead_cipher_t const schwaemm_256_256_cipher = { + "Schwaemm256-256", + SCHWAEMM_256_256_KEY_SIZE, + SCHWAEMM_256_256_NONCE_SIZE, + SCHWAEMM_256_256_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + schwaemm_256_256_aead_encrypt, + schwaemm_256_256_aead_decrypt +}; + +aead_hash_algorithm_t const esch_256_hash_algorithm = { + "Esch256", + sizeof(esch_256_hash_state_t), + ESCH_256_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_256_hash, + (aead_hash_init_t)esch_256_hash_init, + (aead_hash_update_t)esch_256_hash_update, + (aead_hash_finalize_t)esch_256_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +aead_hash_algorithm_t const esch_384_hash_algorithm = { + "Esch384", + sizeof(esch_384_hash_state_t), + ESCH_384_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + esch_384_hash, + (aead_hash_init_t)esch_384_hash_init, + (aead_hash_update_t)esch_384_hash_update, + (aead_hash_finalize_t)esch_384_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +/** + * \def DOMAIN(value) + * \brief Build a domain separation value as a 32-bit word. + * + * \param value The base value. + * \return The domain separation value as a 32-bit word. + */ +#if defined(LW_UTIL_LITTLE_ENDIAN) +#define DOMAIN(value) (((uint32_t)(value)) << 24) +#else +#define DOMAIN(value) (value) +#endif + +/** + * \brief Rate at which bytes are processed by Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_RIGHT(s) \ + (SCHWAEMM_256_128_LEFT(s) + SCHWAEMM_256_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_256_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[8]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[9]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[10]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-128. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_128_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_128_RATE) { + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_256_128_RATE; + adlen -= SCHWAEMM_256_128_RATE; + } + if (adlen == SCHWAEMM_256_128_RATE) { + s[11] ^= DOMAIN(0x05); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x04); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_256_128_RATE); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + mlen -= SCHWAEMM_256_128_RATE; + } + if (mlen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + memcpy(c, block, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return 0; +} + +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_128_LEFT(s), npub, SCHWAEMM_256_128_NONCE_SIZE); + memcpy(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_256_128_RATE; + m += SCHWAEMM_256_128_RATE; + clen -= SCHWAEMM_256_128_RATE; + } + if (clen == SCHWAEMM_256_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_128_RATE); + s[11] ^= DOMAIN(0x07); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x06); + schwaemm_256_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_128_RIGHT(s), k, SCHWAEMM_256_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_128_RIGHT(s), c, SCHWAEMM_256_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RATE 24 + +/** + * \brief Pointer to the left of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_RIGHT(s) \ + (SCHWAEMM_192_192_LEFT(s) + SCHWAEMM_192_192_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + */ +#define schwaemm_192_192_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[3] ^ s[6]; \ + s[3] ^= t ^ s[9]; \ + t = s[1]; \ + s[1] = s[4] ^ s[7]; \ + s[4] ^= t ^ s[10]; \ + t = s[2]; \ + s[2] = s[5] ^ s[8]; \ + s[5] ^= t ^ s[11]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm192-192. + * + * \param s SPARKLE-384 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_192_192_authenticate + (uint32_t s[SPARKLE_384_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_192_192_RATE) { + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + ad += SCHWAEMM_192_192_RATE; + adlen -= SCHWAEMM_192_192_RATE; + } + if (adlen == SCHWAEMM_192_192_RATE) { + s[11] ^= DOMAIN(0x09); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[11] ^= DOMAIN(0x08); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); +} + +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint8_t block[SCHWAEMM_192_192_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + memcpy(c, block, SCHWAEMM_192_192_RATE); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + mlen -= SCHWAEMM_192_192_RATE; + } + if (mlen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + memcpy(c, block, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_384(s, 11); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return 0; +} + +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_192_192_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_192_192_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_192_192_LEFT(s), npub, SCHWAEMM_192_192_NONCE_SIZE); + memcpy(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_KEY_SIZE); + sparkle_384(s, 11); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_192_192_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_192_192_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + sparkle_384(s, 7); + c += SCHWAEMM_192_192_RATE; + m += SCHWAEMM_192_192_RATE; + clen -= SCHWAEMM_192_192_RATE; + } + if (clen == SCHWAEMM_192_192_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_192_192_RATE); + s[11] ^= DOMAIN(0x0B); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_192_192_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[11] ^= DOMAIN(0x0A); + schwaemm_192_192_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_384(s, 11); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_192_192_RIGHT(s), k, SCHWAEMM_192_192_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_192_192_RIGHT(s), c, SCHWAEMM_192_192_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RATE 16 + +/** + * \brief Pointer to the left of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_RIGHT(s) \ + (SCHWAEMM_128_128_LEFT(s) + SCHWAEMM_128_128_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + */ +#define schwaemm_128_128_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[2] ^ s[4]; \ + s[2] ^= t ^ s[6]; \ + t = s[1]; \ + s[1] = s[3] ^ s[5]; \ + s[3] ^= t ^ s[7]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm128-128. + * + * \param s SPARKLE-256 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_128_128_authenticate + (uint32_t s[SPARKLE_256_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_128_128_RATE) { + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + ad += SCHWAEMM_128_128_RATE; + adlen -= SCHWAEMM_128_128_RATE; + } + if (adlen == SCHWAEMM_128_128_RATE) { + s[7] ^= DOMAIN(0x05); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[7] ^= DOMAIN(0x04); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); +} + +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + uint8_t block[SCHWAEMM_128_128_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + memcpy(c, block, SCHWAEMM_128_128_RATE); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + mlen -= SCHWAEMM_128_128_RATE; + } + if (mlen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + memcpy(c, block, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_256(s, 10); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return 0; +} + +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_256_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_128_128_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_128_128_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_128_128_LEFT(s), npub, SCHWAEMM_128_128_NONCE_SIZE); + memcpy(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_KEY_SIZE); + sparkle_256(s, 10); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_128_128_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_128_128_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + sparkle_256(s, 7); + c += SCHWAEMM_128_128_RATE; + m += SCHWAEMM_128_128_RATE; + clen -= SCHWAEMM_128_128_RATE; + } + if (clen == SCHWAEMM_128_128_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_128_128_RATE); + s[7] ^= DOMAIN(0x07); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_128_128_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[7] ^= DOMAIN(0x06); + schwaemm_128_128_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_256(s, 10); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_128_128_RIGHT(s), k, SCHWAEMM_128_128_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_128_128_RIGHT(s), c, SCHWAEMM_128_128_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RATE 32 + +/** + * \brief Pointer to the left of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_LEFT(s) ((unsigned char *)&(s[0])) + +/** + * \brief Pointer to the right of the state for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_RIGHT(s) \ + (SCHWAEMM_256_256_LEFT(s) + SCHWAEMM_256_256_RATE) + +/** + * \brief Perform the rho1 and rate whitening steps for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + */ +#define schwaemm_256_256_rho(s) \ + do { \ + uint32_t t = s[0]; \ + s[0] = s[4] ^ s[8]; \ + s[4] ^= t ^ s[12]; \ + t = s[1]; \ + s[1] = s[5] ^ s[9]; \ + s[5] ^= t ^ s[13]; \ + t = s[2]; \ + s[2] = s[6] ^ s[10]; \ + s[6] ^= t ^ s[14]; \ + t = s[3]; \ + s[3] = s[7] ^ s[11]; \ + s[7] ^= t ^ s[15]; \ + } while (0) + +/** + * \brief Authenticates the associated data for Schwaemm256-256. + * + * \param s SPARKLE-512 state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data; must be >= 1. + */ +static void schwaemm_256_256_authenticate + (uint32_t s[SPARKLE_512_STATE_SIZE], + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen > SCHWAEMM_256_256_RATE) { + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + ad += SCHWAEMM_256_256_RATE; + adlen -= SCHWAEMM_256_256_RATE; + } + if (adlen == SCHWAEMM_256_256_RATE) { + s[15] ^= DOMAIN(0x11); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)adlen; + s[15] ^= DOMAIN(0x10); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, ad, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); +} + +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint8_t block[SCHWAEMM_256_256_RATE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) { + while (mlen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + memcpy(c, block, SCHWAEMM_256_256_RATE); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + mlen -= SCHWAEMM_256_256_RATE; + } + if (mlen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (block, (unsigned char *)s, m, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + memcpy(c, block, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_src(block, (unsigned char *)s, m, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + memcpy(c, block, temp); + } + sparkle_512(s, 12); + c += mlen; + } + + /* Generate the authentication tag */ + lw_xor_block_2_src + (c, SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return 0; +} + +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SCHWAEMM_256_256_TAG_SIZE) + return -1; + *mlen = clen - SCHWAEMM_256_256_TAG_SIZE; + + /* Initialize the state with the nonce and the key */ + memcpy(SCHWAEMM_256_256_LEFT(s), npub, SCHWAEMM_256_256_NONCE_SIZE); + memcpy(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_KEY_SIZE); + sparkle_512(s, 12); + + /* Process the associated data */ + if (adlen > 0) + schwaemm_256_256_authenticate(s, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SCHWAEMM_256_256_TAG_SIZE; + if (clen > 0) { + while (clen > SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + sparkle_512(s, 8); + c += SCHWAEMM_256_256_RATE; + m += SCHWAEMM_256_256_RATE; + clen -= SCHWAEMM_256_256_RATE; + } + if (clen == SCHWAEMM_256_256_RATE) { + lw_xor_block_2_src + (m, (unsigned char *)s, c, SCHWAEMM_256_256_RATE); + s[15] ^= DOMAIN(0x13); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, SCHWAEMM_256_256_RATE); + } else { + unsigned temp = (unsigned)clen; + lw_xor_block_2_src(m, (unsigned char *)s, c, temp); + s[15] ^= DOMAIN(0x12); + schwaemm_256_256_rho(s); + lw_xor_block((unsigned char *)s, m, temp); + ((unsigned char *)s)[temp] ^= 0x80; + } + sparkle_512(s, 12); + c += clen; + } + + /* Check the authentication tag */ + lw_xor_block(SCHWAEMM_256_256_RIGHT(s), k, SCHWAEMM_256_256_TAG_SIZE); + return aead_check_tag + (mtemp, *mlen, SCHWAEMM_256_256_RIGHT(s), c, SCHWAEMM_256_256_TAG_SIZE); +} + +/** + * \brief Rate at which bytes are processed by Esch256. + */ +#define ESCH_256_RATE 16 + +/** + * \brief Perform the M3 step for Esch256 to mix the input with the state. + * + * \param s SPARKLE-384 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_256_m3(s, block, domain) \ + do { \ + uint32_t tx = (block)[0] ^ (block)[2]; \ + uint32_t ty = (block)[1] ^ (block)[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= (block)[0] ^ ty; \ + s[1] ^= (block)[1] ^ tx; \ + s[2] ^= (block)[2] ^ ty; \ + s[3] ^= (block)[3] ^ tx; \ + if ((domain) != 0) \ + s[5] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + } while (0) + +/** @cond esch_256 */ + +/** + * \brief Word-based state for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_384_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_256_hash_state_wt; + +/** @endcond */ + +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_384_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x00); + sparkle_384(s, 7); + in += ESCH_256_RATE; + inlen -= ESCH_256_RATE; + } + if (inlen == ESCH_256_RATE) { + memcpy(block, in, ESCH_256_RATE); + esch_256_m3(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(s, block, 0x01); + } + sparkle_384(s, 11); + memcpy(out, s, ESCH_256_RATE); + sparkle_384(s, 7); + memcpy(out + ESCH_256_RATE, s, ESCH_256_RATE); + return 0; +} + +void esch_256_hash_init(esch_256_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_256_hash_state_t)); +} + +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x00); + sparkle_384(st->s.state, 7); + st->s.count = 0; + } + temp = ESCH_256_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out) +{ + esch_256_hash_state_wt *st = (esch_256_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_256_RATE) { + esch_256_m3(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_256_RATE - temp - 1); + esch_256_m3(st->s.state, st->s.block, 0x01); + } + sparkle_384(st->s.state, 11); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_256_RATE); + sparkle_384(st->s.state, 7); + memcpy(out + ESCH_256_RATE, st->s.state, ESCH_256_RATE); +} + +/** + * \brief Rate at which bytes are processed by Esch384. + */ +#define ESCH_384_RATE 16 + +/** + * \brief Perform the M4 step for Esch384 to mix the input with the state. + * + * \param s SPARKLE-512 state. + * \param block Block of input data that has been padded to the rate. + * \param domain Domain separator for this phase. + */ +#define esch_384_m4(s, block, domain) \ + do { \ + uint32_t tx = block[0] ^ block[2]; \ + uint32_t ty = block[1] ^ block[3]; \ + tx = leftRotate16(tx ^ (tx << 16)); \ + ty = leftRotate16(ty ^ (ty << 16)); \ + s[0] ^= block[0] ^ ty; \ + s[1] ^= block[1] ^ tx; \ + s[2] ^= block[2] ^ ty; \ + s[3] ^= block[3] ^ tx; \ + if ((domain) != 0) \ + s[7] ^= DOMAIN(domain); \ + s[4] ^= ty; \ + s[5] ^= tx; \ + s[6] ^= ty; \ + s[7] ^= tx; \ + } while (0) + +/** @cond esch_384 */ + +/** + * \brief Word-based state for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + uint32_t state[SPARKLE_512_STATE_SIZE]; + uint32_t block[4]; + unsigned char count; + } s; + unsigned long long align; + +} esch_384_hash_state_wt; + +/** @endcond */ + +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + uint32_t s[SPARKLE_512_STATE_SIZE]; + uint32_t block[ESCH_256_RATE / 4]; + memset(s, 0, sizeof(s)); + while (inlen > ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x00); + sparkle_512(s, 8); + in += ESCH_384_RATE; + inlen -= ESCH_384_RATE; + } + if (inlen == ESCH_384_RATE) { + memcpy(block, in, ESCH_384_RATE); + esch_384_m4(s, block, 0x02); + } else { + unsigned temp = (unsigned)inlen; + memcpy(block, in, temp); + ((unsigned char *)block)[temp] = 0x80; + memset(((unsigned char *)block) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(s, block, 0x01); + } + sparkle_512(s, 12); + memcpy(out, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE, s, ESCH_384_RATE); + sparkle_512(s, 8); + memcpy(out + ESCH_384_RATE * 2, s, ESCH_384_RATE); + return 0; +} + +void esch_384_hash_init(esch_384_hash_state_t *state) +{ + memset(state, 0, sizeof(esch_384_hash_state_t)); +} + +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + unsigned temp; + while (inlen > 0) { + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x00); + sparkle_512(st->s.state, 8); + st->s.count = 0; + } + temp = ESCH_384_RATE - st->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + memcpy(((unsigned char *)(st->s.block)) + st->s.count, in, temp); + st->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out) +{ + esch_384_hash_state_wt *st = (esch_384_hash_state_wt *)state; + + /* Pad and process the last block */ + if (st->s.count == ESCH_384_RATE) { + esch_384_m4(st->s.state, st->s.block, 0x02); + } else { + unsigned temp = st->s.count; + ((unsigned char *)(st->s.block))[temp] = 0x80; + memset(((unsigned char *)(st->s.block)) + temp + 1, 0, + ESCH_384_RATE - temp - 1); + esch_384_m4(st->s.state, st->s.block, 0x01); + } + sparkle_512(st->s.state, 12); + + /* Generate the final hash value */ + memcpy(out, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE, st->s.state, ESCH_384_RATE); + sparkle_512(st->s.state, 8); + memcpy(out + ESCH_384_RATE * 2, st->s.state, ESCH_384_RATE); +} diff --git a/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.h b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.h new file mode 100644 index 0000000..dd0999e --- /dev/null +++ b/sparkle/Implementations/crypto_hash/esch384v1/rhys-avr/sparkle.h @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPARKLE_H +#define LWCRYPTO_SPARKLE_H + +#include "aead-common.h" + +/** + * \file sparkle.h + * \brief Encryption and hash algorithms based on the SPARKLE permutation. + * + * SPARKLE is a family of encryption and hash algorithms that are based + * around the SPARKLE permutation. There are three versions of the + * permutation with 256-bit, 384-bit, and 512-bit state sizes. + * The algorithms in the family are: + * + * \li Schwaemm256-128 with a 128-bit key, a 256-bit nonce, and a 128-bit tag. + * This is the primary encryption algorithm in the family. + * \li Schwaemm192-192 with a 192-bit key, a 192-bit nonce, and a 192-bit tag. + * \li Schwaemm128-128 with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * \li Schwaemm256-256 with a 256-bit key, a 256-bit nonce, and a 256-bit tag. + * \li Esch256 hash algorithm with a 256-bit digest output. This is the + * primary hash algorithm in the family. + * \li Esch384 hash algorithm with a 384-bit digest output. + * + * References: https://www.cryptolux.org/index.php/Sparkle + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm256-128. + */ +#define SCHWAEMM_256_128_NONCE_SIZE 32 + +/** + * \brief Size of the key for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_KEY_SIZE 24 + +/** + * \brief Size of the authentication tag for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_TAG_SIZE 24 + +/** + * \brief Size of the nonce for Schwaemm192-192. + */ +#define SCHWAEMM_192_192_NONCE_SIZE 24 + +/** + * \brief Size of the key for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Schwaemm128-128. + */ +#define SCHWAEMM_128_128_NONCE_SIZE 16 + +/** + * \brief Size of the key for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_TAG_SIZE 32 + +/** + * \brief Size of the nonce for Schwaemm256-256. + */ +#define SCHWAEMM_256_256_NONCE_SIZE 32 + +/** + * \brief Size of the hash output for Esch256. + */ +#define ESCH_256_HASH_SIZE 32 + +/** + * \brief Size of the hash output for Esch384. + */ +#define ESCH_384_HASH_SIZE 48 + +/** + * \brief Meta-information block for the Schwaemm256-128 cipher. + */ +extern aead_cipher_t const schwaemm_256_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm192-192 cipher. + */ +extern aead_cipher_t const schwaemm_192_192_cipher; + +/** + * \brief Meta-information block for the Schwaemm128-128 cipher. + */ +extern aead_cipher_t const schwaemm_128_128_cipher; + +/** + * \brief Meta-information block for the Schwaemm256-256 cipher. + */ +extern aead_cipher_t const schwaemm_256_256_cipher; + +/** + * \brief Meta-information block for the Esch256 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_256_hash_algorithm; + +/** + * \brief Meta-information block for the Esch384 hash algorithm. + */ +extern aead_hash_algorithm_t const esch_384_hash_algorithm; + +/** + * \brief State information for the Esch256 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_256_hash_state_t; + +/** + * \brief State information for the Esch384 incremental hash mode. + */ +typedef union +{ + struct { + unsigned char state[64]; /**< Current hash state */ + unsigned char block[16]; /**< Partial input data block */ + unsigned char count; /**< Number of bytes in the current block */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} esch_384_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_128_aead_decrypt() + */ +int schwaemm_256_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 32 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_128_aead_encrypt() + */ +int schwaemm_256_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm192-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 24 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_192_192_aead_decrypt() + */ +int schwaemm_192_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm192-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 24 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 24 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_192_192_aead_encrypt() + */ +int schwaemm_192_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm128-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_128_128_aead_decrypt() + */ +int schwaemm_128_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm128-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_128_128_aead_encrypt() + */ +int schwaemm_128_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Schwaemm256-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa schwaemm_256_256_aead_decrypt() + */ +int schwaemm_256_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Schwaemm256-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa schwaemm_256_256_aead_encrypt() + */ +int schwaemm_256_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Esch256 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_256_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_256_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch256 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_256_hash_update(), esch_256_hash_finalize(), esch_256_hash() + */ +void esch_256_hash_init(esch_256_hash_state_t *state); + +/** + * \brief Updates an Esch256 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_256_hash_init(), esch_256_hash_finalize() + */ +void esch_256_hash_update + (esch_256_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch256 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa esch_256_hash_init(), esch_256_hash_update() + */ +void esch_256_hash_finalize + (esch_256_hash_state_t *state, unsigned char *out); + +/** + * \brief Hashes a block of input data with Esch384 to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * ESCH_384_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int esch_384_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for an Esch384 hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa esch_384_hash_update(), esch_384_hash_finalize(), esch_384_hash() + */ +void esch_384_hash_init(esch_384_hash_state_t *state); + +/** + * \brief Updates an Esch384 state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa esch_384_hash_init(), esch_384_hash_finalize() + */ +void esch_384_hash_update + (esch_384_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from an Esch384 hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 48-byte hash value. + * + * \sa esch_384_hash_init(), esch_384_hash_update() + */ +void esch_384_hash_finalize + (esch_384_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.c b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.h b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/api.h b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/encrypt.c b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..facb770 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spix.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spix_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spix_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-256-spix-avr.S b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-256-spix-avr.S new file mode 100644 index 0000000..f8cadd9 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-256-spix-avr.S @@ -0,0 +1,1129 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 72 +table_0: + .byte 15 + .byte 71 + .byte 8 + .byte 100 + .byte 4 + .byte 178 + .byte 134 + .byte 107 + .byte 67 + .byte 181 + .byte 226 + .byte 111 + .byte 241 + .byte 55 + .byte 137 + .byte 44 + .byte 68 + .byte 150 + .byte 230 + .byte 221 + .byte 115 + .byte 238 + .byte 202 + .byte 153 + .byte 229 + .byte 76 + .byte 23 + .byte 234 + .byte 11 + .byte 245 + .byte 142 + .byte 15 + .byte 71 + .byte 7 + .byte 100 + .byte 4 + .byte 178 + .byte 130 + .byte 107 + .byte 67 + .byte 181 + .byte 161 + .byte 111 + .byte 241 + .byte 55 + .byte 120 + .byte 44 + .byte 68 + .byte 150 + .byte 162 + .byte 221 + .byte 115 + .byte 238 + .byte 185 + .byte 153 + .byte 229 + .byte 76 + .byte 242 + .byte 234 + .byte 11 + .byte 245 + .byte 133 + .byte 15 + .byte 71 + .byte 7 + .byte 35 + .byte 4 + .byte 178 + .byte 130 + .byte 217 + .byte 67 + .byte 181 + + .text +.global sliscp_light256_permute_spix + .type sliscp_light256_permute_spix, @function +sliscp_light256_permute_spix: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 32 + ld r21,Z + ldd r20,Z+1 + ldd r19,Z+2 + ldd r18,Z+3 + ldd r3,Z+4 + ldd r2,Z+5 + ldd r27,Z+6 + ldd r26,Z+7 + ldd r7,Z+16 + ldd r6,Z+17 + ldd r5,Z+18 + ldd r4,Z+19 + ldd r11,Z+20 + ldd r10,Z+21 + ldd r9,Z+22 + ldd r8,Z+23 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r26 + std Y+6,r27 + std Y+7,r2 + std Y+8,r3 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + ldd r21,Z+8 + ldd r20,Z+9 + ldd r19,Z+10 + ldd r18,Z+11 + ldd r3,Z+24 + ldd r2,Z+25 + ldd r27,Z+26 + ldd r26,Z+27 + ldd r7,Z+12 + ldd r6,Z+13 + ldd r5,Z+14 + ldd r4,Z+15 + ldd r11,Z+28 + ldd r10,Z+29 + ldd r9,Z+30 + ldd r8,Z+31 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r23,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r23 +#endif + mov r30,r1 +52: +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + com r27 + com r2 + com r3 + ldi r24,255 + lsr r23 + rol r24 + eor r26,r24 + movw r12,r26 + movw r14,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r26 + and r13,r27 + and r14,r2 + and r15,r3 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r23 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + com r27 + com r2 + com r3 + ldi r24,255 + lsr r23 + rol r24 + eor r26,r24 + movw r12,r26 + movw r14,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r26 + and r13,r27 + and r14,r2 + and r15,r3 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r23 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + com r27 + com r2 + com r3 + ldi r24,255 + lsr r23 + rol r24 + eor r26,r24 + movw r12,r26 + movw r14,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r26 + and r13,r27 + and r14,r2 + and r15,r3 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r23 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r26,r12 + eor r27,r13 + eor r2,r14 + eor r3,r15 + com r27 + com r2 + com r3 + ldi r24,255 + lsr r23 + rol r24 + eor r26,r24 + movw r12,r26 + movw r14,r2 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r26 + and r13,r27 + and r14,r2 + and r15,r3 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r23 + rol r24 + eor r18,r24 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + inc r30 + movw r12,r4 + movw r14,r6 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r4 + and r13,r5 + and r14,r6 + and r15,r7 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + com r9 + com r10 + com r11 + ldi r24,255 + lsr r23 + rol r24 + eor r8,r24 + movw r12,r8 + movw r14,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r8 + and r13,r9 + and r14,r10 + and r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r5 + com r6 + com r7 + ldi r24,255 + lsr r23 + rol r24 + eor r4,r24 + movw r12,r4 + movw r14,r6 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r4 + and r13,r5 + and r14,r6 + and r15,r7 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + com r9 + com r10 + com r11 + ldi r24,255 + lsr r23 + rol r24 + eor r8,r24 + movw r12,r8 + movw r14,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r8 + and r13,r9 + and r14,r10 + and r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r5 + com r6 + com r7 + ldi r24,255 + lsr r23 + rol r24 + eor r4,r24 + movw r12,r4 + movw r14,r6 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r4 + and r13,r5 + and r14,r6 + and r15,r7 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + com r9 + com r10 + com r11 + ldi r24,255 + lsr r23 + rol r24 + eor r8,r24 + movw r12,r8 + movw r14,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r8 + and r13,r9 + and r14,r10 + and r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r5 + com r6 + com r7 + ldi r24,255 + lsr r23 + rol r24 + eor r4,r24 + movw r12,r4 + movw r14,r6 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r4 + and r13,r5 + and r14,r6 + and r15,r7 + eor r8,r12 + eor r9,r13 + eor r10,r14 + eor r11,r15 + com r9 + com r10 + com r11 + ldi r24,255 + lsr r23 + rol r24 + eor r8,r24 + movw r12,r8 + movw r14,r10 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r8 + and r13,r9 + and r14,r10 + and r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r5 + com r6 + com r7 + ldi r24,255 + lsr r23 + rol r24 + eor r4,r24 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + com r12 + com r13 + com r14 + com r15 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + com r18 + com r19 + com r20 + com r21 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + std Y+9,r4 + std Y+10,r5 + std Y+11,r6 + std Y+12,r7 + movw r4,r12 + movw r6,r14 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + com r13 + com r14 + com r15 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r12,r23 + inc r30 + eor r12,r26 + eor r13,r27 + eor r14,r2 + eor r15,r3 + std Y+5,r26 + std Y+6,r27 + std Y+7,r2 + std Y+8,r3 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r2,Y+15 + ldd r3,Y+16 + com r27 + com r2 + com r3 +#if defined(RAMPZ) + elpm r23,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r23,Z +#elif defined(__AVR_TINY__) + ld r23,Z +#else + lpm + mov r23,r0 +#endif + eor r26,r23 + inc r30 + eor r26,r8 + eor r27,r9 + eor r2,r10 + eor r3,r11 + std Y+13,r8 + std Y+14,r9 + std Y+15,r10 + std Y+16,r11 + movw r8,r12 + movw r10,r14 + dec r22 + breq 5866f + rjmp 52b +5866: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + std Z+8,r21 + std Z+9,r20 + std Z+10,r19 + std Z+11,r18 + std Z+24,r3 + std Z+25,r2 + std Z+26,r27 + std Z+27,r26 + std Z+12,r7 + std Z+13,r6 + std Z+14,r5 + std Z+15,r4 + std Z+28,r11 + std Z+29,r10 + std Z+30,r9 + std Z+31,r8 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r2,Y+7 + ldd r3,Y+8 + ldd r4,Y+9 + ldd r5,Y+10 + ldd r6,Y+11 + ldd r7,Y+12 + ldd r8,Y+13 + ldd r9,Y+14 + ldd r10,Y+15 + ldd r11,Y+16 + st Z,r21 + std Z+1,r20 + std Z+2,r19 + std Z+3,r18 + std Z+4,r3 + std Z+5,r2 + std Z+6,r27 + std Z+7,r26 + std Z+16,r7 + std Z+17,r6 + std Z+18,r5 + std Z+19,r4 + std Z+20,r11 + std Z+21,r10 + std Z+22,r9 + std Z+23,r8 + adiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sliscp_light256_permute_spix, .-sliscp_light256_permute_spix + + .text +.global sliscp_light256_swap_spix + .type sliscp_light256_swap_spix, @function +sliscp_light256_swap_spix: + movw r30,r24 +.L__stack_usage = 2 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r26,Z+26 + ldd r27,Z+27 + std Z+24,r18 + std Z+25,r19 + std Z+26,r20 + std Z+27,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ret + .size sliscp_light256_swap_spix, .-sliscp_light256_swap_spix + +#endif diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.c b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.c new file mode 100644 index 0000000..dd3a688 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sliscp-light.h" + +#if !defined(__AVR__) + +/** + * \brief Performs one round of the Simeck-64 block cipher. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + */ +#define simeck64_round(x, y) \ + do { \ + (y) ^= (leftRotate5((x)) & (x)) ^ leftRotate1((x)) ^ \ + 0xFFFFFFFEU ^ (_rc & 1); \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with the 8 round version of Simeck-64. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck64_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck64_round(x, y); /* Round 1 */ \ + simeck64_round(y, x); /* Round 2 */ \ + simeck64_round(x, y); /* Round 3 */ \ + simeck64_round(y, x); /* Round 4 */ \ + simeck64_round(x, y); /* Round 5 */ \ + simeck64_round(y, x); /* Round 6 */ \ + simeck64_round(x, y); /* Round 7 */ \ + simeck64_round(y, x); /* Round 8 */ \ + } while (0) + +/* Helper macros for 48-bit left rotations */ +#define leftRotate5_48(x) (((x) << 5) | ((x) >> 19)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 23)) + +/** + * \brief Performs one round of the Simeck-48 block cipher. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + */ +#define simeck48_round(x, y) \ + do { \ + (y) ^= (leftRotate5_48((x)) & (x)) ^ leftRotate1_48((x)) ^ \ + 0x00FFFFFEU ^ (_rc & 1); \ + (y) &= 0x00FFFFFFU; \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 48-bit block with the 6 round version of Simeck-48. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck48_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck48_round(x, y); /* Round 1 */ \ + simeck48_round(y, x); /* Round 2 */ \ + simeck48_round(x, y); /* Round 3 */ \ + simeck48_round(y, x); /* Round 4 */ \ + simeck48_round(x, y); /* Round 5 */ \ + simeck48_round(y, x); /* Round 6 */ \ + } while (0) + +/* Interleaved rc0, rc1, sc0, and sc1 values for each round */ +static unsigned char const sliscp_light256_RC[18 * 4] = { + 0x0f, 0x47, 0x08, 0x64, 0x04, 0xb2, 0x86, 0x6b, + 0x43, 0xb5, 0xe2, 0x6f, 0xf1, 0x37, 0x89, 0x2c, + 0x44, 0x96, 0xe6, 0xdd, 0x73, 0xee, 0xca, 0x99, + 0xe5, 0x4c, 0x17, 0xea, 0x0b, 0xf5, 0x8e, 0x0f, + 0x47, 0x07, 0x64, 0x04, 0xb2, 0x82, 0x6b, 0x43, + 0xb5, 0xa1, 0x6f, 0xf1, 0x37, 0x78, 0x2c, 0x44, + 0x96, 0xa2, 0xdd, 0x73, 0xee, 0xb9, 0x99, 0xe5, + 0x4c, 0xf2, 0xea, 0x0b, 0xf5, 0x85, 0x0f, 0x47, + 0x07, 0x23, 0x04, 0xb2, 0x82, 0xd9, 0x43, 0xb5 +}; + +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 24); /* Assumes the block is pre-swapped */ + x4 = be_load_word32(block + 16); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 12); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 8, x2); + be_store_word32(block + 24, x3); /* Assumes the block is pre-swapped */ + be_store_word32(block + 16, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 12, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spix(unsigned char block[32]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 12); + t2 = le_load_word32(block + 24); + le_store_word32(block + 24, t1); + le_store_word32(block + 12, t2); +} + +void sliscp_light256_permute_spoc(unsigned char block[32]) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x3 = be_load_word32(block + 20); + x4 = be_load_word32(block + 8); + x5 = be_load_word32(block + 12); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 16, x2); /* Assumes the block is pre-swapped */ + be_store_word32(block + 20, x3); + be_store_word32(block + 8, x4); + be_store_word32(block + 12, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spoc(unsigned char block[32]) +{ + uint64_t t1, t2; + t1 = le_load_word64(block + 8); + t2 = le_load_word64(block + 16); + le_store_word64(block + 16, t1); + le_store_word64(block + 8, t2); +} + +/* Load a big-endian 24-bit word from a byte buffer */ +#define be_load_word24(ptr) \ + ((((uint32_t)((ptr)[0])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[2]))) + +/* Store a big-endian 24-bit word into a byte buffer */ +#define be_store_word24(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 16); \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)_x; \ + } while (0) + +void sliscp_light192_permute(unsigned char block[24]) +{ + /* Interleaved rc0, rc1, sc0, and sc1 values for each round */ + static unsigned char const RC[18 * 4] = { + 0x07, 0x27, 0x08, 0x29, 0x04, 0x34, 0x0c, 0x1d, + 0x06, 0x2e, 0x0a, 0x33, 0x25, 0x19, 0x2f, 0x2a, + 0x17, 0x35, 0x38, 0x1f, 0x1c, 0x0f, 0x24, 0x10, + 0x12, 0x08, 0x36, 0x18, 0x3b, 0x0c, 0x0d, 0x14, + 0x26, 0x0a, 0x2b, 0x1e, 0x15, 0x2f, 0x3e, 0x31, + 0x3f, 0x38, 0x01, 0x09, 0x20, 0x24, 0x21, 0x2d, + 0x30, 0x36, 0x11, 0x1b, 0x28, 0x0d, 0x39, 0x16, + 0x3c, 0x2b, 0x05, 0x3d, 0x22, 0x3e, 0x27, 0x03, + 0x13, 0x01, 0x34, 0x02, 0x1a, 0x21, 0x2e, 0x23 + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables. Each 24-bit block is + * placed into a separate 32-bit word which improves efficiency below */ + x0 = be_load_word24(block); + x1 = be_load_word24(block + 3); + x2 = be_load_word24(block + 6); + x3 = be_load_word24(block + 9); + x4 = be_load_word24(block + 12); + x5 = be_load_word24(block + 15); + x6 = be_load_word24(block + 18); + x7 = be_load_word24(block + 21); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-48 to two of the 48-bit sub-blocks */ + simeck48_box(x2, x3, rc[0]); + simeck48_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0x00FFFFFFU; + x1 ^= 0x00FFFF00U ^ rc[2]; + x4 ^= 0x00FFFFFFU; + x5 ^= 0x00FFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word24(block, x0); + be_store_word24(block + 3, x1); + be_store_word24(block + 6, x2); + be_store_word24(block + 9, x3); + be_store_word24(block + 12, x4); + be_store_word24(block + 15, x5); + be_store_word24(block + 18, x6); + be_store_word24(block + 21, x7); +} + +void sliscp_light320_permute(unsigned char block[40]) +{ + /* Interleaved rc0, rc1, rc2, sc0, sc1, and sc2 values for each round */ + static unsigned char const RC[16 * 6] = { + 0x07, 0x53, 0x43, 0x50, 0x28, 0x14, 0x0a, 0x5d, + 0xe4, 0x5c, 0xae, 0x57, 0x9b, 0x49, 0x5e, 0x91, + 0x48, 0x24, 0xe0, 0x7f, 0xcc, 0x8d, 0xc6, 0x63, + 0xd1, 0xbe, 0x32, 0x53, 0xa9, 0x54, 0x1a, 0x1d, + 0x4e, 0x60, 0x30, 0x18, 0x22, 0x28, 0x75, 0x68, + 0x34, 0x9a, 0xf7, 0x6c, 0x25, 0xe1, 0x70, 0x38, + 0x62, 0x82, 0xfd, 0xf6, 0x7b, 0xbd, 0x96, 0x47, + 0xf9, 0x9d, 0xce, 0x67, 0x71, 0x6b, 0x76, 0x40, + 0x20, 0x10, 0xaa, 0x88, 0xa0, 0x4f, 0x27, 0x13, + 0x2b, 0xdc, 0xb0, 0xbe, 0x5f, 0x2f, 0xe9, 0x8b, + 0x09, 0x5b, 0xad, 0xd6, 0xcf, 0x59, 0x1e, 0xe9, + 0x74, 0xba, 0xb7, 0xc6, 0xad, 0x7f, 0x3f, 0x1f + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 12); + x4 = be_load_word32(block + 4); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + x8 = be_load_word32(block + 32); + x9 = be_load_word32(block + 36); + + /* Perform all permutation rounds */ + for (round = 0; round < 16; ++round, rc += 6) { + /* Apply Simeck-64 to three of the 64-bit sub-blocks */ + simeck64_box(x0, x1, rc[0]); + simeck64_box(x4, x5, rc[1]); + simeck64_box(x8, x9, rc[2]); + x6 ^= x8; + x7 ^= x9; + x2 ^= x4; + x3 ^= x5; + x8 ^= x0; + x9 ^= x1; + + /* Add step constants */ + x2 ^= 0xFFFFFFFFU; + x3 ^= 0xFFFFFF00U ^ rc[3]; + x6 ^= 0xFFFFFFFFU; + x7 ^= 0xFFFFFF00U ^ rc[4]; + x8 ^= 0xFFFFFFFFU; + x9 ^= 0xFFFFFF00U ^ rc[5]; + + /* Rotate the sub-blocks */ + t0 = x8; + t1 = x9; + x8 = x2; + x9 = x3; + x2 = x4; + x3 = x5; + x4 = x0; + x5 = x1; + x0 = x6; + x1 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 16, x1); /* Assumes the block is pre-swapped */ + be_store_word32(block + 8, x2); + be_store_word32(block + 12, x3); + be_store_word32(block + 4, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); + be_store_word32(block + 32, x8); + be_store_word32(block + 36, x9); +} + +void sliscp_light320_swap(unsigned char block[40]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 4); + t2 = le_load_word32(block + 16); + le_store_word32(block + 16, t1); + le_store_word32(block + 4, t2); +} + +#endif /* !__AVR__ */ diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.h b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.h new file mode 100644 index 0000000..8a5e8d5 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-sliscp-light.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SLISCP_LIGHT_H +#define LW_INTERNAL_SLISCP_LIGHT_H + +/** + * \file internal-sliscp-light.h + * \brief sLiSCP-light permutation + * + * There are three variants of sLiSCP-light in use in the NIST submissions: + * + * \li sLiSCP-light-256 with a 256-bit block size, used in SPIX and SpoC. + * \li sLiSCP-light-192 with a 192-bit block size, used in SpoC. + * \li sLiSCP-light-320 with a 320-bit block size, used in ACE. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace, + * https://uwaterloo.ca/communications-security-lab/lwc/spix, + * https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for sLiSCP-light-256. + */ +#define SLISCP_LIGHT256_STATE_SIZE 32 + +/** + * \brief Size of the state for sLiSCP-light-192. + */ +#define SLISCP_LIGHT192_STATE_SIZE 24 + +/** + * \brief Size of the state for sLiSCP-light-320. + */ +#define SLISCP_LIGHT320_STATE_SIZE 40 + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * \param rounds Number of rounds to be performed, usually 9 or 18. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SPIX cipher. SPIX places the rate bytes at + * positions 8, 9, 10, 11, 24, 25, 26, and 27. + * + * This function assumes that bytes 24-27 have been pre-swapped with + * bytes 12-15 so that the rate portion of the state is contiguous. + * + * The sliscp_light256_swap_spix() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spix() + */ +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SPIX. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spix() + */ +void sliscp_light256_swap_spix(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SpoC-128 cipher. SpoC-128 interleaves the + * rate bytes and the mask bytes. This version assumes that the + * rate and mask are in contiguous bytes of the state. + * + * SpoC-128 absorbs bytes using the mask bytes of the state at offsets + * 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, and 31. + * It squeezes bytes using the rate bytes of the state at offsets + * 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, and 23. + * + * This function assumes that bytes 8-15 have been pre-swapped with 16-23 + * so that the rate and mask portions of the state are contiguous. + * + * The sliscp_light256_swap_spoc() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spoc() + */ +void sliscp_light256_permute_spoc(unsigned char block[32]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SpoC-128. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spoc() + */ +void sliscp_light256_swap_spoc(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 192-bit block. + * + * \param block Points to the block to be permuted. + */ +void sliscp_light192_permute(unsigned char block[24]); + +/** + * \brief Performs the sLiSCP-light permutation on a 320-bit block. + * + * \param block Points to the block to be permuted. + * + * The ACE specification refers to this permutation as "ACE" but that + * can be confused with the name of the AEAD mode so we call this + * permutation "sLiSCP-light-320" instead. + * + * ACE absorbs and squeezes data at the rate bytes 0, 1, 2, 3, 16, 17, 18, 19. + * Efficiency can suffer because of the discontinuity in rate byte positions. + * + * To counteract this, we assume that the input to the permutation has been + * pre-swapped: bytes 4, 5, 6, 7 are swapped with bytes 16, 17, 18, 19 so + * that the rate is contiguous at the start of the state. + * + * The sliscp_light320_swap() function can be used to switch between the + * canonical order and the pre-swapped order. + * + * \sa sliscp_light320_swap() + */ +void sliscp_light320_permute(unsigned char block[40]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 320-bit block. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light320_permute() + */ +void sliscp_light320_swap(unsigned char block[40]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-util.h b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.c b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.c new file mode 100644 index 0000000..7fc8f6a --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.c @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spix.h" +#include "internal-sliscp-light.h" +#include "internal-util.h" +#include + +/** + * \brief Size of the state for the internal sLiSCP-light permutation. + */ +#define SPIX_STATE_SIZE SLISCP_LIGHT256_STATE_SIZE + +/** + * \brief Rate for absorbing data into the sLiSCP-light state and for + * squeezing data out again. + */ +#define SPIX_RATE 8 + +aead_cipher_t const spix_cipher = { + "SPIX", + SPIX_KEY_SIZE, + SPIX_NONCE_SIZE, + SPIX_TAG_SIZE, + AEAD_FLAG_NONE, + spix_aead_encrypt, + spix_aead_decrypt +}; + +/* Indices of where a rate byte is located in the state. We don't + * need this array any more because sliscp_light256_permute_spix() + * operates on byte-swapped states where the rate bytes are contiguous + * in the bytes 8 to 15 */ +/* +static unsigned char const spix_rate_posn[8] = { + 8, 9, 10, 11, 24, 25, 26, 27 +}; +*/ + +/** + * \brief Initializes the SPIX state. + * + * \param state sLiSCP-light-256 permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void spix_init + (unsigned char state[SPIX_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by interleaving the key and nonce */ + memcpy(state, npub, 8); + memcpy(state + 8, k, 8); + memcpy(state + 16, npub + 8, 8); + memcpy(state + 24, k + 8, 8); + sliscp_light256_swap_spix(state); + + /* Run the permutation to scramble the initial state */ + sliscp_light256_permute_spix(state, 18); + + /* Absorb the key in two further permutation operations */ + lw_xor_block(state + 8, k, 8); + sliscp_light256_permute_spix(state, 18); + lw_xor_block(state + 8, k + 8, 8); + sliscp_light256_permute_spix(state, 18); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= SPIX_RATE) { + lw_xor_block(state + 8, ad, SPIX_RATE); + state[SPIX_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + ad += SPIX_RATE; + adlen -= SPIX_RATE; + } + temp = (unsigned)adlen; + lw_xor_block(state + 8, ad, temp); + state[temp + 8] ^= 0x80; /* padding */ + state[SPIX_STATE_SIZE - 1] ^= 0x01; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + } +} + +/** + * \brief Finalizes the SPIX encryption or decryption operation. + * + * \param state sLiSCP-light-256 permutation state. + * \param k Points to the 128-bit key. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void spix_finalize + (unsigned char state[SPIX_STATE_SIZE], const unsigned char *k, + unsigned char *tag) +{ + /* Absorb the key into the state again */ + lw_xor_block(state + 8, k, 8); + sliscp_light256_permute_spix(state, 18); + lw_xor_block(state + 8, k + 8, 8); + sliscp_light256_permute_spix(state, 18); + + /* Copy out the authentication tag */ + sliscp_light256_swap_spix(state); + memcpy(tag, state + 8, 8); + memcpy(tag + 8, state + 24, 8); +} + +int spix_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPIX_STATE_SIZE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPIX_TAG_SIZE; + + /* Initialize the SPIX state and absorb the associated data */ + spix_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= SPIX_RATE) { + lw_xor_block_2_dest(c, state + 8, m, SPIX_RATE); + state[SPIX_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + c += SPIX_RATE; + m += SPIX_RATE; + mlen -= SPIX_RATE; + } + temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state + 8, m, temp); + state[temp + 8] ^= 0x80; /* padding */ + state[SPIX_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + c += mlen; + + /* Generate the authentication tag */ + spix_finalize(state, k, c); + return 0; +} + +int spix_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPIX_STATE_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPIX_TAG_SIZE) + return -1; + *mlen = clen - SPIX_TAG_SIZE; + + /* Initialize the SPIX state and absorb the associated data */ + spix_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPIX_TAG_SIZE; + while (clen >= SPIX_RATE) { + lw_xor_block_swap(m, state + 8, c, SPIX_RATE); + state[SPIX_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + c += SPIX_RATE; + m += SPIX_RATE; + clen -= SPIX_RATE; + } + temp = (unsigned)clen; + lw_xor_block_swap(m, state + 8, c, temp); + state[temp + 8] ^= 0x80; /* padding */ + state[SPIX_STATE_SIZE - 1] ^= 0x02; /* domain separation */ + sliscp_light256_permute_spix(state, 9); + c += clen; + + /* Finalize the SPIX state and compare against the authentication tag */ + spix_finalize(state, k, state); + return aead_check_tag(mtemp, *mlen, state, c, SPIX_TAG_SIZE); +} diff --git a/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.h b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.h new file mode 100644 index 0000000..844c514 --- /dev/null +++ b/spix/Implementations/crypto_aead/spix128v1/rhys-avr/spix.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPIX_H +#define LWCRYPTO_SPIX_H + +#include "aead-common.h" + +/** + * \file spix.h + * \brief SPIX authenticated encryption algorithm. + * + * SPIX is an authenticated encryption algorithm with a 128-bit key, + * a 128-bit nonce, and a 128-bit tag. It uses the MonkeyDuplex + * construction on top of the 256-bit sLiSCP-light permutation. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/spix + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for SPIX. + */ +#define SPIX_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SPIX. + */ +#define SPIX_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SPIX. + */ +#define SPIX_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SPIX cipher. + */ +extern aead_cipher_t const spix_cipher; + +/** + * \brief Encrypts and authenticates a packet with SPIX. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spix_aead_decrypt() + */ +int spix_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SPIX. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spix_aead_encrypt() + */ +int spix_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.c b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.h b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/api.h b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/encrypt.c b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..6856b6f --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spoc.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spoc_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spoc_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-192-avr.S b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-192-avr.S new file mode 100644 index 0000000..5860b14 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-192-avr.S @@ -0,0 +1,794 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 72 +table_0: + .byte 7 + .byte 39 + .byte 8 + .byte 41 + .byte 4 + .byte 52 + .byte 12 + .byte 29 + .byte 6 + .byte 46 + .byte 10 + .byte 51 + .byte 37 + .byte 25 + .byte 47 + .byte 42 + .byte 23 + .byte 53 + .byte 56 + .byte 31 + .byte 28 + .byte 15 + .byte 36 + .byte 16 + .byte 18 + .byte 8 + .byte 54 + .byte 24 + .byte 59 + .byte 12 + .byte 13 + .byte 20 + .byte 38 + .byte 10 + .byte 43 + .byte 30 + .byte 21 + .byte 47 + .byte 62 + .byte 49 + .byte 63 + .byte 56 + .byte 1 + .byte 9 + .byte 32 + .byte 36 + .byte 33 + .byte 45 + .byte 48 + .byte 54 + .byte 17 + .byte 27 + .byte 40 + .byte 13 + .byte 57 + .byte 22 + .byte 60 + .byte 43 + .byte 5 + .byte 61 + .byte 34 + .byte 62 + .byte 39 + .byte 3 + .byte 19 + .byte 1 + .byte 52 + .byte 2 + .byte 26 + .byte 33 + .byte 46 + .byte 35 + + .text +.global sliscp_light192_permute + .type sliscp_light192_permute, @function +sliscp_light192_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r20,Z + ldd r19,Z+1 + ldd r18,Z+2 + ldd r21,Z+3 + ldd r23,Z+4 + ldd r22,Z+5 + ldd r28,Z+6 + ldd r27,Z+7 + ldd r26,Z+8 + ldd r29,Z+9 + ldd r3,Z+10 + ldd r2,Z+11 + ldd r6,Z+12 + ldd r5,Z+13 + ldd r4,Z+14 + ldd r7,Z+15 + ldd r9,Z+16 + ldd r8,Z+17 + ldd r12,Z+18 + ldd r11,Z+19 + ldd r10,Z+20 + ldd r13,Z+21 + ldd r15,Z+22 + ldd r14,Z+23 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r24,0 +28: + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + inc r24 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + inc r24 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + com r18 + com r19 + com r20 + com r23 + com r21 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + eor r22,r25 + inc r24 + com r4 + com r5 + com r6 + com r9 + com r7 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + eor r8,r25 + inc r24 + movw r16,r18 + mov r1,r20 + eor r16,r26 + eor r17,r27 + eor r1,r28 + movw r18,r26 + mov r20,r28 + movw r26,r4 + mov r28,r6 + eor r26,r10 + eor r27,r11 + eor r28,r12 + movw r4,r10 + mov r6,r12 + movw r10,r16 + mov r12,r1 + movw r16,r22 + mov r1,r21 + eor r16,r2 + eor r17,r3 + eor r1,r29 + movw r22,r2 + mov r21,r29 + movw r2,r8 + mov r29,r7 + eor r2,r14 + eor r3,r15 + eor r29,r13 + movw r8,r14 + mov r7,r13 + movw r14,r16 + mov r13,r1 + ldi r17,72 + cpse r24,r17 + rjmp 28b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r20 + std Z+1,r19 + std Z+2,r18 + std Z+3,r21 + std Z+4,r23 + std Z+5,r22 + std Z+6,r28 + std Z+7,r27 + std Z+8,r26 + std Z+9,r29 + std Z+10,r3 + std Z+11,r2 + std Z+12,r6 + std Z+13,r5 + std Z+14,r4 + std Z+15,r7 + std Z+16,r9 + std Z+17,r8 + std Z+18,r12 + std Z+19,r11 + std Z+20,r10 + std Z+21,r13 + std Z+22,r15 + std Z+23,r14 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + eor r1,r1 + ret + .size sliscp_light192_permute, .-sliscp_light192_permute + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-256-spoc-avr.S b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-256-spoc-avr.S new file mode 100644 index 0000000..84925b4 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-256-spoc-avr.S @@ -0,0 +1,1142 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 72 +table_0: + .byte 15 + .byte 71 + .byte 8 + .byte 100 + .byte 4 + .byte 178 + .byte 134 + .byte 107 + .byte 67 + .byte 181 + .byte 226 + .byte 111 + .byte 241 + .byte 55 + .byte 137 + .byte 44 + .byte 68 + .byte 150 + .byte 230 + .byte 221 + .byte 115 + .byte 238 + .byte 202 + .byte 153 + .byte 229 + .byte 76 + .byte 23 + .byte 234 + .byte 11 + .byte 245 + .byte 142 + .byte 15 + .byte 71 + .byte 7 + .byte 100 + .byte 4 + .byte 178 + .byte 130 + .byte 107 + .byte 67 + .byte 181 + .byte 161 + .byte 111 + .byte 241 + .byte 55 + .byte 120 + .byte 44 + .byte 68 + .byte 150 + .byte 162 + .byte 221 + .byte 115 + .byte 238 + .byte 185 + .byte 153 + .byte 229 + .byte 76 + .byte 242 + .byte 234 + .byte 11 + .byte 245 + .byte 133 + .byte 15 + .byte 71 + .byte 7 + .byte 35 + .byte 4 + .byte 178 + .byte 130 + .byte 217 + .byte 67 + .byte 181 + + .text +.global sliscp_light256_permute_spoc + .type sliscp_light256_permute_spoc, @function +sliscp_light256_permute_spoc: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 31 + ld r21,Z + ldd r20,Z+1 + ldd r19,Z+2 + ldd r18,Z+3 + ldd r27,Z+4 + ldd r26,Z+5 + ldd r23,Z+6 + ldd r22,Z+7 + ldd r5,Z+8 + ldd r4,Z+9 + ldd r3,Z+10 + ldd r2,Z+11 + ldd r9,Z+12 + ldd r8,Z+13 + ldd r7,Z+14 + ldd r6,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r21,Z+16 + ldd r20,Z+17 + ldd r19,Z+18 + ldd r18,Z+19 + ldd r27,Z+20 + ldd r26,Z+21 + ldd r23,Z+22 + ldd r22,Z+23 + ldd r5,Z+24 + ldd r4,Z+25 + ldd r3,Z+26 + ldd r2,Z+27 + ldd r9,Z+28 + ldd r8,Z+29 + ldd r7,Z+30 + ldd r6,Z+31 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r1 +52: +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + inc r30 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + inc r30 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + com r12 + com r13 + com r14 + com r15 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + com r18 + com r19 + com r20 + com r21 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + movw r2,r12 + movw r4,r14 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + com r13 + com r14 + com r15 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + eor r12,r10 + inc r30 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + com r23 + com r26 + com r27 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + eor r22,r10 + inc r30 + eor r22,r6 + eor r23,r7 + eor r26,r8 + eor r27,r9 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + movw r6,r12 + movw r8,r14 + ldi r25,72 + cpse r30,r25 + rjmp 52b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + std Z+16,r21 + std Z+17,r20 + std Z+18,r19 + std Z+19,r18 + std Z+20,r27 + std Z+21,r26 + std Z+22,r23 + std Z+23,r22 + std Z+24,r5 + std Z+25,r4 + std Z+26,r3 + std Z+27,r2 + std Z+28,r9 + std Z+29,r8 + std Z+30,r7 + std Z+31,r6 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + ldd r2,Y+9 + ldd r3,Y+10 + ldd r4,Y+11 + ldd r5,Y+12 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + st Z,r21 + std Z+1,r20 + std Z+2,r19 + std Z+3,r18 + std Z+4,r27 + std Z+5,r26 + std Z+6,r23 + std Z+7,r22 + std Z+8,r5 + std Z+9,r4 + std Z+10,r3 + std Z+11,r2 + std Z+12,r9 + std Z+13,r8 + std Z+14,r7 + std Z+15,r6 + adiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r15 + pop r14 + pop r13 + pop r12 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sliscp_light256_permute_spoc, .-sliscp_light256_permute_spoc + + .text +.global sliscp_light256_swap_spoc + .type sliscp_light256_swap_spoc, @function +sliscp_light256_swap_spoc: + movw r30,r24 +.L__stack_usage = 2 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+8,r22 + std Z+9,r23 + std Z+10,r26 + std Z+11,r27 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ret + .size sliscp_light256_swap_spoc, .-sliscp_light256_swap_spoc + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.c b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.c new file mode 100644 index 0000000..dd3a688 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sliscp-light.h" + +#if !defined(__AVR__) + +/** + * \brief Performs one round of the Simeck-64 block cipher. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + */ +#define simeck64_round(x, y) \ + do { \ + (y) ^= (leftRotate5((x)) & (x)) ^ leftRotate1((x)) ^ \ + 0xFFFFFFFEU ^ (_rc & 1); \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with the 8 round version of Simeck-64. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck64_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck64_round(x, y); /* Round 1 */ \ + simeck64_round(y, x); /* Round 2 */ \ + simeck64_round(x, y); /* Round 3 */ \ + simeck64_round(y, x); /* Round 4 */ \ + simeck64_round(x, y); /* Round 5 */ \ + simeck64_round(y, x); /* Round 6 */ \ + simeck64_round(x, y); /* Round 7 */ \ + simeck64_round(y, x); /* Round 8 */ \ + } while (0) + +/* Helper macros for 48-bit left rotations */ +#define leftRotate5_48(x) (((x) << 5) | ((x) >> 19)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 23)) + +/** + * \brief Performs one round of the Simeck-48 block cipher. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + */ +#define simeck48_round(x, y) \ + do { \ + (y) ^= (leftRotate5_48((x)) & (x)) ^ leftRotate1_48((x)) ^ \ + 0x00FFFFFEU ^ (_rc & 1); \ + (y) &= 0x00FFFFFFU; \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 48-bit block with the 6 round version of Simeck-48. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck48_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck48_round(x, y); /* Round 1 */ \ + simeck48_round(y, x); /* Round 2 */ \ + simeck48_round(x, y); /* Round 3 */ \ + simeck48_round(y, x); /* Round 4 */ \ + simeck48_round(x, y); /* Round 5 */ \ + simeck48_round(y, x); /* Round 6 */ \ + } while (0) + +/* Interleaved rc0, rc1, sc0, and sc1 values for each round */ +static unsigned char const sliscp_light256_RC[18 * 4] = { + 0x0f, 0x47, 0x08, 0x64, 0x04, 0xb2, 0x86, 0x6b, + 0x43, 0xb5, 0xe2, 0x6f, 0xf1, 0x37, 0x89, 0x2c, + 0x44, 0x96, 0xe6, 0xdd, 0x73, 0xee, 0xca, 0x99, + 0xe5, 0x4c, 0x17, 0xea, 0x0b, 0xf5, 0x8e, 0x0f, + 0x47, 0x07, 0x64, 0x04, 0xb2, 0x82, 0x6b, 0x43, + 0xb5, 0xa1, 0x6f, 0xf1, 0x37, 0x78, 0x2c, 0x44, + 0x96, 0xa2, 0xdd, 0x73, 0xee, 0xb9, 0x99, 0xe5, + 0x4c, 0xf2, 0xea, 0x0b, 0xf5, 0x85, 0x0f, 0x47, + 0x07, 0x23, 0x04, 0xb2, 0x82, 0xd9, 0x43, 0xb5 +}; + +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 24); /* Assumes the block is pre-swapped */ + x4 = be_load_word32(block + 16); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 12); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 8, x2); + be_store_word32(block + 24, x3); /* Assumes the block is pre-swapped */ + be_store_word32(block + 16, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 12, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spix(unsigned char block[32]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 12); + t2 = le_load_word32(block + 24); + le_store_word32(block + 24, t1); + le_store_word32(block + 12, t2); +} + +void sliscp_light256_permute_spoc(unsigned char block[32]) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x3 = be_load_word32(block + 20); + x4 = be_load_word32(block + 8); + x5 = be_load_word32(block + 12); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 16, x2); /* Assumes the block is pre-swapped */ + be_store_word32(block + 20, x3); + be_store_word32(block + 8, x4); + be_store_word32(block + 12, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spoc(unsigned char block[32]) +{ + uint64_t t1, t2; + t1 = le_load_word64(block + 8); + t2 = le_load_word64(block + 16); + le_store_word64(block + 16, t1); + le_store_word64(block + 8, t2); +} + +/* Load a big-endian 24-bit word from a byte buffer */ +#define be_load_word24(ptr) \ + ((((uint32_t)((ptr)[0])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[2]))) + +/* Store a big-endian 24-bit word into a byte buffer */ +#define be_store_word24(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 16); \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)_x; \ + } while (0) + +void sliscp_light192_permute(unsigned char block[24]) +{ + /* Interleaved rc0, rc1, sc0, and sc1 values for each round */ + static unsigned char const RC[18 * 4] = { + 0x07, 0x27, 0x08, 0x29, 0x04, 0x34, 0x0c, 0x1d, + 0x06, 0x2e, 0x0a, 0x33, 0x25, 0x19, 0x2f, 0x2a, + 0x17, 0x35, 0x38, 0x1f, 0x1c, 0x0f, 0x24, 0x10, + 0x12, 0x08, 0x36, 0x18, 0x3b, 0x0c, 0x0d, 0x14, + 0x26, 0x0a, 0x2b, 0x1e, 0x15, 0x2f, 0x3e, 0x31, + 0x3f, 0x38, 0x01, 0x09, 0x20, 0x24, 0x21, 0x2d, + 0x30, 0x36, 0x11, 0x1b, 0x28, 0x0d, 0x39, 0x16, + 0x3c, 0x2b, 0x05, 0x3d, 0x22, 0x3e, 0x27, 0x03, + 0x13, 0x01, 0x34, 0x02, 0x1a, 0x21, 0x2e, 0x23 + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables. Each 24-bit block is + * placed into a separate 32-bit word which improves efficiency below */ + x0 = be_load_word24(block); + x1 = be_load_word24(block + 3); + x2 = be_load_word24(block + 6); + x3 = be_load_word24(block + 9); + x4 = be_load_word24(block + 12); + x5 = be_load_word24(block + 15); + x6 = be_load_word24(block + 18); + x7 = be_load_word24(block + 21); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-48 to two of the 48-bit sub-blocks */ + simeck48_box(x2, x3, rc[0]); + simeck48_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0x00FFFFFFU; + x1 ^= 0x00FFFF00U ^ rc[2]; + x4 ^= 0x00FFFFFFU; + x5 ^= 0x00FFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word24(block, x0); + be_store_word24(block + 3, x1); + be_store_word24(block + 6, x2); + be_store_word24(block + 9, x3); + be_store_word24(block + 12, x4); + be_store_word24(block + 15, x5); + be_store_word24(block + 18, x6); + be_store_word24(block + 21, x7); +} + +void sliscp_light320_permute(unsigned char block[40]) +{ + /* Interleaved rc0, rc1, rc2, sc0, sc1, and sc2 values for each round */ + static unsigned char const RC[16 * 6] = { + 0x07, 0x53, 0x43, 0x50, 0x28, 0x14, 0x0a, 0x5d, + 0xe4, 0x5c, 0xae, 0x57, 0x9b, 0x49, 0x5e, 0x91, + 0x48, 0x24, 0xe0, 0x7f, 0xcc, 0x8d, 0xc6, 0x63, + 0xd1, 0xbe, 0x32, 0x53, 0xa9, 0x54, 0x1a, 0x1d, + 0x4e, 0x60, 0x30, 0x18, 0x22, 0x28, 0x75, 0x68, + 0x34, 0x9a, 0xf7, 0x6c, 0x25, 0xe1, 0x70, 0x38, + 0x62, 0x82, 0xfd, 0xf6, 0x7b, 0xbd, 0x96, 0x47, + 0xf9, 0x9d, 0xce, 0x67, 0x71, 0x6b, 0x76, 0x40, + 0x20, 0x10, 0xaa, 0x88, 0xa0, 0x4f, 0x27, 0x13, + 0x2b, 0xdc, 0xb0, 0xbe, 0x5f, 0x2f, 0xe9, 0x8b, + 0x09, 0x5b, 0xad, 0xd6, 0xcf, 0x59, 0x1e, 0xe9, + 0x74, 0xba, 0xb7, 0xc6, 0xad, 0x7f, 0x3f, 0x1f + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 12); + x4 = be_load_word32(block + 4); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + x8 = be_load_word32(block + 32); + x9 = be_load_word32(block + 36); + + /* Perform all permutation rounds */ + for (round = 0; round < 16; ++round, rc += 6) { + /* Apply Simeck-64 to three of the 64-bit sub-blocks */ + simeck64_box(x0, x1, rc[0]); + simeck64_box(x4, x5, rc[1]); + simeck64_box(x8, x9, rc[2]); + x6 ^= x8; + x7 ^= x9; + x2 ^= x4; + x3 ^= x5; + x8 ^= x0; + x9 ^= x1; + + /* Add step constants */ + x2 ^= 0xFFFFFFFFU; + x3 ^= 0xFFFFFF00U ^ rc[3]; + x6 ^= 0xFFFFFFFFU; + x7 ^= 0xFFFFFF00U ^ rc[4]; + x8 ^= 0xFFFFFFFFU; + x9 ^= 0xFFFFFF00U ^ rc[5]; + + /* Rotate the sub-blocks */ + t0 = x8; + t1 = x9; + x8 = x2; + x9 = x3; + x2 = x4; + x3 = x5; + x4 = x0; + x5 = x1; + x0 = x6; + x1 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 16, x1); /* Assumes the block is pre-swapped */ + be_store_word32(block + 8, x2); + be_store_word32(block + 12, x3); + be_store_word32(block + 4, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); + be_store_word32(block + 32, x8); + be_store_word32(block + 36, x9); +} + +void sliscp_light320_swap(unsigned char block[40]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 4); + t2 = le_load_word32(block + 16); + le_store_word32(block + 16, t1); + le_store_word32(block + 4, t2); +} + +#endif /* !__AVR__ */ diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.h b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.h new file mode 100644 index 0000000..8a5e8d5 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-sliscp-light.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SLISCP_LIGHT_H +#define LW_INTERNAL_SLISCP_LIGHT_H + +/** + * \file internal-sliscp-light.h + * \brief sLiSCP-light permutation + * + * There are three variants of sLiSCP-light in use in the NIST submissions: + * + * \li sLiSCP-light-256 with a 256-bit block size, used in SPIX and SpoC. + * \li sLiSCP-light-192 with a 192-bit block size, used in SpoC. + * \li sLiSCP-light-320 with a 320-bit block size, used in ACE. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace, + * https://uwaterloo.ca/communications-security-lab/lwc/spix, + * https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for sLiSCP-light-256. + */ +#define SLISCP_LIGHT256_STATE_SIZE 32 + +/** + * \brief Size of the state for sLiSCP-light-192. + */ +#define SLISCP_LIGHT192_STATE_SIZE 24 + +/** + * \brief Size of the state for sLiSCP-light-320. + */ +#define SLISCP_LIGHT320_STATE_SIZE 40 + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * \param rounds Number of rounds to be performed, usually 9 or 18. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SPIX cipher. SPIX places the rate bytes at + * positions 8, 9, 10, 11, 24, 25, 26, and 27. + * + * This function assumes that bytes 24-27 have been pre-swapped with + * bytes 12-15 so that the rate portion of the state is contiguous. + * + * The sliscp_light256_swap_spix() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spix() + */ +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SPIX. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spix() + */ +void sliscp_light256_swap_spix(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SpoC-128 cipher. SpoC-128 interleaves the + * rate bytes and the mask bytes. This version assumes that the + * rate and mask are in contiguous bytes of the state. + * + * SpoC-128 absorbs bytes using the mask bytes of the state at offsets + * 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, and 31. + * It squeezes bytes using the rate bytes of the state at offsets + * 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, and 23. + * + * This function assumes that bytes 8-15 have been pre-swapped with 16-23 + * so that the rate and mask portions of the state are contiguous. + * + * The sliscp_light256_swap_spoc() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spoc() + */ +void sliscp_light256_permute_spoc(unsigned char block[32]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SpoC-128. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spoc() + */ +void sliscp_light256_swap_spoc(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 192-bit block. + * + * \param block Points to the block to be permuted. + */ +void sliscp_light192_permute(unsigned char block[24]); + +/** + * \brief Performs the sLiSCP-light permutation on a 320-bit block. + * + * \param block Points to the block to be permuted. + * + * The ACE specification refers to this permutation as "ACE" but that + * can be confused with the name of the AEAD mode so we call this + * permutation "sLiSCP-light-320" instead. + * + * ACE absorbs and squeezes data at the rate bytes 0, 1, 2, 3, 16, 17, 18, 19. + * Efficiency can suffer because of the discontinuity in rate byte positions. + * + * To counteract this, we assume that the input to the permutation has been + * pre-swapped: bytes 4, 5, 6, 7 are swapped with bytes 16, 17, 18, 19 so + * that the rate is contiguous at the start of the state. + * + * The sliscp_light320_swap() function can be used to switch between the + * canonical order and the pre-swapped order. + * + * \sa sliscp_light320_swap() + */ +void sliscp_light320_permute(unsigned char block[40]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 320-bit block. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light320_permute() + */ +void sliscp_light320_swap(unsigned char block[40]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-util.h b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.c b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.c new file mode 100644 index 0000000..92ee233 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.c @@ -0,0 +1,406 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spoc.h" +#include "internal-sliscp-light.h" +#include "internal-util.h" +#include + +/** + * \brief Size of the state for the internal sLiSCP-light-256 permutation. + */ +#define SPOC_128_STATE_SIZE SLISCP_LIGHT256_STATE_SIZE + +/** + * \brief Rate for absorbing data into the sLiSCP-light-256 state and for + * squeezing data out again. + */ +#define SPOC_128_RATE 16 + +/** + * \brief Size of the state for the internal sLiSCP-light-192 permutation. + */ +#define SPOC_64_STATE_SIZE SLISCP_LIGHT192_STATE_SIZE + +/** + * \brief Rate for absorbing data into the sLiSCP-light-192 state and for + * squeezing data out again. + */ +#define SPOC_64_RATE 8 + +aead_cipher_t const spoc_128_cipher = { + "SpoC-128", + SPOC_KEY_SIZE, + SPOC_NONCE_SIZE, + SPOC_128_TAG_SIZE, + AEAD_FLAG_NONE, + spoc_128_aead_encrypt, + spoc_128_aead_decrypt +}; + +aead_cipher_t const spoc_64_cipher = { + "SpoC-64", + SPOC_KEY_SIZE, + SPOC_NONCE_SIZE, + SPOC_64_TAG_SIZE, + AEAD_FLAG_NONE, + spoc_64_aead_encrypt, + spoc_64_aead_decrypt +}; + +/* Indices of where a rate byte is located to help with padding */ +/* +static unsigned char const spoc_128_rate_posn[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23 +}; +static unsigned char const spoc_128_mask_posn[16] = { + 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31 +}; +*/ +static unsigned char const spoc_64_rate_posn[8] = { + 0, 1, 2, 3, 12, 13, 14, 15 +}; +static unsigned char const spoc_64_mask_posn[8] = { + 6, 7, 8, 9, 18, 19, 20, 21 +}; + +/** + * \brief Initializes the SpoC-128 state. + * + * \param state sLiSCP-light-256 permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void spoc_128_init + (unsigned char state[SPOC_128_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by combining the key and nonce */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, ad, SPOC_128_RATE); + state[0] ^= 0x20; /* domain separation */ + ad += SPOC_128_RATE; + adlen -= SPOC_128_RATE; + } + temp = (unsigned)adlen; + if (temp > 0) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, ad, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x30; /* domain separation */ + } + } +} + +/** + * \brief Initializes the SpoC-64 state. + * + * \param state sLiSCP-light-192 permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void spoc_64_init + (unsigned char state[SPOC_64_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by interleaving the key and nonce */ + memcpy(state, npub, 4); + state[4] = k[6]; + state[5] = k[7]; + memcpy(state + 6, k, 6); + memcpy(state + 12, npub + 4, 4); + state[16] = k[14]; + state[17] = k[15]; + memcpy(state + 18, k + 8, 6); + sliscp_light192_permute(state); + lw_xor_block(state + 6, npub + 8, 4); + lw_xor_block(state + 18, npub + 12, 4); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block(state + 6, ad, 4); + lw_xor_block(state + 18, ad + 4, 4); + state[0] ^= 0x20; /* domain separation */ + ad += SPOC_64_RATE; + adlen -= SPOC_64_RATE; + } + temp = (unsigned)adlen; + if (temp > 0) { + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + state[0] ^= 0x30; /* domain separation */ + while (temp > 0) { + --temp; + state[spoc_64_mask_posn[temp]] ^= ad[temp]; + } + } + } +} + +/** + * \brief Finalizes the SpoC-128 encryption or decryption operation. + * + * \param state sLiSCP-light-256 permutation state. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void spoc_128_finalize + (unsigned char state[SPOC_128_STATE_SIZE], unsigned char *tag) +{ + /* Pad and permute the state one more time */ + state[0] ^= 0x80; + sliscp_light256_permute_spoc(state); + + /* Copy out the authentication tag */ + memcpy(tag, state + 16, 16); +} + +/** + * \brief Finalizes the SpoC-64 encryption or decryption operation. + * + * \param state sLiSCP-light-192 permutation state. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void spoc_64_finalize + (unsigned char state[SPOC_64_STATE_SIZE], unsigned char *tag) +{ + /* Pad and permute the state one more time */ + state[0] ^= 0x80; + sliscp_light192_permute(state); + + /* Copy out the authentication tag */ + memcpy(tag, state + 6, 4); + memcpy(tag + 4, state + 18, 4); +} + +int spoc_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_128_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOC_128_TAG_SIZE; + + /* Initialize the SpoC-128 state and absorb the associated data */ + spoc_128_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen != 0) { + while (mlen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, m, SPOC_128_RATE); + lw_xor_block_2_src(c, m, state, SPOC_128_RATE); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_128_RATE; + m += SPOC_128_RATE; + mlen -= SPOC_128_RATE; + } + if (mlen != 0) { + unsigned temp = (unsigned)mlen; + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, m, temp); + lw_xor_block_2_src(c, m, state, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x50; /* domain separation */ + c += mlen; + } + } + + /* Finalize and generate the authentication tag */ + spoc_128_finalize(state, c); + return 0; +} + +int spoc_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_128_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOC_128_TAG_SIZE) + return -1; + *mlen = clen - SPOC_128_TAG_SIZE; + + /* Initialize the Spoc-128 state and absorb the associated data */ + spoc_128_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOC_128_TAG_SIZE; + if (clen != 0) { + while (clen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block_2_src(m, c, state, SPOC_128_RATE); + lw_xor_block(state + 16, m, SPOC_128_RATE); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_128_RATE; + m += SPOC_128_RATE; + clen -= SPOC_128_RATE; + } + if (clen != 0) { + unsigned temp = (unsigned)clen; + sliscp_light256_permute_spoc(state); + lw_xor_block_2_src(m, c, state, temp); + lw_xor_block(state + 16, m, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x50; /* domain separation */ + c += clen; + } + } + + /* Finalize and check the authentication tag */ + spoc_128_finalize(state, state); + return aead_check_tag(mtemp, *mlen, state, c, SPOC_128_TAG_SIZE); +} + +int spoc_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_64_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOC_64_TAG_SIZE; + + /* Initialize the SpoC-64 state and absorb the associated data */ + spoc_64_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen != 0) { + while (mlen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block(state + 6, m, 4); + lw_xor_block(state + 18, m + 4, 4); + lw_xor_block_2_src(c, m, state, 4); + lw_xor_block_2_src(c + 4, m + 4, state + 12, 4); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_64_RATE; + m += SPOC_64_RATE; + mlen -= SPOC_64_RATE; + } + if (mlen != 0) { + unsigned temp = (unsigned)mlen; + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + while (temp > 0) { + --temp; + unsigned char mbyte = m[temp]; + state[spoc_64_mask_posn[temp]] ^= mbyte; + c[temp] = mbyte ^ state[spoc_64_rate_posn[temp]]; + } + state[0] ^= 0x50; /* domain separation */ + c += mlen; + } + } + + /* Finalize and generate the authentication tag */ + spoc_64_finalize(state, c); + return 0; +} + +int spoc_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_64_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOC_64_TAG_SIZE) + return -1; + *mlen = clen - SPOC_64_TAG_SIZE; + + /* Initialize the Spoc-64 state and absorb the associated data */ + spoc_64_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOC_64_TAG_SIZE; + if (clen != 0) { + while (clen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block_2_src(m, c, state, 4); + lw_xor_block_2_src(m + 4, c + 4, state + 12, 4); + lw_xor_block(state + 6, m, 4); + lw_xor_block(state + 18, m + 4, 4); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_64_RATE; + m += SPOC_64_RATE; + clen -= SPOC_64_RATE; + } + if (clen != 0) { + unsigned temp = (unsigned)clen; + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + while (temp > 0) { + --temp; + unsigned char mbyte = c[temp] ^ state[spoc_64_rate_posn[temp]]; + state[spoc_64_mask_posn[temp]] ^= mbyte; + m[temp] = mbyte; + } + state[0] ^= 0x50; /* domain separation */ + c += clen; + } + } + + /* Finalize and check the authentication tag */ + spoc_64_finalize(state, state); + return aead_check_tag(mtemp, *mlen, state, c, SPOC_64_TAG_SIZE); +} diff --git a/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.h b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.h new file mode 100644 index 0000000..712c2d0 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc128sliscplight256v1/rhys-avr/spoc.h @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOC_H +#define LWCRYPTO_SPOC_H + +#include "aead-common.h" + +/** + * \file spoc.h + * \brief SpoC authenticated encryption algorithm. + * + * SpoC is a family of authenticated encryption algorithms with two + * members, SpoC-128 and Spoc-64. The algorithms use a Beetle-like + * sponge construction built on top of the sLiSCP-light permutation. + * + * \li Spoc-128 has a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * It is built around the 256-bit version of the sLiSCP-light permutation. + * This is the primary member of the family. + * \li Spoc-64 has a 128-bit key, a 128-bit nonce, and a 64-bit tag. + * It is built around the 192-bit version of the sLiSCP-light permutation. + * + * Spoc-128 has good performance on small packets (16 bytes or less) + * on 32-bit embedded platforms. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SpoC variants. + */ +#define SPOC_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SpoC-128. + */ +#define SPOC_128_TAG_SIZE 16 + +/** + * \brief Size of the authentication tag for SpoC-64. + */ +#define SPOC_64_TAG_SIZE 8 + +/** + * \brief Size of the nonce for all SpoC variants. + */ +#define SPOC_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SpoC-128 cipher. + */ +extern aead_cipher_t const spoc_128_cipher; + +/** + * \brief Meta-information block for the SpoC-64 cipher. + */ +extern aead_cipher_t const spoc_64_cipher; + +/** + * \brief Encrypts and authenticates a packet with SpoC-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spoc_128_aead_decrypt() + */ +int spoc_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SpoC-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spoc_128_aead_encrypt() + */ +int spoc_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SpoC-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spoc_64_aead_decrypt() + */ +int spoc_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SpoC-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spoc_64_aead_encrypt() + */ +int spoc_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.c b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.h b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/api.h b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/api.h new file mode 100644 index 0000000..4bf8f5c --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/encrypt.c b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..f8dd710 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spoc.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spoc_64_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spoc_64_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-192-avr.S b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-192-avr.S new file mode 100644 index 0000000..5860b14 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-192-avr.S @@ -0,0 +1,794 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 72 +table_0: + .byte 7 + .byte 39 + .byte 8 + .byte 41 + .byte 4 + .byte 52 + .byte 12 + .byte 29 + .byte 6 + .byte 46 + .byte 10 + .byte 51 + .byte 37 + .byte 25 + .byte 47 + .byte 42 + .byte 23 + .byte 53 + .byte 56 + .byte 31 + .byte 28 + .byte 15 + .byte 36 + .byte 16 + .byte 18 + .byte 8 + .byte 54 + .byte 24 + .byte 59 + .byte 12 + .byte 13 + .byte 20 + .byte 38 + .byte 10 + .byte 43 + .byte 30 + .byte 21 + .byte 47 + .byte 62 + .byte 49 + .byte 63 + .byte 56 + .byte 1 + .byte 9 + .byte 32 + .byte 36 + .byte 33 + .byte 45 + .byte 48 + .byte 54 + .byte 17 + .byte 27 + .byte 40 + .byte 13 + .byte 57 + .byte 22 + .byte 60 + .byte 43 + .byte 5 + .byte 61 + .byte 34 + .byte 62 + .byte 39 + .byte 3 + .byte 19 + .byte 1 + .byte 52 + .byte 2 + .byte 26 + .byte 33 + .byte 46 + .byte 35 + + .text +.global sliscp_light192_permute + .type sliscp_light192_permute, @function +sliscp_light192_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 +.L__stack_usage = 18 + ld r20,Z + ldd r19,Z+1 + ldd r18,Z+2 + ldd r21,Z+3 + ldd r23,Z+4 + ldd r22,Z+5 + ldd r28,Z+6 + ldd r27,Z+7 + ldd r26,Z+8 + ldd r29,Z+9 + ldd r3,Z+10 + ldd r2,Z+11 + ldd r6,Z+12 + ldd r5,Z+13 + ldd r4,Z+14 + ldd r7,Z+15 + ldd r9,Z+16 + ldd r8,Z+17 + ldd r12,Z+18 + ldd r11,Z+19 + ldd r10,Z+20 + ldd r13,Z+21 + ldd r15,Z+22 + ldd r14,Z+23 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r24,0 +28: + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + inc r24 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + movw r16,r26 + mov r1,r28 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r2,r16 + eor r3,r17 + eor r29,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r26 + and r17,r27 + and r1,r28 + eor r2,r16 + eor r3,r17 + eor r29,r1 + com r3 + com r29 + ldi r16,255 + lsr r25 + rol r16 + eor r2,r16 + movw r16,r2 + mov r1,r29 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r26,r16 + eor r27,r17 + eor r28,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r2 + and r17,r3 + and r1,r29 + eor r26,r16 + eor r27,r17 + eor r28,r1 + com r27 + com r28 + ldi r16,255 + lsr r25 + rol r16 + eor r26,r16 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + inc r24 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + movw r16,r10 + mov r1,r12 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r14,r16 + eor r15,r17 + eor r13,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r10 + and r17,r11 + and r1,r12 + eor r14,r16 + eor r15,r17 + eor r13,r1 + com r15 + com r13 + ldi r16,255 + lsr r25 + rol r16 + eor r14,r16 + movw r16,r14 + mov r1,r13 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + eor r10,r16 + eor r11,r17 + eor r12,r1 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + bst r1,7 + lsl r16 + rol r17 + rol r1 + bld r16,0 + and r16,r14 + and r17,r15 + and r1,r13 + eor r10,r16 + eor r11,r17 + eor r12,r1 + com r11 + com r12 + ldi r16,255 + lsr r25 + rol r16 + eor r10,r16 + com r18 + com r19 + com r20 + com r23 + com r21 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + eor r22,r25 + inc r24 + com r4 + com r5 + com r6 + com r9 + com r7 + mov r30,r24 +#if defined(RAMPZ) + elpm r25,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r25,Z +#elif defined(__AVR_TINY__) + ld r25,Z +#else + lpm + mov r25,r0 +#endif + eor r8,r25 + inc r24 + movw r16,r18 + mov r1,r20 + eor r16,r26 + eor r17,r27 + eor r1,r28 + movw r18,r26 + mov r20,r28 + movw r26,r4 + mov r28,r6 + eor r26,r10 + eor r27,r11 + eor r28,r12 + movw r4,r10 + mov r6,r12 + movw r10,r16 + mov r12,r1 + movw r16,r22 + mov r1,r21 + eor r16,r2 + eor r17,r3 + eor r1,r29 + movw r22,r2 + mov r21,r29 + movw r2,r8 + mov r29,r7 + eor r2,r14 + eor r3,r15 + eor r29,r13 + movw r8,r14 + mov r7,r13 + movw r14,r16 + mov r13,r1 + ldi r17,72 + cpse r24,r17 + rjmp 28b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + st Z,r20 + std Z+1,r19 + std Z+2,r18 + std Z+3,r21 + std Z+4,r23 + std Z+5,r22 + std Z+6,r28 + std Z+7,r27 + std Z+8,r26 + std Z+9,r29 + std Z+10,r3 + std Z+11,r2 + std Z+12,r6 + std Z+13,r5 + std Z+14,r4 + std Z+15,r7 + std Z+16,r9 + std Z+17,r8 + std Z+18,r12 + std Z+19,r11 + std Z+20,r10 + std Z+21,r13 + std Z+22,r15 + std Z+23,r14 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + eor r1,r1 + ret + .size sliscp_light192_permute, .-sliscp_light192_permute + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-256-spoc-avr.S b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-256-spoc-avr.S new file mode 100644 index 0000000..84925b4 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-256-spoc-avr.S @@ -0,0 +1,1142 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 72 +table_0: + .byte 15 + .byte 71 + .byte 8 + .byte 100 + .byte 4 + .byte 178 + .byte 134 + .byte 107 + .byte 67 + .byte 181 + .byte 226 + .byte 111 + .byte 241 + .byte 55 + .byte 137 + .byte 44 + .byte 68 + .byte 150 + .byte 230 + .byte 221 + .byte 115 + .byte 238 + .byte 202 + .byte 153 + .byte 229 + .byte 76 + .byte 23 + .byte 234 + .byte 11 + .byte 245 + .byte 142 + .byte 15 + .byte 71 + .byte 7 + .byte 100 + .byte 4 + .byte 178 + .byte 130 + .byte 107 + .byte 67 + .byte 181 + .byte 161 + .byte 111 + .byte 241 + .byte 55 + .byte 120 + .byte 44 + .byte 68 + .byte 150 + .byte 162 + .byte 221 + .byte 115 + .byte 238 + .byte 185 + .byte 153 + .byte 229 + .byte 76 + .byte 242 + .byte 234 + .byte 11 + .byte 245 + .byte 133 + .byte 15 + .byte 71 + .byte 7 + .byte 35 + .byte 4 + .byte 178 + .byte 130 + .byte 217 + .byte 67 + .byte 181 + + .text +.global sliscp_light256_permute_spoc + .type sliscp_light256_permute_spoc, @function +sliscp_light256_permute_spoc: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 31 + ld r21,Z + ldd r20,Z+1 + ldd r19,Z+2 + ldd r18,Z+3 + ldd r27,Z+4 + ldd r26,Z+5 + ldd r23,Z+6 + ldd r22,Z+7 + ldd r5,Z+8 + ldd r4,Z+9 + ldd r3,Z+10 + ldd r2,Z+11 + ldd r9,Z+12 + ldd r8,Z+13 + ldd r7,Z+14 + ldd r6,Z+15 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + ldd r21,Z+16 + ldd r20,Z+17 + ldd r19,Z+18 + ldd r18,Z+19 + ldd r27,Z+20 + ldd r26,Z+21 + ldd r23,Z+22 + ldd r22,Z+23 + ldd r5,Z+24 + ldd r4,Z+25 + ldd r3,Z+26 + ldd r2,Z+27 + ldd r9,Z+28 + ldd r8,Z+29 + ldd r7,Z+30 + ldd r6,Z+31 + push r31 + push r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + mov r30,r1 +52: +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + inc r30 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 + movw r12,r18 + movw r14,r20 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r18 + and r13,r19 + and r14,r20 + and r15,r21 + eor r22,r12 + eor r23,r13 + eor r26,r14 + eor r27,r15 + com r23 + com r26 + com r27 + ldi r24,255 + lsr r10 + rol r24 + eor r22,r24 + movw r12,r22 + movw r14,r26 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r22 + and r13,r23 + and r14,r26 + and r15,r27 + eor r18,r12 + eor r19,r13 + eor r20,r14 + eor r21,r15 + com r19 + com r20 + com r21 + ldi r24,255 + lsr r10 + rol r24 + eor r18,r24 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + inc r30 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + movw r12,r2 + movw r14,r4 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r2 + and r13,r3 + and r14,r4 + and r15,r5 + eor r6,r12 + eor r7,r13 + eor r8,r14 + eor r9,r15 + com r7 + com r8 + com r9 + ldi r24,255 + lsr r10 + rol r24 + eor r6,r24 + movw r12,r6 + movw r14,r8 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + lsl r12 + rol r13 + rol r14 + rol r15 + adc r12,r1 + and r12,r6 + and r13,r7 + and r14,r8 + and r15,r9 + eor r2,r12 + eor r3,r13 + eor r4,r14 + eor r5,r15 + com r3 + com r4 + com r5 + ldi r24,255 + lsr r10 + rol r24 + eor r2,r24 + ldd r12,Y+1 + ldd r13,Y+2 + ldd r14,Y+3 + ldd r15,Y+4 + com r12 + com r13 + com r14 + com r15 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + std Y+1,r18 + std Y+2,r19 + std Y+3,r20 + std Y+4,r21 + ldd r18,Y+9 + ldd r19,Y+10 + ldd r20,Y+11 + ldd r21,Y+12 + com r18 + com r19 + com r20 + com r21 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + std Y+9,r2 + std Y+10,r3 + std Y+11,r4 + std Y+12,r5 + movw r2,r12 + movw r4,r14 + ldd r12,Y+5 + ldd r13,Y+6 + ldd r14,Y+7 + ldd r15,Y+8 + com r13 + com r14 + com r15 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + eor r12,r10 + inc r30 + eor r12,r22 + eor r13,r23 + eor r14,r26 + eor r15,r27 + std Y+5,r22 + std Y+6,r23 + std Y+7,r26 + std Y+8,r27 + ldd r22,Y+13 + ldd r23,Y+14 + ldd r26,Y+15 + ldd r27,Y+16 + com r23 + com r26 + com r27 +#if defined(RAMPZ) + elpm r10,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r10,Z +#elif defined(__AVR_TINY__) + ld r10,Z +#else + lpm + mov r10,r0 +#endif + eor r22,r10 + inc r30 + eor r22,r6 + eor r23,r7 + eor r26,r8 + eor r27,r9 + std Y+13,r6 + std Y+14,r7 + std Y+15,r8 + std Y+16,r9 + movw r6,r12 + movw r8,r14 + ldi r25,72 + cpse r30,r25 + rjmp 52b +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + pop r30 + pop r31 + std Z+16,r21 + std Z+17,r20 + std Z+18,r19 + std Z+19,r18 + std Z+20,r27 + std Z+21,r26 + std Z+22,r23 + std Z+23,r22 + std Z+24,r5 + std Z+25,r4 + std Z+26,r3 + std Z+27,r2 + std Z+28,r9 + std Z+29,r8 + std Z+30,r7 + std Z+31,r6 + ldd r18,Y+1 + ldd r19,Y+2 + ldd r20,Y+3 + ldd r21,Y+4 + ldd r22,Y+5 + ldd r23,Y+6 + ldd r26,Y+7 + ldd r27,Y+8 + ldd r2,Y+9 + ldd r3,Y+10 + ldd r4,Y+11 + ldd r5,Y+12 + ldd r6,Y+13 + ldd r7,Y+14 + ldd r8,Y+15 + ldd r9,Y+16 + st Z,r21 + std Z+1,r20 + std Z+2,r19 + std Z+3,r18 + std Z+4,r27 + std Z+5,r26 + std Z+6,r23 + std Z+7,r22 + std Z+8,r5 + std Z+9,r4 + std Z+10,r3 + std Z+11,r2 + std Z+12,r9 + std Z+13,r8 + std Z+14,r7 + std Z+15,r6 + adiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r15 + pop r14 + pop r13 + pop r12 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size sliscp_light256_permute_spoc, .-sliscp_light256_permute_spoc + + .text +.global sliscp_light256_swap_spoc + .type sliscp_light256_swap_spoc, @function +sliscp_light256_swap_spoc: + movw r30,r24 +.L__stack_usage = 2 + ldd r18,Z+8 + ldd r19,Z+9 + ldd r20,Z+10 + ldd r21,Z+11 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r26,Z+18 + ldd r27,Z+19 + std Z+16,r18 + std Z+17,r19 + std Z+18,r20 + std Z+19,r21 + std Z+8,r22 + std Z+9,r23 + std Z+10,r26 + std Z+11,r27 + ldd r18,Z+12 + ldd r19,Z+13 + ldd r20,Z+14 + ldd r21,Z+15 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r26,Z+22 + ldd r27,Z+23 + std Z+20,r18 + std Z+21,r19 + std Z+22,r20 + std Z+23,r21 + std Z+12,r22 + std Z+13,r23 + std Z+14,r26 + std Z+15,r27 + ret + .size sliscp_light256_swap_spoc, .-sliscp_light256_swap_spoc + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.c b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.c new file mode 100644 index 0000000..dd3a688 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-sliscp-light.h" + +#if !defined(__AVR__) + +/** + * \brief Performs one round of the Simeck-64 block cipher. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + */ +#define simeck64_round(x, y) \ + do { \ + (y) ^= (leftRotate5((x)) & (x)) ^ leftRotate1((x)) ^ \ + 0xFFFFFFFEU ^ (_rc & 1); \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 64-bit block with the 8 round version of Simeck-64. + * + * \param x Left half of the 64-bit block. + * \param y Right half of the 64-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck64_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck64_round(x, y); /* Round 1 */ \ + simeck64_round(y, x); /* Round 2 */ \ + simeck64_round(x, y); /* Round 3 */ \ + simeck64_round(y, x); /* Round 4 */ \ + simeck64_round(x, y); /* Round 5 */ \ + simeck64_round(y, x); /* Round 6 */ \ + simeck64_round(x, y); /* Round 7 */ \ + simeck64_round(y, x); /* Round 8 */ \ + } while (0) + +/* Helper macros for 48-bit left rotations */ +#define leftRotate5_48(x) (((x) << 5) | ((x) >> 19)) +#define leftRotate1_48(x) (((x) << 1) | ((x) >> 23)) + +/** + * \brief Performs one round of the Simeck-48 block cipher. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + */ +#define simeck48_round(x, y) \ + do { \ + (y) ^= (leftRotate5_48((x)) & (x)) ^ leftRotate1_48((x)) ^ \ + 0x00FFFFFEU ^ (_rc & 1); \ + (y) &= 0x00FFFFFFU; \ + _rc >>= 1; \ + } while (0) + +/** + * \brief Encrypts a 48-bit block with the 6 round version of Simeck-48. + * + * \param x Left half of the 48-bit block. + * \param y Right half of the 48-bit block. + * \param rc Round constants for the 8 rounds, 1 bit per round. + * + * It is assumed that the two halves have already been converted from + * big-endian to host byte order before calling this function. The output + * halves will also be in host byte order. + */ +#define simeck48_box(x, y, rc) \ + do { \ + unsigned char _rc = (rc); \ + simeck48_round(x, y); /* Round 1 */ \ + simeck48_round(y, x); /* Round 2 */ \ + simeck48_round(x, y); /* Round 3 */ \ + simeck48_round(y, x); /* Round 4 */ \ + simeck48_round(x, y); /* Round 5 */ \ + simeck48_round(y, x); /* Round 6 */ \ + } while (0) + +/* Interleaved rc0, rc1, sc0, and sc1 values for each round */ +static unsigned char const sliscp_light256_RC[18 * 4] = { + 0x0f, 0x47, 0x08, 0x64, 0x04, 0xb2, 0x86, 0x6b, + 0x43, 0xb5, 0xe2, 0x6f, 0xf1, 0x37, 0x89, 0x2c, + 0x44, 0x96, 0xe6, 0xdd, 0x73, 0xee, 0xca, 0x99, + 0xe5, 0x4c, 0x17, 0xea, 0x0b, 0xf5, 0x8e, 0x0f, + 0x47, 0x07, 0x64, 0x04, 0xb2, 0x82, 0x6b, 0x43, + 0xb5, 0xa1, 0x6f, 0xf1, 0x37, 0x78, 0x2c, 0x44, + 0x96, 0xa2, 0xdd, 0x73, 0xee, 0xb9, 0x99, 0xe5, + 0x4c, 0xf2, 0xea, 0x0b, 0xf5, 0x85, 0x0f, 0x47, + 0x07, 0x23, 0x04, 0xb2, 0x82, 0xd9, 0x43, 0xb5 +}; + +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 24); /* Assumes the block is pre-swapped */ + x4 = be_load_word32(block + 16); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 12); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (; rounds > 0; --rounds, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 8, x2); + be_store_word32(block + 24, x3); /* Assumes the block is pre-swapped */ + be_store_word32(block + 16, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 12, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spix(unsigned char block[32]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 12); + t2 = le_load_word32(block + 24); + le_store_word32(block + 24, t1); + le_store_word32(block + 12, t2); +} + +void sliscp_light256_permute_spoc(unsigned char block[32]) +{ + const unsigned char *rc = sliscp_light256_RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 4); + x2 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x3 = be_load_word32(block + 20); + x4 = be_load_word32(block + 8); + x5 = be_load_word32(block + 12); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-64 to two of the 64-bit sub-blocks */ + simeck64_box(x2, x3, rc[0]); + simeck64_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0xFFFFFFFFU; + x1 ^= 0xFFFFFF00U ^ rc[2]; + x4 ^= 0xFFFFFFFFU; + x5 ^= 0xFFFFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 4, x1); + be_store_word32(block + 16, x2); /* Assumes the block is pre-swapped */ + be_store_word32(block + 20, x3); + be_store_word32(block + 8, x4); + be_store_word32(block + 12, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); +} + +void sliscp_light256_swap_spoc(unsigned char block[32]) +{ + uint64_t t1, t2; + t1 = le_load_word64(block + 8); + t2 = le_load_word64(block + 16); + le_store_word64(block + 16, t1); + le_store_word64(block + 8, t2); +} + +/* Load a big-endian 24-bit word from a byte buffer */ +#define be_load_word24(ptr) \ + ((((uint32_t)((ptr)[0])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[2]))) + +/* Store a big-endian 24-bit word into a byte buffer */ +#define be_store_word24(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 16); \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)_x; \ + } while (0) + +void sliscp_light192_permute(unsigned char block[24]) +{ + /* Interleaved rc0, rc1, sc0, and sc1 values for each round */ + static unsigned char const RC[18 * 4] = { + 0x07, 0x27, 0x08, 0x29, 0x04, 0x34, 0x0c, 0x1d, + 0x06, 0x2e, 0x0a, 0x33, 0x25, 0x19, 0x2f, 0x2a, + 0x17, 0x35, 0x38, 0x1f, 0x1c, 0x0f, 0x24, 0x10, + 0x12, 0x08, 0x36, 0x18, 0x3b, 0x0c, 0x0d, 0x14, + 0x26, 0x0a, 0x2b, 0x1e, 0x15, 0x2f, 0x3e, 0x31, + 0x3f, 0x38, 0x01, 0x09, 0x20, 0x24, 0x21, 0x2d, + 0x30, 0x36, 0x11, 0x1b, 0x28, 0x0d, 0x39, 0x16, + 0x3c, 0x2b, 0x05, 0x3d, 0x22, 0x3e, 0x27, 0x03, + 0x13, 0x01, 0x34, 0x02, 0x1a, 0x21, 0x2e, 0x23 + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables. Each 24-bit block is + * placed into a separate 32-bit word which improves efficiency below */ + x0 = be_load_word24(block); + x1 = be_load_word24(block + 3); + x2 = be_load_word24(block + 6); + x3 = be_load_word24(block + 9); + x4 = be_load_word24(block + 12); + x5 = be_load_word24(block + 15); + x6 = be_load_word24(block + 18); + x7 = be_load_word24(block + 21); + + /* Perform all permutation rounds */ + for (round = 0; round < 18; ++round, rc += 4) { + /* Apply Simeck-48 to two of the 48-bit sub-blocks */ + simeck48_box(x2, x3, rc[0]); + simeck48_box(x6, x7, rc[1]); + + /* Add step constants */ + x0 ^= 0x00FFFFFFU; + x1 ^= 0x00FFFF00U ^ rc[2]; + x4 ^= 0x00FFFFFFU; + x5 ^= 0x00FFFF00U ^ rc[3]; + + /* Mix the sub-blocks */ + t0 = x0 ^ x2; + t1 = x1 ^ x3; + x0 = x2; + x1 = x3; + x2 = x4 ^ x6; + x3 = x5 ^ x7; + x4 = x6; + x5 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word24(block, x0); + be_store_word24(block + 3, x1); + be_store_word24(block + 6, x2); + be_store_word24(block + 9, x3); + be_store_word24(block + 12, x4); + be_store_word24(block + 15, x5); + be_store_word24(block + 18, x6); + be_store_word24(block + 21, x7); +} + +void sliscp_light320_permute(unsigned char block[40]) +{ + /* Interleaved rc0, rc1, rc2, sc0, sc1, and sc2 values for each round */ + static unsigned char const RC[16 * 6] = { + 0x07, 0x53, 0x43, 0x50, 0x28, 0x14, 0x0a, 0x5d, + 0xe4, 0x5c, 0xae, 0x57, 0x9b, 0x49, 0x5e, 0x91, + 0x48, 0x24, 0xe0, 0x7f, 0xcc, 0x8d, 0xc6, 0x63, + 0xd1, 0xbe, 0x32, 0x53, 0xa9, 0x54, 0x1a, 0x1d, + 0x4e, 0x60, 0x30, 0x18, 0x22, 0x28, 0x75, 0x68, + 0x34, 0x9a, 0xf7, 0x6c, 0x25, 0xe1, 0x70, 0x38, + 0x62, 0x82, 0xfd, 0xf6, 0x7b, 0xbd, 0x96, 0x47, + 0xf9, 0x9d, 0xce, 0x67, 0x71, 0x6b, 0x76, 0x40, + 0x20, 0x10, 0xaa, 0x88, 0xa0, 0x4f, 0x27, 0x13, + 0x2b, 0xdc, 0xb0, 0xbe, 0x5f, 0x2f, 0xe9, 0x8b, + 0x09, 0x5b, 0xad, 0xd6, 0xcf, 0x59, 0x1e, 0xe9, + 0x74, 0xba, 0xb7, 0xc6, 0xad, 0x7f, 0x3f, 0x1f + }; + const unsigned char *rc = RC; + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; + uint32_t t0, t1; + unsigned round; + + /* Load the block into local state variables */ + x0 = be_load_word32(block); + x1 = be_load_word32(block + 16); /* Assumes the block is pre-swapped */ + x2 = be_load_word32(block + 8); + x3 = be_load_word32(block + 12); + x4 = be_load_word32(block + 4); + x5 = be_load_word32(block + 20); + x6 = be_load_word32(block + 24); + x7 = be_load_word32(block + 28); + x8 = be_load_word32(block + 32); + x9 = be_load_word32(block + 36); + + /* Perform all permutation rounds */ + for (round = 0; round < 16; ++round, rc += 6) { + /* Apply Simeck-64 to three of the 64-bit sub-blocks */ + simeck64_box(x0, x1, rc[0]); + simeck64_box(x4, x5, rc[1]); + simeck64_box(x8, x9, rc[2]); + x6 ^= x8; + x7 ^= x9; + x2 ^= x4; + x3 ^= x5; + x8 ^= x0; + x9 ^= x1; + + /* Add step constants */ + x2 ^= 0xFFFFFFFFU; + x3 ^= 0xFFFFFF00U ^ rc[3]; + x6 ^= 0xFFFFFFFFU; + x7 ^= 0xFFFFFF00U ^ rc[4]; + x8 ^= 0xFFFFFFFFU; + x9 ^= 0xFFFFFF00U ^ rc[5]; + + /* Rotate the sub-blocks */ + t0 = x8; + t1 = x9; + x8 = x2; + x9 = x3; + x2 = x4; + x3 = x5; + x4 = x0; + x5 = x1; + x0 = x6; + x1 = x7; + x6 = t0; + x7 = t1; + } + + /* Store the state back into the block */ + be_store_word32(block, x0); + be_store_word32(block + 16, x1); /* Assumes the block is pre-swapped */ + be_store_word32(block + 8, x2); + be_store_word32(block + 12, x3); + be_store_word32(block + 4, x4); + be_store_word32(block + 20, x5); + be_store_word32(block + 24, x6); + be_store_word32(block + 28, x7); + be_store_word32(block + 32, x8); + be_store_word32(block + 36, x9); +} + +void sliscp_light320_swap(unsigned char block[40]) +{ + uint32_t t1, t2; + t1 = le_load_word32(block + 4); + t2 = le_load_word32(block + 16); + le_store_word32(block + 16, t1); + le_store_word32(block + 4, t2); +} + +#endif /* !__AVR__ */ diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.h b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.h new file mode 100644 index 0000000..8a5e8d5 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-sliscp-light.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SLISCP_LIGHT_H +#define LW_INTERNAL_SLISCP_LIGHT_H + +/** + * \file internal-sliscp-light.h + * \brief sLiSCP-light permutation + * + * There are three variants of sLiSCP-light in use in the NIST submissions: + * + * \li sLiSCP-light-256 with a 256-bit block size, used in SPIX and SpoC. + * \li sLiSCP-light-192 with a 192-bit block size, used in SpoC. + * \li sLiSCP-light-320 with a 320-bit block size, used in ACE. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/ace, + * https://uwaterloo.ca/communications-security-lab/lwc/spix, + * https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#include "internal-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the state for sLiSCP-light-256. + */ +#define SLISCP_LIGHT256_STATE_SIZE 32 + +/** + * \brief Size of the state for sLiSCP-light-192. + */ +#define SLISCP_LIGHT192_STATE_SIZE 24 + +/** + * \brief Size of the state for sLiSCP-light-320. + */ +#define SLISCP_LIGHT320_STATE_SIZE 40 + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * \param rounds Number of rounds to be performed, usually 9 or 18. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SPIX cipher. SPIX places the rate bytes at + * positions 8, 9, 10, 11, 24, 25, 26, and 27. + * + * This function assumes that bytes 24-27 have been pre-swapped with + * bytes 12-15 so that the rate portion of the state is contiguous. + * + * The sliscp_light256_swap_spix() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spix() + */ +void sliscp_light256_permute_spix(unsigned char block[32], unsigned rounds); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SPIX. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spix() + */ +void sliscp_light256_swap_spix(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 256-bit block. + * + * \param block Points to the block to be permuted. + * + * The bytes of the block are assumed to be rearranged to match the + * requirements of the SpoC-128 cipher. SpoC-128 interleaves the + * rate bytes and the mask bytes. This version assumes that the + * rate and mask are in contiguous bytes of the state. + * + * SpoC-128 absorbs bytes using the mask bytes of the state at offsets + * 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, and 31. + * It squeezes bytes using the rate bytes of the state at offsets + * 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, and 23. + * + * This function assumes that bytes 8-15 have been pre-swapped with 16-23 + * so that the rate and mask portions of the state are contiguous. + * + * The sliscp_light256_swap_spoc() function can be used to switch + * between the canonical order and the pre-swapped order. + * + * \sa sliscp_light256_swap_spoc() + */ +void sliscp_light256_permute_spoc(unsigned char block[32]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 256-bit block for SpoC-128. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light256_permute_spoc() + */ +void sliscp_light256_swap_spoc(unsigned char block[32]); + +/** + * \brief Performs the sLiSCP-light permutation on a 192-bit block. + * + * \param block Points to the block to be permuted. + */ +void sliscp_light192_permute(unsigned char block[24]); + +/** + * \brief Performs the sLiSCP-light permutation on a 320-bit block. + * + * \param block Points to the block to be permuted. + * + * The ACE specification refers to this permutation as "ACE" but that + * can be confused with the name of the AEAD mode so we call this + * permutation "sLiSCP-light-320" instead. + * + * ACE absorbs and squeezes data at the rate bytes 0, 1, 2, 3, 16, 17, 18, 19. + * Efficiency can suffer because of the discontinuity in rate byte positions. + * + * To counteract this, we assume that the input to the permutation has been + * pre-swapped: bytes 4, 5, 6, 7 are swapped with bytes 16, 17, 18, 19 so + * that the rate is contiguous at the start of the state. + * + * The sliscp_light320_swap() function can be used to switch between the + * canonical order and the pre-swapped order. + * + * \sa sliscp_light320_swap() + */ +void sliscp_light320_permute(unsigned char block[40]); + +/** + * \brief Swaps rate bytes in a sLiSCP-light 320-bit block. + * + * \param block Points to the block to be rate-swapped. + * + * \sa sliscp_light320_permute() + */ +void sliscp_light320_swap(unsigned char block[40]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-util.h b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.c b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.c new file mode 100644 index 0000000..92ee233 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.c @@ -0,0 +1,406 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spoc.h" +#include "internal-sliscp-light.h" +#include "internal-util.h" +#include + +/** + * \brief Size of the state for the internal sLiSCP-light-256 permutation. + */ +#define SPOC_128_STATE_SIZE SLISCP_LIGHT256_STATE_SIZE + +/** + * \brief Rate for absorbing data into the sLiSCP-light-256 state and for + * squeezing data out again. + */ +#define SPOC_128_RATE 16 + +/** + * \brief Size of the state for the internal sLiSCP-light-192 permutation. + */ +#define SPOC_64_STATE_SIZE SLISCP_LIGHT192_STATE_SIZE + +/** + * \brief Rate for absorbing data into the sLiSCP-light-192 state and for + * squeezing data out again. + */ +#define SPOC_64_RATE 8 + +aead_cipher_t const spoc_128_cipher = { + "SpoC-128", + SPOC_KEY_SIZE, + SPOC_NONCE_SIZE, + SPOC_128_TAG_SIZE, + AEAD_FLAG_NONE, + spoc_128_aead_encrypt, + spoc_128_aead_decrypt +}; + +aead_cipher_t const spoc_64_cipher = { + "SpoC-64", + SPOC_KEY_SIZE, + SPOC_NONCE_SIZE, + SPOC_64_TAG_SIZE, + AEAD_FLAG_NONE, + spoc_64_aead_encrypt, + spoc_64_aead_decrypt +}; + +/* Indices of where a rate byte is located to help with padding */ +/* +static unsigned char const spoc_128_rate_posn[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23 +}; +static unsigned char const spoc_128_mask_posn[16] = { + 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31 +}; +*/ +static unsigned char const spoc_64_rate_posn[8] = { + 0, 1, 2, 3, 12, 13, 14, 15 +}; +static unsigned char const spoc_64_mask_posn[8] = { + 6, 7, 8, 9, 18, 19, 20, 21 +}; + +/** + * \brief Initializes the SpoC-128 state. + * + * \param state sLiSCP-light-256 permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void spoc_128_init + (unsigned char state[SPOC_128_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by combining the key and nonce */ + memcpy(state, npub, 16); + memcpy(state + 16, k, 16); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, ad, SPOC_128_RATE); + state[0] ^= 0x20; /* domain separation */ + ad += SPOC_128_RATE; + adlen -= SPOC_128_RATE; + } + temp = (unsigned)adlen; + if (temp > 0) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, ad, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x30; /* domain separation */ + } + } +} + +/** + * \brief Initializes the SpoC-64 state. + * + * \param state sLiSCP-light-192 permutation state. + * \param k Points to the 128-bit key. + * \param npub Points to the 128-bit nonce. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void spoc_64_init + (unsigned char state[SPOC_64_STATE_SIZE], + const unsigned char *k, const unsigned char *npub, + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Initialize the state by interleaving the key and nonce */ + memcpy(state, npub, 4); + state[4] = k[6]; + state[5] = k[7]; + memcpy(state + 6, k, 6); + memcpy(state + 12, npub + 4, 4); + state[16] = k[14]; + state[17] = k[15]; + memcpy(state + 18, k + 8, 6); + sliscp_light192_permute(state); + lw_xor_block(state + 6, npub + 8, 4); + lw_xor_block(state + 18, npub + 12, 4); + + /* Absorb the associated data into the state */ + if (adlen != 0) { + while (adlen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block(state + 6, ad, 4); + lw_xor_block(state + 18, ad + 4, 4); + state[0] ^= 0x20; /* domain separation */ + ad += SPOC_64_RATE; + adlen -= SPOC_64_RATE; + } + temp = (unsigned)adlen; + if (temp > 0) { + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + state[0] ^= 0x30; /* domain separation */ + while (temp > 0) { + --temp; + state[spoc_64_mask_posn[temp]] ^= ad[temp]; + } + } + } +} + +/** + * \brief Finalizes the SpoC-128 encryption or decryption operation. + * + * \param state sLiSCP-light-256 permutation state. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void spoc_128_finalize + (unsigned char state[SPOC_128_STATE_SIZE], unsigned char *tag) +{ + /* Pad and permute the state one more time */ + state[0] ^= 0x80; + sliscp_light256_permute_spoc(state); + + /* Copy out the authentication tag */ + memcpy(tag, state + 16, 16); +} + +/** + * \brief Finalizes the SpoC-64 encryption or decryption operation. + * + * \param state sLiSCP-light-192 permutation state. + * \param tag Points to the 16 byte buffer to receive the computed tag. + */ +static void spoc_64_finalize + (unsigned char state[SPOC_64_STATE_SIZE], unsigned char *tag) +{ + /* Pad and permute the state one more time */ + state[0] ^= 0x80; + sliscp_light192_permute(state); + + /* Copy out the authentication tag */ + memcpy(tag, state + 6, 4); + memcpy(tag + 4, state + 18, 4); +} + +int spoc_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_128_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOC_128_TAG_SIZE; + + /* Initialize the SpoC-128 state and absorb the associated data */ + spoc_128_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen != 0) { + while (mlen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, m, SPOC_128_RATE); + lw_xor_block_2_src(c, m, state, SPOC_128_RATE); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_128_RATE; + m += SPOC_128_RATE; + mlen -= SPOC_128_RATE; + } + if (mlen != 0) { + unsigned temp = (unsigned)mlen; + sliscp_light256_permute_spoc(state); + lw_xor_block(state + 16, m, temp); + lw_xor_block_2_src(c, m, state, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x50; /* domain separation */ + c += mlen; + } + } + + /* Finalize and generate the authentication tag */ + spoc_128_finalize(state, c); + return 0; +} + +int spoc_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_128_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOC_128_TAG_SIZE) + return -1; + *mlen = clen - SPOC_128_TAG_SIZE; + + /* Initialize the Spoc-128 state and absorb the associated data */ + spoc_128_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOC_128_TAG_SIZE; + if (clen != 0) { + while (clen >= SPOC_128_RATE) { + sliscp_light256_permute_spoc(state); + lw_xor_block_2_src(m, c, state, SPOC_128_RATE); + lw_xor_block(state + 16, m, SPOC_128_RATE); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_128_RATE; + m += SPOC_128_RATE; + clen -= SPOC_128_RATE; + } + if (clen != 0) { + unsigned temp = (unsigned)clen; + sliscp_light256_permute_spoc(state); + lw_xor_block_2_src(m, c, state, temp); + lw_xor_block(state + 16, m, temp); + state[temp + 16] ^= 0x80; /* padding */ + state[0] ^= 0x50; /* domain separation */ + c += clen; + } + } + + /* Finalize and check the authentication tag */ + spoc_128_finalize(state, state); + return aead_check_tag(mtemp, *mlen, state, c, SPOC_128_TAG_SIZE); +} + +int spoc_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_64_STATE_SIZE]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOC_64_TAG_SIZE; + + /* Initialize the SpoC-64 state and absorb the associated data */ + spoc_64_init(state, k, npub, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen != 0) { + while (mlen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block(state + 6, m, 4); + lw_xor_block(state + 18, m + 4, 4); + lw_xor_block_2_src(c, m, state, 4); + lw_xor_block_2_src(c + 4, m + 4, state + 12, 4); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_64_RATE; + m += SPOC_64_RATE; + mlen -= SPOC_64_RATE; + } + if (mlen != 0) { + unsigned temp = (unsigned)mlen; + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + while (temp > 0) { + --temp; + unsigned char mbyte = m[temp]; + state[spoc_64_mask_posn[temp]] ^= mbyte; + c[temp] = mbyte ^ state[spoc_64_rate_posn[temp]]; + } + state[0] ^= 0x50; /* domain separation */ + c += mlen; + } + } + + /* Finalize and generate the authentication tag */ + spoc_64_finalize(state, c); + return 0; +} + +int spoc_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[SPOC_64_STATE_SIZE]; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOC_64_TAG_SIZE) + return -1; + *mlen = clen - SPOC_64_TAG_SIZE; + + /* Initialize the Spoc-64 state and absorb the associated data */ + spoc_64_init(state, k, npub, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOC_64_TAG_SIZE; + if (clen != 0) { + while (clen >= SPOC_64_RATE) { + sliscp_light192_permute(state); + lw_xor_block_2_src(m, c, state, 4); + lw_xor_block_2_src(m + 4, c + 4, state + 12, 4); + lw_xor_block(state + 6, m, 4); + lw_xor_block(state + 18, m + 4, 4); + state[0] ^= 0x40; /* domain separation */ + c += SPOC_64_RATE; + m += SPOC_64_RATE; + clen -= SPOC_64_RATE; + } + if (clen != 0) { + unsigned temp = (unsigned)clen; + sliscp_light192_permute(state); + state[spoc_64_mask_posn[temp]] ^= 0x80; /* padding */ + while (temp > 0) { + --temp; + unsigned char mbyte = c[temp] ^ state[spoc_64_rate_posn[temp]]; + state[spoc_64_mask_posn[temp]] ^= mbyte; + m[temp] = mbyte; + } + state[0] ^= 0x50; /* domain separation */ + c += clen; + } + } + + /* Finalize and check the authentication tag */ + spoc_64_finalize(state, state); + return aead_check_tag(mtemp, *mlen, state, c, SPOC_64_TAG_SIZE); +} diff --git a/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.h b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.h new file mode 100644 index 0000000..712c2d0 --- /dev/null +++ b/spoc/Implementations/crypto_aead/spoc64sliscplight192v1/rhys-avr/spoc.h @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOC_H +#define LWCRYPTO_SPOC_H + +#include "aead-common.h" + +/** + * \file spoc.h + * \brief SpoC authenticated encryption algorithm. + * + * SpoC is a family of authenticated encryption algorithms with two + * members, SpoC-128 and Spoc-64. The algorithms use a Beetle-like + * sponge construction built on top of the sLiSCP-light permutation. + * + * \li Spoc-128 has a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * It is built around the 256-bit version of the sLiSCP-light permutation. + * This is the primary member of the family. + * \li Spoc-64 has a 128-bit key, a 128-bit nonce, and a 64-bit tag. + * It is built around the 192-bit version of the sLiSCP-light permutation. + * + * Spoc-128 has good performance on small packets (16 bytes or less) + * on 32-bit embedded platforms. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/spoc + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SpoC variants. + */ +#define SPOC_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for SpoC-128. + */ +#define SPOC_128_TAG_SIZE 16 + +/** + * \brief Size of the authentication tag for SpoC-64. + */ +#define SPOC_64_TAG_SIZE 8 + +/** + * \brief Size of the nonce for all SpoC variants. + */ +#define SPOC_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SpoC-128 cipher. + */ +extern aead_cipher_t const spoc_128_cipher; + +/** + * \brief Meta-information block for the SpoC-64 cipher. + */ +extern aead_cipher_t const spoc_64_cipher; + +/** + * \brief Encrypts and authenticates a packet with SpoC-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spoc_128_aead_decrypt() + */ +int spoc_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SpoC-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spoc_128_aead_encrypt() + */ +int spoc_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SpoC-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spoc_64_aead_decrypt() + */ +int spoc_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SpoC-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spoc_64_aead_encrypt() + */ +int spoc_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.c b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.h b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/api.h b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/api.h new file mode 100644 index 0000000..fb1dab8 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/encrypt.c b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..df13efc --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spook.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_384_mu_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_384_mu_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.c b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.c new file mode 100644 index 0000000..0e19216 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spook.h" + +/** + * \brief Number of steps in the Clyde-128 block cipher. + * + * This is also the number of steps in the Shadow-512 and Shadow-384 + * permutations. + */ +#define CLYDE128_STEPS 6 + +/** + * \brief Round constants for the steps of Clyde-128. + */ +static uint8_t const rc[CLYDE128_STEPS][8] = { + {1, 0, 0, 0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1}, + {1, 1, 0, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 1, 0, 0, 1, 1, 1} +}; + +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t c, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); + s0 = le_load_word32((const unsigned char *)&(input[0])); + s1 = le_load_word32((const unsigned char *)&(input[1])); + s2 = le_load_word32((const unsigned char *)&(input[2])); + s3 = le_load_word32((const unsigned char *)&(input[3])); +#endif + + /* Add the initial tweakey to the state */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Perform the two rounds of this step */ + #define clyde128_sbox(s0, s1, s2, s3) \ + do { \ + c = (s0 & s1) ^ s2; \ + d = (s3 & s0) ^ s1; \ + s2 = (c & d) ^ s3; \ + s3 = (c & s3) ^ s0; \ + s0 = d; \ + s1 = c; \ + } while (0) + #define clyde128_lbox(x, y) \ + do { \ + c = x ^ rightRotate12(x); \ + d = y ^ rightRotate12(y); \ + c ^= rightRotate3(c); \ + d ^= rightRotate3(d); \ + x = c ^ leftRotate15(x); \ + y = d ^ leftRotate15(y); \ + c = x ^ leftRotate1(x); \ + d = y ^ leftRotate1(y); \ + x ^= leftRotate6(d); \ + y ^= leftRotate7(c); \ + x ^= rightRotate15(c); \ + y ^= rightRotate15(d); \ + } while (0) + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + + /* Update the tweakey on the fly and add it to the state */ + c = t2 ^ t0; + d = t3 ^ t1; + t2 = t0; + t3 = t1; + t0 = c; + t1 = d; + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + } + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t a, b, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); +#endif + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Perform all rounds in pairs */ + for (step = CLYDE128_STEPS - 1; step >= 0; --step) { + /* Add the tweakey to the state and update the tweakey */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + a = t2 ^ t0; + b = t3 ^ t1; + t0 = t2; + t1 = t3; + t2 = a; + t3 = b; + + /* Perform the two rounds of this step */ + #define clyde128_inv_sbox(s0, s1, s2, s3) \ + do { \ + d = (s0 & s1) ^ s2; \ + a = (s1 & d) ^ s3; \ + b = (d & a) ^ s0; \ + s2 = (a & b) ^ s1; \ + s0 = a; \ + s1 = b; \ + s3 = d; \ + } while (0) + #define clyde128_inv_lbox(x, y) \ + do { \ + a = x ^ leftRotate7(x); \ + b = y ^ leftRotate7(y); \ + x ^= leftRotate1(a); \ + y ^= leftRotate1(b); \ + x ^= leftRotate12(a); \ + y ^= leftRotate12(b); \ + a = x ^ leftRotate1(x); \ + b = y ^ leftRotate1(y); \ + x ^= leftRotate6(b); \ + y ^= leftRotate7(a); \ + a ^= leftRotate15(x); \ + b ^= leftRotate15(y); \ + x = rightRotate16(a); \ + y = rightRotate16(b); \ + } while (0) + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + } + + /* Add the tweakey to the state one last time */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void shadow512(shadow512_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t s30, s31, s32, s33; + uint32_t c, d, w, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; + s30 = state->W[12]; + s31 = state->W[13]; + s32 = state->W[14]; + s33 = state->W[15]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); + s30 = le_load_word32(state->B + 48); + s31 = le_load_word32(state->B + 52); + s32 = le_load_word32(state->B + 56); + s33 = le_load_word32(state->B + 60); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the S-box and L-box to bundle 3 */ + clyde128_sbox(s30, s31, s32, s33); + clyde128_lbox(s30, s31); + clyde128_lbox(s32, s33); + s30 ^= rc[step][0] << 3; + s31 ^= rc[step][1] << 3; + s32 ^= rc[step][2] << 3; + s33 ^= rc[step][3] << 3; + clyde128_sbox(s30, s31, s32, s33); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow512_diffusion_layer(row) \ + do { \ + w = s0##row; \ + x = s1##row; \ + y = s2##row; \ + z = s3##row; \ + c = w ^ x; \ + d = y ^ z; \ + s0##row = x ^ d; \ + s1##row = w ^ d; \ + s2##row = c ^ z; \ + s3##row = c ^ y; \ + } while (0) + shadow512_diffusion_layer(0); + shadow512_diffusion_layer(1); + shadow512_diffusion_layer(2); + shadow512_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + s30 ^= rc[step][4] << 3; + s31 ^= rc[step][5] << 3; + s32 ^= rc[step][6] << 3; + s33 ^= rc[step][7] << 3; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; + state->W[12] = s30; + state->W[13] = s31; + state->W[14] = s32; + state->W[15] = s33; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); + le_store_word32(state->B + 48, s30); + le_store_word32(state->B + 52, s31); + le_store_word32(state->B + 56, s32); + le_store_word32(state->B + 60, s33); +#endif +} + +void shadow384(shadow384_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t c, d, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow384_diffusion_layer(row) \ + do { \ + x = s0##row; \ + y = s1##row; \ + z = s2##row; \ + s0##row = x ^ y ^ z; \ + s1##row = x ^ z; \ + s2##row = x ^ y; \ + } while (0) + shadow384_diffusion_layer(0); + shadow384_diffusion_layer(1); + shadow384_diffusion_layer(2); + shadow384_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); +#endif +} diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.h b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.h new file mode 100644 index 0000000..b08ce80 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-spook.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPOOK_H +#define LW_INTERNAL_SPOOK_H + +#include "internal-util.h" + +/** + * \file internal-spook.h + * \brief Internal implementation details of the Spook AEAD mode. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the block for the Clyde-128 block cipher. + */ +#define CLYDE128_BLOCK_SIZE 16 + +/** + * \brief Size of the key for the Clyde-128 block cipher. + */ +#define CLYDE128_KEY_SIZE 16 + +/** + * \brief Size of the tweak for the Clyde-128 block cipher. + */ +#define CLYDE128_TWEAK_SIZE 16 + +/** + * \brief Size of the state for Shadow-512. + */ +#define SHADOW512_STATE_SIZE 64 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-512 state. + */ +#define SHADOW512_RATE 32 + +/** + * \brief Size of the state for Shadow-384. + */ +#define SHADOW384_STATE_SIZE 48 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-384 state. + */ +#define SHADOW384_RATE 16 + +/** + * \brief Internal state of the Shadow-512 permutation. + */ +typedef union +{ + uint32_t W[SHADOW512_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW512_STATE_SIZE]; /**< Bytes of the state */ + +} shadow512_state_t; + +/** + * \brief Internal state of the Shadow-384 permutation. + */ +typedef union +{ + uint32_t W[SHADOW384_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW384_STATE_SIZE]; /**< Bytes of the state */ + +} shadow384_state_t; + +/** + * \brief Encrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to encrypt with. + * \param tweak Points to the tweak to encrypt with. + * \param output Output buffer for the ciphertext. + * \param input Input buffer for the plaintext. + * + * \sa clyde128_decrypt() + */ +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]); + +/** + * \brief Decrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to decrypt with. + * \param tweak Points to the tweak to decrypt with. + * \param output Output buffer for the plaintext. + * \param input Input buffer for the ciphertext. + * + * \sa clyde128_encrypt() + */ +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]); + +/** + * \brief Performs the Shadow-512 permutation on a state. + * + * \param state The Shadow-512 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow384() + */ +void shadow512(shadow512_state_t *state); + +/** + * \brief Performs the Shadow-384 permutation on a state. + * + * \param state The Shadow-384 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow512() + */ +void shadow384(shadow384_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-util.h b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.c b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.c new file mode 100644 index 0000000..d075b33 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.c @@ -0,0 +1,552 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spook.h" +#include "internal-spook.h" +#include "internal-util.h" +#include + +aead_cipher_t const spook_128_512_su_cipher = { + "Spook-128-512-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_su_aead_encrypt, + spook_128_512_su_aead_decrypt +}; + +aead_cipher_t const spook_128_384_su_cipher = { + "Spook-128-384-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_su_aead_encrypt, + spook_128_384_su_aead_decrypt +}; + +aead_cipher_t const spook_128_512_mu_cipher = { + "Spook-128-512-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_mu_aead_encrypt, + spook_128_512_mu_aead_decrypt +}; + +aead_cipher_t const spook_128_384_mu_cipher = { + "Spook-128-384-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_mu_aead_encrypt, + spook_128_384_mu_aead_decrypt +}; + +/** + * \brief Initializes the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_512_init + (shadow512_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW512_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 12, state->W + 4); + shadow512(state); +} + +/** + * \brief Initializes the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_384_init + (shadow384_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW384_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 8, state->W + 4); + shadow384(state); +} + +/** + * \brief Absorbs associated data into the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_512_absorb + (shadow512_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW512_RATE) { + lw_xor_block(state->B, ad, SHADOW512_RATE); + shadow512(state); + ad += SHADOW512_RATE; + adlen -= SHADOW512_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Absorbs associated data into the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_384_absorb + (shadow384_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW384_RATE) { + lw_xor_block(state->B, ad, SHADOW384_RATE); + shadow384(state); + ad += SHADOW384_RATE; + adlen -= SHADOW384_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_512_encrypt + (shadow512_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (mlen >= SHADOW512_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + mlen -= SHADOW512_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_384_encrypt + (shadow384_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (mlen >= SHADOW384_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + mlen -= SHADOW384_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_512_decrypt + (shadow512_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (clen >= SHADOW512_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + clen -= SHADOW512_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_384_decrypt + (shadow384_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (clen >= SHADOW384_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + clen -= SHADOW384_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} diff --git a/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.h b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.h new file mode 100644 index 0000000..68b6a25 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu384v1/rhys-avr/spook.h @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOOK_H +#define LWCRYPTO_SPOOK_H + +#include "aead-common.h" + +/** + * \file spook.h + * \brief Spook authenticated encryption algorithm. + * + * Spook is a family of authenticated encryption algorithms that are + * built around a tweakable block cipher and a permutation. If the + * tweakable block cipher is implemented as a masked block cipher, + * then Spook provides protection against power analysis side channels. + * + * There are four members in the Spook family: + * + * \li Spook-128-512-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 512-bit permutation. This is the primary + * member of the family. + * \li Spook-128-384-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 384-bit permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 512-bit + * permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 384-bit + * permutation. + * + * In this library, the "mu" (multi-user) variants combine the 128-bit key + * and the 128-bit public tweak into a single 256-bit key value. + * Applications can either view this as a cipher with a 256-bit key, + * or they can split the key value into secret and public halves. + * Even with the use of 256-bit keys, Spook only has 128-bit security. + * + * References: https://www.spook.dev/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for the single-user version of Spook. + */ +#define SPOOK_SU_KEY_SIZE 16 + +/** + * \brief Size of the key for the multi-user version of Spook. + */ +#define SPOOK_MU_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all Spook family members. + */ +#define SPOOK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all Spook family members. + */ +#define SPOOK_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the Spook-128-512-su cipher. + */ +extern aead_cipher_t const spook_128_512_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-su cipher. + */ +extern aead_cipher_t const spook_128_384_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-512-mu cipher. + */ +extern aead_cipher_t const spook_128_512_mu_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-mu cipher. + */ +extern aead_cipher_t const spook_128_384_mu_cipher; + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_su_aead_decrypt() + */ +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_su_aead_encrypt() + */ +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_su_aead_decrypt() + */ +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_su_aead_encrypt() + */ +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_mu_aead_decrypt() + */ +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_mu_aead_encrypt() + */ +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_mu_aead_decrypt() + */ +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_mu_aead_encrypt() + */ +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.c b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.h b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/api.h b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/api.h new file mode 100644 index 0000000..fb1dab8 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/encrypt.c b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..52c6ec8 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spook.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_512_mu_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_512_mu_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.c b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.c new file mode 100644 index 0000000..0e19216 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spook.h" + +/** + * \brief Number of steps in the Clyde-128 block cipher. + * + * This is also the number of steps in the Shadow-512 and Shadow-384 + * permutations. + */ +#define CLYDE128_STEPS 6 + +/** + * \brief Round constants for the steps of Clyde-128. + */ +static uint8_t const rc[CLYDE128_STEPS][8] = { + {1, 0, 0, 0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1}, + {1, 1, 0, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 1, 0, 0, 1, 1, 1} +}; + +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t c, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); + s0 = le_load_word32((const unsigned char *)&(input[0])); + s1 = le_load_word32((const unsigned char *)&(input[1])); + s2 = le_load_word32((const unsigned char *)&(input[2])); + s3 = le_load_word32((const unsigned char *)&(input[3])); +#endif + + /* Add the initial tweakey to the state */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Perform the two rounds of this step */ + #define clyde128_sbox(s0, s1, s2, s3) \ + do { \ + c = (s0 & s1) ^ s2; \ + d = (s3 & s0) ^ s1; \ + s2 = (c & d) ^ s3; \ + s3 = (c & s3) ^ s0; \ + s0 = d; \ + s1 = c; \ + } while (0) + #define clyde128_lbox(x, y) \ + do { \ + c = x ^ rightRotate12(x); \ + d = y ^ rightRotate12(y); \ + c ^= rightRotate3(c); \ + d ^= rightRotate3(d); \ + x = c ^ leftRotate15(x); \ + y = d ^ leftRotate15(y); \ + c = x ^ leftRotate1(x); \ + d = y ^ leftRotate1(y); \ + x ^= leftRotate6(d); \ + y ^= leftRotate7(c); \ + x ^= rightRotate15(c); \ + y ^= rightRotate15(d); \ + } while (0) + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + + /* Update the tweakey on the fly and add it to the state */ + c = t2 ^ t0; + d = t3 ^ t1; + t2 = t0; + t3 = t1; + t0 = c; + t1 = d; + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + } + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t a, b, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); +#endif + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Perform all rounds in pairs */ + for (step = CLYDE128_STEPS - 1; step >= 0; --step) { + /* Add the tweakey to the state and update the tweakey */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + a = t2 ^ t0; + b = t3 ^ t1; + t0 = t2; + t1 = t3; + t2 = a; + t3 = b; + + /* Perform the two rounds of this step */ + #define clyde128_inv_sbox(s0, s1, s2, s3) \ + do { \ + d = (s0 & s1) ^ s2; \ + a = (s1 & d) ^ s3; \ + b = (d & a) ^ s0; \ + s2 = (a & b) ^ s1; \ + s0 = a; \ + s1 = b; \ + s3 = d; \ + } while (0) + #define clyde128_inv_lbox(x, y) \ + do { \ + a = x ^ leftRotate7(x); \ + b = y ^ leftRotate7(y); \ + x ^= leftRotate1(a); \ + y ^= leftRotate1(b); \ + x ^= leftRotate12(a); \ + y ^= leftRotate12(b); \ + a = x ^ leftRotate1(x); \ + b = y ^ leftRotate1(y); \ + x ^= leftRotate6(b); \ + y ^= leftRotate7(a); \ + a ^= leftRotate15(x); \ + b ^= leftRotate15(y); \ + x = rightRotate16(a); \ + y = rightRotate16(b); \ + } while (0) + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + } + + /* Add the tweakey to the state one last time */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void shadow512(shadow512_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t s30, s31, s32, s33; + uint32_t c, d, w, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; + s30 = state->W[12]; + s31 = state->W[13]; + s32 = state->W[14]; + s33 = state->W[15]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); + s30 = le_load_word32(state->B + 48); + s31 = le_load_word32(state->B + 52); + s32 = le_load_word32(state->B + 56); + s33 = le_load_word32(state->B + 60); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the S-box and L-box to bundle 3 */ + clyde128_sbox(s30, s31, s32, s33); + clyde128_lbox(s30, s31); + clyde128_lbox(s32, s33); + s30 ^= rc[step][0] << 3; + s31 ^= rc[step][1] << 3; + s32 ^= rc[step][2] << 3; + s33 ^= rc[step][3] << 3; + clyde128_sbox(s30, s31, s32, s33); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow512_diffusion_layer(row) \ + do { \ + w = s0##row; \ + x = s1##row; \ + y = s2##row; \ + z = s3##row; \ + c = w ^ x; \ + d = y ^ z; \ + s0##row = x ^ d; \ + s1##row = w ^ d; \ + s2##row = c ^ z; \ + s3##row = c ^ y; \ + } while (0) + shadow512_diffusion_layer(0); + shadow512_diffusion_layer(1); + shadow512_diffusion_layer(2); + shadow512_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + s30 ^= rc[step][4] << 3; + s31 ^= rc[step][5] << 3; + s32 ^= rc[step][6] << 3; + s33 ^= rc[step][7] << 3; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; + state->W[12] = s30; + state->W[13] = s31; + state->W[14] = s32; + state->W[15] = s33; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); + le_store_word32(state->B + 48, s30); + le_store_word32(state->B + 52, s31); + le_store_word32(state->B + 56, s32); + le_store_word32(state->B + 60, s33); +#endif +} + +void shadow384(shadow384_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t c, d, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow384_diffusion_layer(row) \ + do { \ + x = s0##row; \ + y = s1##row; \ + z = s2##row; \ + s0##row = x ^ y ^ z; \ + s1##row = x ^ z; \ + s2##row = x ^ y; \ + } while (0) + shadow384_diffusion_layer(0); + shadow384_diffusion_layer(1); + shadow384_diffusion_layer(2); + shadow384_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); +#endif +} diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.h b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.h new file mode 100644 index 0000000..b08ce80 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-spook.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPOOK_H +#define LW_INTERNAL_SPOOK_H + +#include "internal-util.h" + +/** + * \file internal-spook.h + * \brief Internal implementation details of the Spook AEAD mode. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the block for the Clyde-128 block cipher. + */ +#define CLYDE128_BLOCK_SIZE 16 + +/** + * \brief Size of the key for the Clyde-128 block cipher. + */ +#define CLYDE128_KEY_SIZE 16 + +/** + * \brief Size of the tweak for the Clyde-128 block cipher. + */ +#define CLYDE128_TWEAK_SIZE 16 + +/** + * \brief Size of the state for Shadow-512. + */ +#define SHADOW512_STATE_SIZE 64 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-512 state. + */ +#define SHADOW512_RATE 32 + +/** + * \brief Size of the state for Shadow-384. + */ +#define SHADOW384_STATE_SIZE 48 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-384 state. + */ +#define SHADOW384_RATE 16 + +/** + * \brief Internal state of the Shadow-512 permutation. + */ +typedef union +{ + uint32_t W[SHADOW512_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW512_STATE_SIZE]; /**< Bytes of the state */ + +} shadow512_state_t; + +/** + * \brief Internal state of the Shadow-384 permutation. + */ +typedef union +{ + uint32_t W[SHADOW384_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW384_STATE_SIZE]; /**< Bytes of the state */ + +} shadow384_state_t; + +/** + * \brief Encrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to encrypt with. + * \param tweak Points to the tweak to encrypt with. + * \param output Output buffer for the ciphertext. + * \param input Input buffer for the plaintext. + * + * \sa clyde128_decrypt() + */ +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]); + +/** + * \brief Decrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to decrypt with. + * \param tweak Points to the tweak to decrypt with. + * \param output Output buffer for the plaintext. + * \param input Input buffer for the ciphertext. + * + * \sa clyde128_encrypt() + */ +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]); + +/** + * \brief Performs the Shadow-512 permutation on a state. + * + * \param state The Shadow-512 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow384() + */ +void shadow512(shadow512_state_t *state); + +/** + * \brief Performs the Shadow-384 permutation on a state. + * + * \param state The Shadow-384 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow512() + */ +void shadow384(shadow384_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-util.h b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.c b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.c new file mode 100644 index 0000000..d075b33 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.c @@ -0,0 +1,552 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spook.h" +#include "internal-spook.h" +#include "internal-util.h" +#include + +aead_cipher_t const spook_128_512_su_cipher = { + "Spook-128-512-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_su_aead_encrypt, + spook_128_512_su_aead_decrypt +}; + +aead_cipher_t const spook_128_384_su_cipher = { + "Spook-128-384-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_su_aead_encrypt, + spook_128_384_su_aead_decrypt +}; + +aead_cipher_t const spook_128_512_mu_cipher = { + "Spook-128-512-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_mu_aead_encrypt, + spook_128_512_mu_aead_decrypt +}; + +aead_cipher_t const spook_128_384_mu_cipher = { + "Spook-128-384-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_mu_aead_encrypt, + spook_128_384_mu_aead_decrypt +}; + +/** + * \brief Initializes the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_512_init + (shadow512_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW512_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 12, state->W + 4); + shadow512(state); +} + +/** + * \brief Initializes the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_384_init + (shadow384_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW384_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 8, state->W + 4); + shadow384(state); +} + +/** + * \brief Absorbs associated data into the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_512_absorb + (shadow512_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW512_RATE) { + lw_xor_block(state->B, ad, SHADOW512_RATE); + shadow512(state); + ad += SHADOW512_RATE; + adlen -= SHADOW512_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Absorbs associated data into the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_384_absorb + (shadow384_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW384_RATE) { + lw_xor_block(state->B, ad, SHADOW384_RATE); + shadow384(state); + ad += SHADOW384_RATE; + adlen -= SHADOW384_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_512_encrypt + (shadow512_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (mlen >= SHADOW512_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + mlen -= SHADOW512_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_384_encrypt + (shadow384_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (mlen >= SHADOW384_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + mlen -= SHADOW384_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_512_decrypt + (shadow512_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (clen >= SHADOW512_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + clen -= SHADOW512_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_384_decrypt + (shadow384_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (clen >= SHADOW384_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + clen -= SHADOW384_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} diff --git a/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.h b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.h new file mode 100644 index 0000000..68b6a25 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128mu512v1/rhys-avr/spook.h @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOOK_H +#define LWCRYPTO_SPOOK_H + +#include "aead-common.h" + +/** + * \file spook.h + * \brief Spook authenticated encryption algorithm. + * + * Spook is a family of authenticated encryption algorithms that are + * built around a tweakable block cipher and a permutation. If the + * tweakable block cipher is implemented as a masked block cipher, + * then Spook provides protection against power analysis side channels. + * + * There are four members in the Spook family: + * + * \li Spook-128-512-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 512-bit permutation. This is the primary + * member of the family. + * \li Spook-128-384-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 384-bit permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 512-bit + * permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 384-bit + * permutation. + * + * In this library, the "mu" (multi-user) variants combine the 128-bit key + * and the 128-bit public tweak into a single 256-bit key value. + * Applications can either view this as a cipher with a 256-bit key, + * or they can split the key value into secret and public halves. + * Even with the use of 256-bit keys, Spook only has 128-bit security. + * + * References: https://www.spook.dev/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for the single-user version of Spook. + */ +#define SPOOK_SU_KEY_SIZE 16 + +/** + * \brief Size of the key for the multi-user version of Spook. + */ +#define SPOOK_MU_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all Spook family members. + */ +#define SPOOK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all Spook family members. + */ +#define SPOOK_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the Spook-128-512-su cipher. + */ +extern aead_cipher_t const spook_128_512_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-su cipher. + */ +extern aead_cipher_t const spook_128_384_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-512-mu cipher. + */ +extern aead_cipher_t const spook_128_512_mu_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-mu cipher. + */ +extern aead_cipher_t const spook_128_384_mu_cipher; + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_su_aead_decrypt() + */ +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_su_aead_encrypt() + */ +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_su_aead_decrypt() + */ +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_su_aead_encrypt() + */ +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_mu_aead_decrypt() + */ +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_mu_aead_encrypt() + */ +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_mu_aead_decrypt() + */ +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_mu_aead_encrypt() + */ +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.c b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.h b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/api.h b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/encrypt.c b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..e61a44a --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spook.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_384_su_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_384_su_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.c b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.c new file mode 100644 index 0000000..0e19216 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spook.h" + +/** + * \brief Number of steps in the Clyde-128 block cipher. + * + * This is also the number of steps in the Shadow-512 and Shadow-384 + * permutations. + */ +#define CLYDE128_STEPS 6 + +/** + * \brief Round constants for the steps of Clyde-128. + */ +static uint8_t const rc[CLYDE128_STEPS][8] = { + {1, 0, 0, 0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1}, + {1, 1, 0, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 1, 0, 0, 1, 1, 1} +}; + +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t c, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); + s0 = le_load_word32((const unsigned char *)&(input[0])); + s1 = le_load_word32((const unsigned char *)&(input[1])); + s2 = le_load_word32((const unsigned char *)&(input[2])); + s3 = le_load_word32((const unsigned char *)&(input[3])); +#endif + + /* Add the initial tweakey to the state */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Perform the two rounds of this step */ + #define clyde128_sbox(s0, s1, s2, s3) \ + do { \ + c = (s0 & s1) ^ s2; \ + d = (s3 & s0) ^ s1; \ + s2 = (c & d) ^ s3; \ + s3 = (c & s3) ^ s0; \ + s0 = d; \ + s1 = c; \ + } while (0) + #define clyde128_lbox(x, y) \ + do { \ + c = x ^ rightRotate12(x); \ + d = y ^ rightRotate12(y); \ + c ^= rightRotate3(c); \ + d ^= rightRotate3(d); \ + x = c ^ leftRotate15(x); \ + y = d ^ leftRotate15(y); \ + c = x ^ leftRotate1(x); \ + d = y ^ leftRotate1(y); \ + x ^= leftRotate6(d); \ + y ^= leftRotate7(c); \ + x ^= rightRotate15(c); \ + y ^= rightRotate15(d); \ + } while (0) + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + + /* Update the tweakey on the fly and add it to the state */ + c = t2 ^ t0; + d = t3 ^ t1; + t2 = t0; + t3 = t1; + t0 = c; + t1 = d; + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + } + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t a, b, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); +#endif + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Perform all rounds in pairs */ + for (step = CLYDE128_STEPS - 1; step >= 0; --step) { + /* Add the tweakey to the state and update the tweakey */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + a = t2 ^ t0; + b = t3 ^ t1; + t0 = t2; + t1 = t3; + t2 = a; + t3 = b; + + /* Perform the two rounds of this step */ + #define clyde128_inv_sbox(s0, s1, s2, s3) \ + do { \ + d = (s0 & s1) ^ s2; \ + a = (s1 & d) ^ s3; \ + b = (d & a) ^ s0; \ + s2 = (a & b) ^ s1; \ + s0 = a; \ + s1 = b; \ + s3 = d; \ + } while (0) + #define clyde128_inv_lbox(x, y) \ + do { \ + a = x ^ leftRotate7(x); \ + b = y ^ leftRotate7(y); \ + x ^= leftRotate1(a); \ + y ^= leftRotate1(b); \ + x ^= leftRotate12(a); \ + y ^= leftRotate12(b); \ + a = x ^ leftRotate1(x); \ + b = y ^ leftRotate1(y); \ + x ^= leftRotate6(b); \ + y ^= leftRotate7(a); \ + a ^= leftRotate15(x); \ + b ^= leftRotate15(y); \ + x = rightRotate16(a); \ + y = rightRotate16(b); \ + } while (0) + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + } + + /* Add the tweakey to the state one last time */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void shadow512(shadow512_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t s30, s31, s32, s33; + uint32_t c, d, w, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; + s30 = state->W[12]; + s31 = state->W[13]; + s32 = state->W[14]; + s33 = state->W[15]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); + s30 = le_load_word32(state->B + 48); + s31 = le_load_word32(state->B + 52); + s32 = le_load_word32(state->B + 56); + s33 = le_load_word32(state->B + 60); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the S-box and L-box to bundle 3 */ + clyde128_sbox(s30, s31, s32, s33); + clyde128_lbox(s30, s31); + clyde128_lbox(s32, s33); + s30 ^= rc[step][0] << 3; + s31 ^= rc[step][1] << 3; + s32 ^= rc[step][2] << 3; + s33 ^= rc[step][3] << 3; + clyde128_sbox(s30, s31, s32, s33); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow512_diffusion_layer(row) \ + do { \ + w = s0##row; \ + x = s1##row; \ + y = s2##row; \ + z = s3##row; \ + c = w ^ x; \ + d = y ^ z; \ + s0##row = x ^ d; \ + s1##row = w ^ d; \ + s2##row = c ^ z; \ + s3##row = c ^ y; \ + } while (0) + shadow512_diffusion_layer(0); + shadow512_diffusion_layer(1); + shadow512_diffusion_layer(2); + shadow512_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + s30 ^= rc[step][4] << 3; + s31 ^= rc[step][5] << 3; + s32 ^= rc[step][6] << 3; + s33 ^= rc[step][7] << 3; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; + state->W[12] = s30; + state->W[13] = s31; + state->W[14] = s32; + state->W[15] = s33; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); + le_store_word32(state->B + 48, s30); + le_store_word32(state->B + 52, s31); + le_store_word32(state->B + 56, s32); + le_store_word32(state->B + 60, s33); +#endif +} + +void shadow384(shadow384_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t c, d, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow384_diffusion_layer(row) \ + do { \ + x = s0##row; \ + y = s1##row; \ + z = s2##row; \ + s0##row = x ^ y ^ z; \ + s1##row = x ^ z; \ + s2##row = x ^ y; \ + } while (0) + shadow384_diffusion_layer(0); + shadow384_diffusion_layer(1); + shadow384_diffusion_layer(2); + shadow384_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); +#endif +} diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.h b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.h new file mode 100644 index 0000000..b08ce80 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-spook.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPOOK_H +#define LW_INTERNAL_SPOOK_H + +#include "internal-util.h" + +/** + * \file internal-spook.h + * \brief Internal implementation details of the Spook AEAD mode. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the block for the Clyde-128 block cipher. + */ +#define CLYDE128_BLOCK_SIZE 16 + +/** + * \brief Size of the key for the Clyde-128 block cipher. + */ +#define CLYDE128_KEY_SIZE 16 + +/** + * \brief Size of the tweak for the Clyde-128 block cipher. + */ +#define CLYDE128_TWEAK_SIZE 16 + +/** + * \brief Size of the state for Shadow-512. + */ +#define SHADOW512_STATE_SIZE 64 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-512 state. + */ +#define SHADOW512_RATE 32 + +/** + * \brief Size of the state for Shadow-384. + */ +#define SHADOW384_STATE_SIZE 48 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-384 state. + */ +#define SHADOW384_RATE 16 + +/** + * \brief Internal state of the Shadow-512 permutation. + */ +typedef union +{ + uint32_t W[SHADOW512_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW512_STATE_SIZE]; /**< Bytes of the state */ + +} shadow512_state_t; + +/** + * \brief Internal state of the Shadow-384 permutation. + */ +typedef union +{ + uint32_t W[SHADOW384_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW384_STATE_SIZE]; /**< Bytes of the state */ + +} shadow384_state_t; + +/** + * \brief Encrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to encrypt with. + * \param tweak Points to the tweak to encrypt with. + * \param output Output buffer for the ciphertext. + * \param input Input buffer for the plaintext. + * + * \sa clyde128_decrypt() + */ +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]); + +/** + * \brief Decrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to decrypt with. + * \param tweak Points to the tweak to decrypt with. + * \param output Output buffer for the plaintext. + * \param input Input buffer for the ciphertext. + * + * \sa clyde128_encrypt() + */ +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]); + +/** + * \brief Performs the Shadow-512 permutation on a state. + * + * \param state The Shadow-512 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow384() + */ +void shadow512(shadow512_state_t *state); + +/** + * \brief Performs the Shadow-384 permutation on a state. + * + * \param state The Shadow-384 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow512() + */ +void shadow384(shadow384_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-util.h b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.c b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.c new file mode 100644 index 0000000..d075b33 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.c @@ -0,0 +1,552 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spook.h" +#include "internal-spook.h" +#include "internal-util.h" +#include + +aead_cipher_t const spook_128_512_su_cipher = { + "Spook-128-512-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_su_aead_encrypt, + spook_128_512_su_aead_decrypt +}; + +aead_cipher_t const spook_128_384_su_cipher = { + "Spook-128-384-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_su_aead_encrypt, + spook_128_384_su_aead_decrypt +}; + +aead_cipher_t const spook_128_512_mu_cipher = { + "Spook-128-512-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_mu_aead_encrypt, + spook_128_512_mu_aead_decrypt +}; + +aead_cipher_t const spook_128_384_mu_cipher = { + "Spook-128-384-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_mu_aead_encrypt, + spook_128_384_mu_aead_decrypt +}; + +/** + * \brief Initializes the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_512_init + (shadow512_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW512_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 12, state->W + 4); + shadow512(state); +} + +/** + * \brief Initializes the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_384_init + (shadow384_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW384_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 8, state->W + 4); + shadow384(state); +} + +/** + * \brief Absorbs associated data into the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_512_absorb + (shadow512_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW512_RATE) { + lw_xor_block(state->B, ad, SHADOW512_RATE); + shadow512(state); + ad += SHADOW512_RATE; + adlen -= SHADOW512_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Absorbs associated data into the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_384_absorb + (shadow384_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW384_RATE) { + lw_xor_block(state->B, ad, SHADOW384_RATE); + shadow384(state); + ad += SHADOW384_RATE; + adlen -= SHADOW384_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_512_encrypt + (shadow512_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (mlen >= SHADOW512_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + mlen -= SHADOW512_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_384_encrypt + (shadow384_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (mlen >= SHADOW384_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + mlen -= SHADOW384_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_512_decrypt + (shadow512_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (clen >= SHADOW512_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + clen -= SHADOW512_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_384_decrypt + (shadow384_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (clen >= SHADOW384_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + clen -= SHADOW384_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} diff --git a/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.h b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.h new file mode 100644 index 0000000..68b6a25 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su384v1/rhys-avr/spook.h @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOOK_H +#define LWCRYPTO_SPOOK_H + +#include "aead-common.h" + +/** + * \file spook.h + * \brief Spook authenticated encryption algorithm. + * + * Spook is a family of authenticated encryption algorithms that are + * built around a tweakable block cipher and a permutation. If the + * tweakable block cipher is implemented as a masked block cipher, + * then Spook provides protection against power analysis side channels. + * + * There are four members in the Spook family: + * + * \li Spook-128-512-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 512-bit permutation. This is the primary + * member of the family. + * \li Spook-128-384-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 384-bit permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 512-bit + * permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 384-bit + * permutation. + * + * In this library, the "mu" (multi-user) variants combine the 128-bit key + * and the 128-bit public tweak into a single 256-bit key value. + * Applications can either view this as a cipher with a 256-bit key, + * or they can split the key value into secret and public halves. + * Even with the use of 256-bit keys, Spook only has 128-bit security. + * + * References: https://www.spook.dev/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for the single-user version of Spook. + */ +#define SPOOK_SU_KEY_SIZE 16 + +/** + * \brief Size of the key for the multi-user version of Spook. + */ +#define SPOOK_MU_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all Spook family members. + */ +#define SPOOK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all Spook family members. + */ +#define SPOOK_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the Spook-128-512-su cipher. + */ +extern aead_cipher_t const spook_128_512_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-su cipher. + */ +extern aead_cipher_t const spook_128_384_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-512-mu cipher. + */ +extern aead_cipher_t const spook_128_512_mu_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-mu cipher. + */ +extern aead_cipher_t const spook_128_384_mu_cipher; + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_su_aead_decrypt() + */ +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_su_aead_encrypt() + */ +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_su_aead_decrypt() + */ +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_su_aead_encrypt() + */ +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_mu_aead_decrypt() + */ +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_mu_aead_encrypt() + */ +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_mu_aead_decrypt() + */ +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_mu_aead_encrypt() + */ +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.c b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.h b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/api.h b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/encrypt.c b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..0d3db2e --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "spook.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_512_su_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return spook_128_512_su_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.c b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.c new file mode 100644 index 0000000..0e19216 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.c @@ -0,0 +1,557 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-spook.h" + +/** + * \brief Number of steps in the Clyde-128 block cipher. + * + * This is also the number of steps in the Shadow-512 and Shadow-384 + * permutations. + */ +#define CLYDE128_STEPS 6 + +/** + * \brief Round constants for the steps of Clyde-128. + */ +static uint8_t const rc[CLYDE128_STEPS][8] = { + {1, 0, 0, 0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1}, + {1, 1, 0, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0, 1}, + {1, 0, 1, 0, 0, 1, 0, 1}, + {1, 1, 1, 0, 0, 1, 1, 1} +}; + +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t c, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); + s0 = le_load_word32((const unsigned char *)&(input[0])); + s1 = le_load_word32((const unsigned char *)&(input[1])); + s2 = le_load_word32((const unsigned char *)&(input[2])); + s3 = le_load_word32((const unsigned char *)&(input[3])); +#endif + + /* Add the initial tweakey to the state */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Perform the two rounds of this step */ + #define clyde128_sbox(s0, s1, s2, s3) \ + do { \ + c = (s0 & s1) ^ s2; \ + d = (s3 & s0) ^ s1; \ + s2 = (c & d) ^ s3; \ + s3 = (c & s3) ^ s0; \ + s0 = d; \ + s1 = c; \ + } while (0) + #define clyde128_lbox(x, y) \ + do { \ + c = x ^ rightRotate12(x); \ + d = y ^ rightRotate12(y); \ + c ^= rightRotate3(c); \ + d ^= rightRotate3(d); \ + x = c ^ leftRotate15(x); \ + y = d ^ leftRotate15(y); \ + c = x ^ leftRotate1(x); \ + d = y ^ leftRotate1(y); \ + x ^= leftRotate6(d); \ + y ^= leftRotate7(c); \ + x ^= rightRotate15(c); \ + y ^= rightRotate15(d); \ + } while (0) + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_sbox(s0, s1, s2, s3); + clyde128_lbox(s0, s1); + clyde128_lbox(s2, s3); + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + + /* Update the tweakey on the fly and add it to the state */ + c = t2 ^ t0; + d = t3 ^ t1; + t2 = t0; + t3 = t1; + t0 = c; + t1 = d; + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + } + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]) +{ + uint32_t k0, k1, k2, k3; + uint32_t t0, t1, t2, t3; + uint32_t s0, s1, s2, s3; + uint32_t a, b, d; + int step; + + /* Unpack the key, tweak, and state */ + k0 = le_load_word32(key); + k1 = le_load_word32(key + 4); + k2 = le_load_word32(key + 8); + k3 = le_load_word32(key + 12); +#if defined(LW_UTIL_LITTLE_ENDIAN) + t0 = tweak[0]; + t1 = tweak[1]; + t2 = tweak[2]; + t3 = tweak[3]; +#else + t0 = le_load_word32((const unsigned char *)&(tweak[0])); + t1 = le_load_word32((const unsigned char *)&(tweak[1])); + t2 = le_load_word32((const unsigned char *)&(tweak[2])); + t3 = le_load_word32((const unsigned char *)&(tweak[3])); +#endif + s0 = le_load_word32(input); + s1 = le_load_word32(input + 4); + s2 = le_load_word32(input + 8); + s3 = le_load_word32(input + 12); + + /* Perform all rounds in pairs */ + for (step = CLYDE128_STEPS - 1; step >= 0; --step) { + /* Add the tweakey to the state and update the tweakey */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + a = t2 ^ t0; + b = t3 ^ t1; + t0 = t2; + t1 = t3; + t2 = a; + t3 = b; + + /* Perform the two rounds of this step */ + #define clyde128_inv_sbox(s0, s1, s2, s3) \ + do { \ + d = (s0 & s1) ^ s2; \ + a = (s1 & d) ^ s3; \ + b = (d & a) ^ s0; \ + s2 = (a & b) ^ s1; \ + s0 = a; \ + s1 = b; \ + s3 = d; \ + } while (0) + #define clyde128_inv_lbox(x, y) \ + do { \ + a = x ^ leftRotate7(x); \ + b = y ^ leftRotate7(y); \ + x ^= leftRotate1(a); \ + y ^= leftRotate1(b); \ + x ^= leftRotate12(a); \ + y ^= leftRotate12(b); \ + a = x ^ leftRotate1(x); \ + b = y ^ leftRotate1(y); \ + x ^= leftRotate6(b); \ + y ^= leftRotate7(a); \ + a ^= leftRotate15(x); \ + b ^= leftRotate15(y); \ + x = rightRotate16(a); \ + y = rightRotate16(b); \ + } while (0) + s0 ^= rc[step][4]; + s1 ^= rc[step][5]; + s2 ^= rc[step][6]; + s3 ^= rc[step][7]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + s0 ^= rc[step][0]; + s1 ^= rc[step][1]; + s2 ^= rc[step][2]; + s3 ^= rc[step][3]; + clyde128_inv_lbox(s0, s1); + clyde128_inv_lbox(s2, s3); + clyde128_inv_sbox(s0, s1, s2, s3); + } + + /* Add the tweakey to the state one last time */ + s0 ^= k0 ^ t0; + s1 ^= k1 ^ t1; + s2 ^= k2 ^ t2; + s3 ^= k3 ^ t3; + + /* Pack the state into the output buffer */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +#else + le_store_word32((unsigned char *)&(output[0]), s0); + le_store_word32((unsigned char *)&(output[1]), s1); + le_store_word32((unsigned char *)&(output[2]), s2); + le_store_word32((unsigned char *)&(output[3]), s3); +#endif +} + +void shadow512(shadow512_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t s30, s31, s32, s33; + uint32_t c, d, w, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; + s30 = state->W[12]; + s31 = state->W[13]; + s32 = state->W[14]; + s33 = state->W[15]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); + s30 = le_load_word32(state->B + 48); + s31 = le_load_word32(state->B + 52); + s32 = le_load_word32(state->B + 56); + s33 = le_load_word32(state->B + 60); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the S-box and L-box to bundle 3 */ + clyde128_sbox(s30, s31, s32, s33); + clyde128_lbox(s30, s31); + clyde128_lbox(s32, s33); + s30 ^= rc[step][0] << 3; + s31 ^= rc[step][1] << 3; + s32 ^= rc[step][2] << 3; + s33 ^= rc[step][3] << 3; + clyde128_sbox(s30, s31, s32, s33); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow512_diffusion_layer(row) \ + do { \ + w = s0##row; \ + x = s1##row; \ + y = s2##row; \ + z = s3##row; \ + c = w ^ x; \ + d = y ^ z; \ + s0##row = x ^ d; \ + s1##row = w ^ d; \ + s2##row = c ^ z; \ + s3##row = c ^ y; \ + } while (0) + shadow512_diffusion_layer(0); + shadow512_diffusion_layer(1); + shadow512_diffusion_layer(2); + shadow512_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + s30 ^= rc[step][4] << 3; + s31 ^= rc[step][5] << 3; + s32 ^= rc[step][6] << 3; + s33 ^= rc[step][7] << 3; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; + state->W[12] = s30; + state->W[13] = s31; + state->W[14] = s32; + state->W[15] = s33; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); + le_store_word32(state->B + 48, s30); + le_store_word32(state->B + 52, s31); + le_store_word32(state->B + 56, s32); + le_store_word32(state->B + 60, s33); +#endif +} + +void shadow384(shadow384_state_t *state) +{ + uint32_t s00, s01, s02, s03; + uint32_t s10, s11, s12, s13; + uint32_t s20, s21, s22, s23; + uint32_t c, d, x, y, z; + int step; + + /* Unpack the state into local variables */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + s00 = state->W[0]; + s01 = state->W[1]; + s02 = state->W[2]; + s03 = state->W[3]; + s10 = state->W[4]; + s11 = state->W[5]; + s12 = state->W[6]; + s13 = state->W[7]; + s20 = state->W[8]; + s21 = state->W[9]; + s22 = state->W[10]; + s23 = state->W[11]; +#else + s00 = le_load_word32(state->B); + s01 = le_load_word32(state->B + 4); + s02 = le_load_word32(state->B + 8); + s03 = le_load_word32(state->B + 12); + s10 = le_load_word32(state->B + 16); + s11 = le_load_word32(state->B + 20); + s12 = le_load_word32(state->B + 24); + s13 = le_load_word32(state->B + 28); + s20 = le_load_word32(state->B + 32); + s21 = le_load_word32(state->B + 36); + s22 = le_load_word32(state->B + 40); + s23 = le_load_word32(state->B + 44); +#endif + + /* Perform all rounds in pairs */ + for (step = 0; step < CLYDE128_STEPS; ++step) { + /* Apply the S-box and L-box to bundle 0 */ + clyde128_sbox(s00, s01, s02, s03); + clyde128_lbox(s00, s01); + clyde128_lbox(s02, s03); + s00 ^= rc[step][0]; + s01 ^= rc[step][1]; + s02 ^= rc[step][2]; + s03 ^= rc[step][3]; + clyde128_sbox(s00, s01, s02, s03); + + /* Apply the S-box and L-box to bundle 1 */ + clyde128_sbox(s10, s11, s12, s13); + clyde128_lbox(s10, s11); + clyde128_lbox(s12, s13); + s10 ^= rc[step][0] << 1; + s11 ^= rc[step][1] << 1; + s12 ^= rc[step][2] << 1; + s13 ^= rc[step][3] << 1; + clyde128_sbox(s10, s11, s12, s13); + + /* Apply the S-box and L-box to bundle 2 */ + clyde128_sbox(s20, s21, s22, s23); + clyde128_lbox(s20, s21); + clyde128_lbox(s22, s23); + s20 ^= rc[step][0] << 2; + s21 ^= rc[step][1] << 2; + s22 ^= rc[step][2] << 2; + s23 ^= rc[step][3] << 2; + clyde128_sbox(s20, s21, s22, s23); + + /* Apply the diffusion layer to the rows of the state */ + #define shadow384_diffusion_layer(row) \ + do { \ + x = s0##row; \ + y = s1##row; \ + z = s2##row; \ + s0##row = x ^ y ^ z; \ + s1##row = x ^ z; \ + s2##row = x ^ y; \ + } while (0) + shadow384_diffusion_layer(0); + shadow384_diffusion_layer(1); + shadow384_diffusion_layer(2); + shadow384_diffusion_layer(3); + + /* Add round constants to all bundles again */ + s00 ^= rc[step][4]; + s01 ^= rc[step][5]; + s02 ^= rc[step][6]; + s03 ^= rc[step][7]; + s10 ^= rc[step][4] << 1; + s11 ^= rc[step][5] << 1; + s12 ^= rc[step][6] << 1; + s13 ^= rc[step][7] << 1; + s20 ^= rc[step][4] << 2; + s21 ^= rc[step][5] << 2; + s22 ^= rc[step][6] << 2; + s23 ^= rc[step][7] << 2; + } + + /* Pack the local variables back into the state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->W[0] = s00; + state->W[1] = s01; + state->W[2] = s02; + state->W[3] = s03; + state->W[4] = s10; + state->W[5] = s11; + state->W[6] = s12; + state->W[7] = s13; + state->W[8] = s20; + state->W[9] = s21; + state->W[10] = s22; + state->W[11] = s23; +#else + le_store_word32(state->B, s00); + le_store_word32(state->B + 4, s01); + le_store_word32(state->B + 8, s02); + le_store_word32(state->B + 12, s03); + le_store_word32(state->B + 16, s10); + le_store_word32(state->B + 20, s11); + le_store_word32(state->B + 24, s12); + le_store_word32(state->B + 28, s13); + le_store_word32(state->B + 32, s20); + le_store_word32(state->B + 36, s21); + le_store_word32(state->B + 40, s22); + le_store_word32(state->B + 44, s23); +#endif +} diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.h b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.h new file mode 100644 index 0000000..b08ce80 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-spook.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SPOOK_H +#define LW_INTERNAL_SPOOK_H + +#include "internal-util.h" + +/** + * \file internal-spook.h + * \brief Internal implementation details of the Spook AEAD mode. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the block for the Clyde-128 block cipher. + */ +#define CLYDE128_BLOCK_SIZE 16 + +/** + * \brief Size of the key for the Clyde-128 block cipher. + */ +#define CLYDE128_KEY_SIZE 16 + +/** + * \brief Size of the tweak for the Clyde-128 block cipher. + */ +#define CLYDE128_TWEAK_SIZE 16 + +/** + * \brief Size of the state for Shadow-512. + */ +#define SHADOW512_STATE_SIZE 64 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-512 state. + */ +#define SHADOW512_RATE 32 + +/** + * \brief Size of the state for Shadow-384. + */ +#define SHADOW384_STATE_SIZE 48 + +/** + * \brief Rate to absorb data into or squeeze data out of a Shadow-384 state. + */ +#define SHADOW384_RATE 16 + +/** + * \brief Internal state of the Shadow-512 permutation. + */ +typedef union +{ + uint32_t W[SHADOW512_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW512_STATE_SIZE]; /**< Bytes of the state */ + +} shadow512_state_t; + +/** + * \brief Internal state of the Shadow-384 permutation. + */ +typedef union +{ + uint32_t W[SHADOW384_STATE_SIZE / 4]; /**< Words of the state */ + uint8_t B[SHADOW384_STATE_SIZE]; /**< Bytes of the state */ + +} shadow384_state_t; + +/** + * \brief Encrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to encrypt with. + * \param tweak Points to the tweak to encrypt with. + * \param output Output buffer for the ciphertext. + * \param input Input buffer for the plaintext. + * + * \sa clyde128_decrypt() + */ +void clyde128_encrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const uint32_t input[CLYDE128_BLOCK_SIZE / 4]); + +/** + * \brief Decrypts a block with the Clyde-128 block cipher. + * + * \param key Points to the key to decrypt with. + * \param tweak Points to the tweak to decrypt with. + * \param output Output buffer for the plaintext. + * \param input Input buffer for the ciphertext. + * + * \sa clyde128_encrypt() + */ +void clyde128_decrypt(const unsigned char key[CLYDE128_KEY_SIZE], + const uint32_t tweak[CLYDE128_TWEAK_SIZE / 4], + uint32_t output[CLYDE128_BLOCK_SIZE / 4], + const unsigned char input[CLYDE128_BLOCK_SIZE]); + +/** + * \brief Performs the Shadow-512 permutation on a state. + * + * \param state The Shadow-512 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow384() + */ +void shadow512(shadow512_state_t *state); + +/** + * \brief Performs the Shadow-384 permutation on a state. + * + * \param state The Shadow-384 state which will be in little-endian + * byte order on input and output. + * + * \sa shadow512() + */ +void shadow384(shadow384_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-util.h b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.c b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.c new file mode 100644 index 0000000..d075b33 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.c @@ -0,0 +1,552 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "spook.h" +#include "internal-spook.h" +#include "internal-util.h" +#include + +aead_cipher_t const spook_128_512_su_cipher = { + "Spook-128-512-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_su_aead_encrypt, + spook_128_512_su_aead_decrypt +}; + +aead_cipher_t const spook_128_384_su_cipher = { + "Spook-128-384-su", + SPOOK_SU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_su_aead_encrypt, + spook_128_384_su_aead_decrypt +}; + +aead_cipher_t const spook_128_512_mu_cipher = { + "Spook-128-512-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_512_mu_aead_encrypt, + spook_128_512_mu_aead_decrypt +}; + +aead_cipher_t const spook_128_384_mu_cipher = { + "Spook-128-384-mu", + SPOOK_MU_KEY_SIZE, + SPOOK_NONCE_SIZE, + SPOOK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + spook_128_384_mu_aead_encrypt, + spook_128_384_mu_aead_decrypt +}; + +/** + * \brief Initializes the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_512_init + (shadow512_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW512_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 12, state->W + 4); + shadow512(state); +} + +/** + * \brief Initializes the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param k Points to the key. + * \param klen Length of the key in bytes, either 16 or 32. + * \param npub Public nonce for the state. + */ +static void spook_128_384_init + (shadow384_state_t *state, + const unsigned char *k, unsigned klen, + const unsigned char *npub) +{ + memset(state->B, 0, SHADOW384_STATE_SIZE); + if (klen == SPOOK_MU_KEY_SIZE) { + /* The public tweak is 126 bits in size followed by a 1 bit */ + memcpy(state->B, k + CLYDE128_BLOCK_SIZE, CLYDE128_BLOCK_SIZE); + state->B[CLYDE128_BLOCK_SIZE - 1] &= 0x7F; + state->B[CLYDE128_BLOCK_SIZE - 1] |= 0x40; + } + memcpy(state->B + CLYDE128_BLOCK_SIZE, npub, CLYDE128_BLOCK_SIZE); + clyde128_encrypt(k, state->W, state->W + 8, state->W + 4); + shadow384(state); +} + +/** + * \brief Absorbs associated data into the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_512_absorb + (shadow512_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW512_RATE) { + lw_xor_block(state->B, ad, SHADOW512_RATE); + shadow512(state); + ad += SHADOW512_RATE; + adlen -= SHADOW512_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Absorbs associated data into the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes, must be non-zero. + */ +static void spook_128_384_absorb + (shadow384_state_t *state, + const unsigned char *ad, unsigned long long adlen) +{ + while (adlen >= SHADOW384_RATE) { + lw_xor_block(state->B, ad, SHADOW384_RATE); + shadow384(state); + ad += SHADOW384_RATE; + adlen -= SHADOW384_RATE; + } + if (adlen > 0) { + unsigned temp = (unsigned)adlen; + lw_xor_block(state->B, ad, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_512_encrypt + (shadow512_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (mlen >= SHADOW512_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + mlen -= SHADOW512_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Encrypts the plaintext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Number of bytes of plaintext to be encrypted. + */ +static void spook_128_384_encrypt + (shadow384_state_t *state, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (mlen >= SHADOW384_RATE) { + lw_xor_block_2_dest(c, state->B, m, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + mlen -= SHADOW384_RATE; + } + if (mlen > 0) { + unsigned temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state->B, m, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-512 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_512_decrypt + (shadow512_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW512_RATE] ^= 0x01; + while (clen >= SHADOW512_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW512_RATE); + shadow512(state); + c += SHADOW512_RATE; + m += SHADOW512_RATE; + clen -= SHADOW512_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW512_RATE] ^= 0x02; + shadow512(state); + } +} + +/** + * \brief Decrypts the ciphertext with the Shadow-384 sponge state. + * + * \param state The sponge state. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param clen Number of bytes of ciphertext to be decrypted. + */ +static void spook_128_384_decrypt + (shadow384_state_t *state, unsigned char *m, + const unsigned char *c, unsigned long long clen) +{ + state->B[SHADOW384_RATE] ^= 0x01; + while (clen >= SHADOW384_RATE) { + lw_xor_block_swap(m, state->B, c, SHADOW384_RATE); + shadow384(state); + c += SHADOW384_RATE; + m += SHADOW384_RATE; + clen -= SHADOW384_RATE; + } + if (clen > 0) { + unsigned temp = (unsigned)clen; + lw_xor_block_swap(m, state->B, c, temp); + state->B[temp] ^= 0x01; + state->B[SHADOW384_RATE] ^= 0x02; + shadow384(state); + } +} + +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_SU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_512_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow512_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-512 sponge state */ + spook_128_512_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_512_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_512_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} + +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + if (mlen > 0) + spook_128_384_encrypt(&state, c, m, mlen); + + /* Compute the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_encrypt(k, state.W + 4, state.W, state.W); + memcpy(c + mlen, state.B, SPOOK_TAG_SIZE); + return 0; +} + +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + shadow384_state_t state; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SPOOK_TAG_SIZE) + return -1; + *mlen = clen - SPOOK_TAG_SIZE; + + /* Initialize the Shadow-384 sponge state */ + spook_128_384_init(&state, k, SPOOK_MU_KEY_SIZE, npub); + + /* Process the associated data */ + if (adlen > 0) + spook_128_384_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SPOOK_TAG_SIZE; + if (clen > 0) + spook_128_384_decrypt(&state, m, c, clen); + + /* Check the authentication tag */ + state.B[CLYDE128_BLOCK_SIZE * 2 - 1] |= 0x80; + clyde128_decrypt(k, state.W + 4, state.W + 4, c + clen); + return aead_check_tag + (m, clen, state.B, state.B + CLYDE128_BLOCK_SIZE, SPOOK_TAG_SIZE); +} diff --git a/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.h b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.h new file mode 100644 index 0000000..68b6a25 --- /dev/null +++ b/spook/Implementations/crypto_aead/spook128su512v1/rhys-avr/spook.h @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SPOOK_H +#define LWCRYPTO_SPOOK_H + +#include "aead-common.h" + +/** + * \file spook.h + * \brief Spook authenticated encryption algorithm. + * + * Spook is a family of authenticated encryption algorithms that are + * built around a tweakable block cipher and a permutation. If the + * tweakable block cipher is implemented as a masked block cipher, + * then Spook provides protection against power analysis side channels. + * + * There are four members in the Spook family: + * + * \li Spook-128-512-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 512-bit permutation. This is the primary + * member of the family. + * \li Spook-128-384-su with a 128-bit key, a 128-bit nonce, and a 128-bit tag. + * Internally the algorithm uses a 384-bit permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 512-bit + * permutation. + * \li Spook-128-512-mu with a 128-bit key, a 128-bit public tweak, a 128-bit + * nonce, and a 128-bit tag. Internally the algorithm uses a 384-bit + * permutation. + * + * In this library, the "mu" (multi-user) variants combine the 128-bit key + * and the 128-bit public tweak into a single 256-bit key value. + * Applications can either view this as a cipher with a 256-bit key, + * or they can split the key value into secret and public halves. + * Even with the use of 256-bit keys, Spook only has 128-bit security. + * + * References: https://www.spook.dev/ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for the single-user version of Spook. + */ +#define SPOOK_SU_KEY_SIZE 16 + +/** + * \brief Size of the key for the multi-user version of Spook. + */ +#define SPOOK_MU_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all Spook family members. + */ +#define SPOOK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for all Spook family members. + */ +#define SPOOK_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the Spook-128-512-su cipher. + */ +extern aead_cipher_t const spook_128_512_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-su cipher. + */ +extern aead_cipher_t const spook_128_384_su_cipher; + +/** + * \brief Meta-information block for the Spook-128-512-mu cipher. + */ +extern aead_cipher_t const spook_128_512_mu_cipher; + +/** + * \brief Meta-information block for the Spook-128-384-mu cipher. + */ +extern aead_cipher_t const spook_128_384_mu_cipher; + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_su_aead_decrypt() + */ +int spook_128_512_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_su_aead_encrypt() + */ +int spook_128_512_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-su. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_su_aead_decrypt() + */ +int spook_128_384_su_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-su. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_su_aead_encrypt() + */ +int spook_128_384_su_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-512-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_512_mu_aead_decrypt() + */ +int spook_128_512_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-512-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_512_mu_aead_encrypt() + */ +int spook_128_512_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with Spook-128-384-mu. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa spook_128_384_mu_aead_decrypt() + */ +int spook_128_384_mu_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Spook-128-384-mu. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa spook_128_384_mu_aead_encrypt() + */ +int spook_128_384_mu_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.c b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.h b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/api.h b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/encrypt.c b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..2f166ad --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "subterranean.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return subterranean_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return subterranean_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.c b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.c new file mode 100644 index 0000000..1cb64e2 --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.c @@ -0,0 +1,441 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-subterranean.h" +#include + +void subterranean_round(subterranean_state_t *state) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8; + uint32_t t0, t1; + + /* Load the state up into local variables */ + x0 = state->x[0]; + x1 = state->x[1]; + x2 = state->x[2]; + x3 = state->x[3]; + x4 = state->x[4]; + x5 = state->x[5]; + x6 = state->x[6]; + x7 = state->x[7]; + x8 = state->x[8]; + + /* Step chi: s[i] = s[i] ^ (~(s[i+1) & s[i+2]) */ + #define CHI(a, b) \ + do { \ + t0 = ((a) >> 1) | ((b) << 31); \ + t1 = ((a) >> 2) | ((b) << 30); \ + (a) ^= (~t0) & t1; \ + } while (0) + x8 ^= (x0 << 1); + CHI(x0, x1); CHI(x1, x2); + CHI(x2, x3); CHI(x3, x4); + CHI(x4, x5); CHI(x5, x6); + CHI(x6, x7); CHI(x7, x8); + x8 ^= (~(x8 >> 1)) & (x8 >> 2); + + /* Step itoa: invert s[0] */ + x0 ^= 1U; + + /* Step theta: s[i] = s[i] ^ s[i + 3] ^ s[i + 8] */ + #define THETA(a, b) \ + do { \ + t0 = ((a) >> 3) | ((b) << 29); \ + t1 = ((a) >> 8) | ((b) << 24); \ + (a) ^= t0 ^ t1; \ + } while (0) + x8 = (x8 & 1U) ^ (x0 << 1); + THETA(x0, x1); THETA(x1, x2); + THETA(x2, x3); THETA(x3, x4); + THETA(x4, x5); THETA(x5, x6); + THETA(x6, x7); THETA(x7, x8); + x8 ^= (x8 >> 3) ^ (x8 >> 8); + + /* Step pi: permute the bits with the rule s[i] = s[(i * 12) % 257]. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + #define BCP(x, bit) ((x) & (((uint32_t)1) << (bit))) + #define BUP(x, from, to) \ + (((x) << ((to) - (from))) & (((uint32_t)1) << (to))) + #define BDN(x, from, to) \ + (((x) >> ((from) - (to))) & (((uint32_t)1) << (to))) + state->x[0] = BCP(x0, 0) ^ BDN(x0, 12, 1) ^ BDN(x0, 24, 2) ^ + BDN(x1, 4, 3) ^ BDN(x1, 16, 4) ^ BDN(x1, 28, 5) ^ + BDN(x2, 8, 6) ^ BDN(x2, 20, 7) ^ BUP(x3, 0, 8) ^ + BDN(x3, 12, 9) ^ BDN(x3, 24, 10) ^ BUP(x4, 4, 11) ^ + BDN(x4, 16, 12) ^ BDN(x4, 28, 13) ^ BUP(x5, 8, 14) ^ + BDN(x5, 20, 15) ^ BUP(x6, 0, 16) ^ BUP(x6, 12, 17) ^ + BDN(x6, 24, 18) ^ BUP(x7, 4, 19) ^ BUP(x7, 16, 20) ^ + BDN(x7, 28, 21) ^ BUP(x0, 7, 22) ^ BUP(x0, 19, 23) ^ + BDN(x0, 31, 24) ^ BUP(x1, 11, 25) ^ BUP(x1, 23, 26) ^ + BUP(x2, 3, 27) ^ BUP(x2, 15, 28) ^ BUP(x2, 27, 29) ^ + BUP(x3, 7, 30) ^ BUP(x3, 19, 31); + state->x[1] = BDN(x3, 31, 0) ^ BDN(x4, 11, 1) ^ BDN(x4, 23, 2) ^ + BCP(x5, 3) ^ BDN(x5, 15, 4) ^ BDN(x5, 27, 5) ^ + BDN(x6, 7, 6) ^ BDN(x6, 19, 7) ^ BDN(x6, 31, 8) ^ + BDN(x7, 11, 9) ^ BDN(x7, 23, 10) ^ BUP(x0, 2, 11) ^ + BDN(x0, 14, 12) ^ BDN(x0, 26, 13) ^ BUP(x1, 6, 14) ^ + BDN(x1, 18, 15) ^ BDN(x1, 30, 16) ^ BUP(x2, 10, 17) ^ + BDN(x2, 22, 18) ^ BUP(x3, 2, 19) ^ BUP(x3, 14, 20) ^ + BDN(x3, 26, 21) ^ BUP(x4, 6, 22) ^ BUP(x4, 18, 23) ^ + BDN(x4, 30, 24) ^ BUP(x5, 10, 25) ^ BUP(x5, 22, 26) ^ + BUP(x6, 2, 27) ^ BUP(x6, 14, 28) ^ BUP(x6, 26, 29) ^ + BUP(x7, 6, 30) ^ BUP(x7, 18, 31); + state->x[2] = BDN(x7, 30, 0) ^ BDN(x0, 9, 1) ^ BDN(x0, 21, 2) ^ + BUP(x1, 1, 3) ^ BDN(x1, 13, 4) ^ BDN(x1, 25, 5) ^ + BUP(x2, 5, 6) ^ BDN(x2, 17, 7) ^ BDN(x2, 29, 8) ^ + BCP(x3, 9) ^ BDN(x3, 21, 10) ^ BUP(x4, 1, 11) ^ + BDN(x4, 13, 12) ^ BDN(x4, 25, 13) ^ BUP(x5, 5, 14) ^ + BDN(x5, 17, 15) ^ BDN(x5, 29, 16) ^ BUP(x6, 9, 17) ^ + BDN(x6, 21, 18) ^ BUP(x7, 1, 19) ^ BUP(x7, 13, 20) ^ + BDN(x7, 25, 21) ^ BUP(x0, 4, 22) ^ BUP(x0, 16, 23) ^ + BDN(x0, 28, 24) ^ BUP(x1, 8, 25) ^ BUP(x1, 20, 26) ^ + BUP(x2, 0, 27) ^ BUP(x2, 12, 28) ^ BUP(x2, 24, 29) ^ + BUP(x3, 4, 30) ^ BUP(x3, 16, 31); + state->x[3] = BDN(x3, 28, 0) ^ BDN(x4, 8, 1) ^ BDN(x4, 20, 2) ^ + BUP(x5, 0, 3) ^ BDN(x5, 12, 4) ^ BDN(x5, 24, 5) ^ + BUP(x6, 4, 6) ^ BDN(x6, 16, 7) ^ BDN(x6, 28, 8) ^ + BUP(x7, 8, 9) ^ BDN(x7, 20, 10) ^ BUP(x8, 0, 11) ^ + BUP(x0, 11, 12) ^ BDN(x0, 23, 13) ^ BUP(x1, 3, 14) ^ + BCP(x1, 15) ^ BDN(x1, 27, 16) ^ BUP(x2, 7, 17) ^ + BDN(x2, 19, 18) ^ BDN(x2, 31, 19) ^ BUP(x3, 11, 20) ^ + BDN(x3, 23, 21) ^ BUP(x4, 3, 22) ^ BUP(x4, 15, 23) ^ + BDN(x4, 27, 24) ^ BUP(x5, 7, 25) ^ BUP(x5, 19, 26) ^ + BDN(x5, 31, 27) ^ BUP(x6, 11, 28) ^ BUP(x6, 23, 29) ^ + BUP(x7, 3, 30) ^ BUP(x7, 15, 31); + state->x[4] = BDN(x7, 27, 0) ^ BDN(x0, 6, 1) ^ BDN(x0, 18, 2) ^ + BDN(x0, 30, 3) ^ BDN(x1, 10, 4) ^ BDN(x1, 22, 5) ^ + BUP(x2, 2, 6) ^ BDN(x2, 14, 7) ^ BDN(x2, 26, 8) ^ + BUP(x3, 6, 9) ^ BDN(x3, 18, 10) ^ BDN(x3, 30, 11) ^ + BUP(x4, 10, 12) ^ BDN(x4, 22, 13) ^ BUP(x5, 2, 14) ^ + BUP(x5, 14, 15) ^ BDN(x5, 26, 16) ^ BUP(x6, 6, 17) ^ + BCP(x6, 18) ^ BDN(x6, 30, 19) ^ BUP(x7, 10, 20) ^ + BDN(x7, 22, 21) ^ BUP(x0, 1, 22) ^ BUP(x0, 13, 23) ^ + BDN(x0, 25, 24) ^ BUP(x1, 5, 25) ^ BUP(x1, 17, 26) ^ + BDN(x1, 29, 27) ^ BUP(x2, 9, 28) ^ BUP(x2, 21, 29) ^ + BUP(x3, 1, 30) ^ BUP(x3, 13, 31); + state->x[5] = BDN(x3, 25, 0) ^ BDN(x4, 5, 1) ^ BDN(x4, 17, 2) ^ + BDN(x4, 29, 3) ^ BDN(x5, 9, 4) ^ BDN(x5, 21, 5) ^ + BUP(x6, 1, 6) ^ BDN(x6, 13, 7) ^ BDN(x6, 25, 8) ^ + BUP(x7, 5, 9) ^ BDN(x7, 17, 10) ^ BDN(x7, 29, 11) ^ + BUP(x0, 8, 12) ^ BDN(x0, 20, 13) ^ BUP(x1, 0, 14) ^ + BUP(x1, 12, 15) ^ BDN(x1, 24, 16) ^ BUP(x2, 4, 17) ^ + BUP(x2, 16, 18) ^ BDN(x2, 28, 19) ^ BUP(x3, 8, 20) ^ + BUP(x3, 20, 21) ^ BUP(x4, 0, 22) ^ BUP(x4, 12, 23) ^ + BCP(x4, 24) ^ BUP(x5, 4, 25) ^ BUP(x5, 16, 26) ^ + BDN(x5, 28, 27) ^ BUP(x6, 8, 28) ^ BUP(x6, 20, 29) ^ + BUP(x7, 0, 30) ^ BUP(x7, 12, 31); + state->x[6] = BDN(x7, 24, 0) ^ BDN(x0, 3, 1) ^ BDN(x0, 15, 2) ^ + BDN(x0, 27, 3) ^ BDN(x1, 7, 4) ^ BDN(x1, 19, 5) ^ + BDN(x1, 31, 6) ^ BDN(x2, 11, 7) ^ BDN(x2, 23, 8) ^ + BUP(x3, 3, 9) ^ BDN(x3, 15, 10) ^ BDN(x3, 27, 11) ^ + BUP(x4, 7, 12) ^ BDN(x4, 19, 13) ^ BDN(x4, 31, 14) ^ + BUP(x5, 11, 15) ^ BDN(x5, 23, 16) ^ BUP(x6, 3, 17) ^ + BUP(x6, 15, 18) ^ BDN(x6, 27, 19) ^ BUP(x7, 7, 20) ^ + BUP(x7, 19, 21) ^ BDN(x7, 31, 22) ^ BUP(x0, 10, 23) ^ + BUP(x0, 22, 24) ^ BUP(x1, 2, 25) ^ BUP(x1, 14, 26) ^ + BUP(x1, 26, 27) ^ BUP(x2, 6, 28) ^ BUP(x2, 18, 29) ^ + BCP(x2, 30) ^ BUP(x3, 10, 31); + state->x[7] = BDN(x3, 22, 0) ^ BDN(x4, 2, 1) ^ BDN(x4, 14, 2) ^ + BDN(x4, 26, 3) ^ BDN(x5, 6, 4) ^ BDN(x5, 18, 5) ^ + BDN(x5, 30, 6) ^ BDN(x6, 10, 7) ^ BDN(x6, 22, 8) ^ + BUP(x7, 2, 9) ^ BDN(x7, 14, 10) ^ BDN(x7, 26, 11) ^ + BUP(x0, 5, 12) ^ BDN(x0, 17, 13) ^ BDN(x0, 29, 14) ^ + BUP(x1, 9, 15) ^ BDN(x1, 21, 16) ^ BUP(x2, 1, 17) ^ + BUP(x2, 13, 18) ^ BDN(x2, 25, 19) ^ BUP(x3, 5, 20) ^ + BUP(x3, 17, 21) ^ BDN(x3, 29, 22) ^ BUP(x4, 9, 23) ^ + BUP(x4, 21, 24) ^ BUP(x5, 1, 25) ^ BUP(x5, 13, 26) ^ + BUP(x5, 25, 27) ^ BUP(x6, 5, 28) ^ BUP(x6, 17, 29) ^ + BUP(x6, 29, 30) ^ BUP(x7, 9, 31); + state->x[8] = BDN(x7, 21, 0); +} + +void subterranean_blank(subterranean_state_t *state) +{ + unsigned round; + for (round = 0; round < 8; ++round) { + subterranean_round(state); + state->x[0] ^= 0x02; /* padding for an empty block is in state bit 1 */ + } +} + +void subterranean_duplex_0(subterranean_state_t *state) +{ + subterranean_round(state); + state->x[0] ^= 0x02; /* padding for an empty block is in state bit 1 */ +} + +void subterranean_duplex_1(subterranean_state_t *state, unsigned char data) +{ + uint32_t x = data; + + /* Perform a single Subterranean round before absorbing the bits */ + subterranean_round(state); + + /* Rearrange the bits and absorb them into the state */ + state->x[0] ^= (x << 1) & 0x00000002U; + state->x[1] ^= x & 0x00000008U; + state->x[2] ^= 0x00000001U; /* 9th padding bit is always 1 */ + state->x[4] ^= ((x << 6) & 0x00000100U) ^ ((x << 1) & 0x00000040U); + state->x[5] ^= (x << 15) & 0x00010000U; + state->x[6] ^= (x >> 1) & 0x00000020U; + state->x[7] ^= ((x << 21) & 0x02000000U) ^ ((x << 3) & 0x00000400U); +} + +void subterranean_duplex_word(subterranean_state_t *state, uint32_t x) +{ + uint32_t y; + + /* Perform a single Subterranean round before absorbing the bits */ + subterranean_round(state); + + /* To absorb the word into the state, we first rearrange the source + * bits to be in the right target bit positions. Then we mask and + * XOR them into the relevant words of the state. + * + * Some of the source bits end up in the same target bit but a different + * word so we have to permute the input word twice to get all the source + * bits into the locations we want for masking and XOR'ing. + * + * Permutations generated with "http://programming.sirrida.de/calcperm.php". + */ + + /* P1 = [1 16 8 3 25 * * 10 0 21 * 24 2 31 15 6 * 11 9 19 * * 29 * 4 * 30 12 * 22 17 5] */ + y = (x & 0x00080008U) + | ((x & 0x00004001U) << 1) + | ((x & 0x00000080U) << 3) + | ((x & 0x04000000U) << 4) + | leftRotate6(x & 0x80000004U) + | ((x & 0x00400000U) << 7) + | leftRotate12(x & 0x01000200U) + | ((x & 0x00000800U) << 13) + | ((x & 0x00000002U) << 15) + | ((x & 0x08000000U) >> 15) + | ((x & 0x00002000U) << 18) + | ((x & 0x40000000U) >> 13) + | ((x & 0x00000010U) << 21) + | ((x & 0x00001000U) >> 10) + | ((x & 0x00048000U) >> 9) + | ((x & 0x00000100U) >> 8) + | ((x & 0x20000000U) >> 7) + | ((x & 0x00020000U) >> 6); + + /* P2 = [* * * * * 6 5 * * * 31 * * * * * 17 * * * 0 9 * 15 * 30 * * 1 * * *] */ + x = ((x & 0x00010020U) << 1) + | leftRotate5(x & 0x12000000U) + | ((x & 0x00100000U) >> 20) + | ((x & 0x00200000U) >> 12) + | ((x & 0x00000400U) << 21) + | ((x & 0x00800000U) >> 8) + | ((x & 0x00000040U) >> 1); + + /* Integrate the rearranged bits into the state */ + state->x[0] ^= (y & 0x40428816U); + state->x[1] ^= (y & 0x00000008U); + state->x[2] ^= (y & 0x80000041U); + state->x[3] ^= (x & 0x00008000U); + state->x[4] ^= (y & 0x00001300U) ^ (x & 0x00000041U); + state->x[5] ^= (y & 0x21010020U) ^ (x & 0x40000200U); + state->x[6] ^= (y & 0x00280000U) ^ (x & 0x80000020U); + state->x[7] ^= (y & 0x02000400U) ^ (x & 0x00020002U); +} + +void subterranean_duplex_n + (subterranean_state_t *state, const unsigned char *data, unsigned len) +{ + switch (len) { + case 0: + subterranean_duplex_0(state); + break; + case 1: + subterranean_duplex_1(state, data[0]); + break; + case 2: + /* Load 16 bits and add the padding bit to the 17th bit */ + subterranean_duplex_word + (state, ((uint32_t)(data[0]) | + (((uint32_t)(data[1])) << 8) | + 0x10000U)); + break; + case 3: + /* Load 24 bits and add the padding bit to the 25th bit */ + subterranean_duplex_word + (state, ((uint32_t)(data[0]) | + (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16) | + 0x01000000U)); + break; + default: + /* Load 32 bits and add the padding bit to the 33rd bit */ + subterranean_duplex_word(state, le_load_word32(data)); + state->x[8] ^= 0x00000001U; + break; + } +} + +uint32_t subterranean_extract(subterranean_state_t *state) +{ + uint32_t x, y; + + /* We need to extract 64 bits from the state, and then XOR the two + * halves together to get the result. + * + * Extract words from the state and permute the bits into the target + * bit order. Then mask off the unnecessary bits and combine. + * + * Permutations generated with "http://programming.sirrida.de/calcperm.php". + */ + + /* P0 = [* 0 12 * 24 * * * 4 * * 17 * * * 14 16 30 * * * * 29 7 * * * * * * 26 *] */ + x = state->x[0]; + x = (x & 0x00010000U) + | ((x & 0x00000800U) << 6) + | ((x & 0x00400000U) << 7) + | ((x & 0x00000004U) << 10) + | ((x & 0x00020000U) << 13) + | ((x & 0x00800000U) >> 16) + | ((x & 0x00000010U) << 20) + | ((x & 0x40000100U) >> 4) + | ((x & 0x00008002U) >> 1); + y = x & 0x65035091U; + + /* P1 = [28 * 10 3 * * * * * * * * 9 * 19 * * * * * * * * * * * * * 6 * * *] */ + x = state->x[1]; + x = (x & 0x00000008U) + | ((x & 0x00004000U) << 5) + | ((x & 0x00000004U) << 8) + | ((x & 0x10000000U) >> 22) + | ((x & 0x00000001U) << 28) + | ((x & 0x00001000U) >> 3); + y ^= x & 0x10080648U; + + /* P2 = [8 * * 25 22 * 15 * * 11 * * * * * * * 1 * * * * * * 21 * * * 31 * * 13] */ + x = state->x[2]; + x = ((x & 0x00000200U) << 2) + | ((x & 0x10000000U) << 3) + | ((x & 0x00000001U) << 8) + | ((x & 0x00000040U) << 9) + | ((x & 0x80000000U) >> 18) + | ((x & 0x00020000U) >> 16) + | ((x & 0x00000010U) << 18) + | ((x & 0x00000008U) << 22) + | ((x & 0x01000000U) >> 3); + y ^= x & 0x8260a902U; + + /* P3 = [* * * * * * * * * * * * * * * 23 * * * * * 27 * * 18 2 * 5 * * * *] */ + x = state->x[3]; + x = ((x & 0x00200000U) << 6) + | ((x & 0x00008000U) << 8) + | ((x & 0x02000000U) >> 23) + | ((x & 0x08000000U) >> 22) + | ((x & 0x01000000U) >> 6); + y ^= x & 0x08840024U; + + /* P4 = [20 20 * * * * 5 * 2 18 * * 27 * * * * * 23 * * * * * * * * * * * * *] */ + x = state->x[4]; + y ^= (x << 20) & 0x00100000U; /* Handle duplicated bit 20 separately */ + x = ((x & 0x00040000U) << 5) + | ((x & 0x00000200U) << 9) + | ((x & 0x00001000U) << 15) + | ((x & 0x00000002U) << 19) + | ((x & 0x00000100U) >> 6) + | ((x & 0x00000040U) >> 1); + y ^= x & 0x08940024U; + + /* P5 = [* * 13 * * 31 * * * 21 * * * * * * 1 * * * * * * * 11 * * 15 * 22 25 *] */ + x = state->x[5]; + x = ((x & 0x00000004U) << 11) + | ((x & 0x00000200U) << 12) + | ((x & 0x00010000U) >> 15) + | ((x & 0x01000000U) >> 13) + | ((x & 0x08000000U) >> 12) + | ((x & 0x20000000U) >> 7) + | ((x & 0x00000020U) << 26) + | ((x & 0x40000000U) >> 5); + y ^= x & 0x8260a802U; + + /* P6 = [* 8 * * * 6 * * * * * * * * * * * * * 19 * 9 * * * * * * * * 3 10] */ + x = state->x[6]; + x = (x & 0x00080000U) + | ((x & 0x00000020U) << 1) + | ((x & 0x40000000U) >> 27) + | ((x & 0x00000002U) << 7) + | ((x & 0x80000000U) >> 21) + | ((x & 0x00200000U) >> 12); + y ^= x & 0x00080748U; + + /* P7 = [* 28 * 26 * * * * * * 7 29 * * * * 30 16 14 * * * 17 * * 4 * * * 24 * 12] */ + x = state->x[7]; + x = ((x & 0x02000000U) >> 21) + | ((x & 0x80000000U) >> 19) + | ((x & 0x00010000U) << 14) + | ((x & 0x00000800U) << 18) + | ((x & 0x00000008U) << 23) + | leftRotate27(x & 0x20400002U) + | ((x & 0x00040000U) >> 4) + | ((x & 0x00000400U) >> 3) + | ((x & 0x00020000U) >> 1); + y ^= x & 0x75035090U; + + /* Word 8 has a single bit - XOR it directly into the result and return */ + return y ^ state->x[8]; +} + +void subterranean_absorb + (subterranean_state_t *state, const unsigned char *data, + unsigned long long len) +{ + while (len >= 4) { + subterranean_duplex_4(state, data); + data += 4; + len -= 4; + } + subterranean_duplex_n(state, data, (unsigned)len); +} + +void subterranean_squeeze + (subterranean_state_t *state, unsigned char *data, unsigned len) +{ + uint32_t word; + while (len > 4) { + word = subterranean_extract(state); + subterranean_duplex_0(state); + le_store_word32(data, word); + data += 4; + len -= 4; + } + if (len == 4) { + word = subterranean_extract(state); + le_store_word32(data, word); + } else if (len == 1) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + } else if (len == 2) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + data[1] = (unsigned char)(word >> 8); + } else if (len == 3) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + data[1] = (unsigned char)(word >> 8); + data[2] = (unsigned char)(word >> 16); + } +} diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.h b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.h new file mode 100644 index 0000000..71cebb2 --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-subterranean.h @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SUBTERRANEAN_H +#define LW_INTERNAL_SUBTERRANEAN_H + +#include "internal-util.h" + +/** + * \file internal-subterranean.h + * \brief Internal implementation of the Subterranean block operation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Representation of the 257-bit state of Subterranean. + * + * The 257-bit state is represented as nine 32-bit words with only a single + * bit in the last word. + */ +typedef struct +{ + uint32_t x[9]; /**< State words */ + +} subterranean_state_t; + +/** + * \brief Performs a single Subterranean round. + * + * \param state Subterranean state to be transformed. + */ +void subterranean_round(subterranean_state_t *state); + +/** + * \brief Performs 8 Subterranean rounds with no absorption or squeezing + * of data; i.e. data input and output is "blanked". + * + * \param state Subterranean state to be transformed. + */ +void subterranean_blank(subterranean_state_t *state); + +/** + * \brief Performs a single Subterranean round and absorbs 0 bytes. + * + * \param state Subterranean state to be transformed. + */ +void subterranean_duplex_0(subterranean_state_t *state); + +/** + * \brief Performs a single Subterranean round and absorbs one byte. + * + * \param state Subterranean state to be transformed. + * \param data The single byte to be absorbed. + */ +void subterranean_duplex_1(subterranean_state_t *state, unsigned char data); + +/** + * \brief Absorbs a 32-bit word into the Subterranean state. + * + * \param state Subterranean state to be transformed. + * \param x The word to absorb into the state. + */ +void subterranean_duplex_word(subterranean_state_t *state, uint32_t x); + +/** + * \brief Performs a single Subterranean round and absorbs four bytes. + * + * \param state Subterranean state to be transformed. + * \param data Points to the four data bytes to be absorbed. + */ +#define subterranean_duplex_4(state, data) \ + do { \ + subterranean_duplex_word((state), le_load_word32((data))); \ + (state)->x[8] ^= 1; \ + } while (0) + +/** + * \brief Performs a single Subterranean round and absorbs between + * zero and four bytes. + * + * \param state Subterranean state to be transformed. + * \param data Points to the data bytes to be absorbed. + * \param len Length of the data to be absorbed. + */ +void subterranean_duplex_n + (subterranean_state_t *state, const unsigned char *data, unsigned len); + +/** + * \brief Extracts 32 bits of output from the Subterranean state. + * + * \param state Subterranean state to extract the output from. + * + * \return Returns the 32-bit word that was extracted. + */ +uint32_t subterranean_extract(subterranean_state_t *state); + +/** + * \brief Absorbs an arbitrary amount of data, four bytes at a time. + * + * \param state Subterranean state to be transformed. + * \param data Points to the bytes to be absorbed. + * \param len Number of bytes to absorb. + */ +void subterranean_absorb + (subterranean_state_t *state, const unsigned char *data, + unsigned long long len); + +/** + * \brief Squeezes an arbitrary amount of data out of a Subterranean state. + * + * \param state Subterranean state to extract the output from. + * \param data Points to the data buffer to receive the output. + * \param len Number of bytes to be extracted. + */ +void subterranean_squeeze + (subterranean_state_t *state, unsigned char *data, unsigned len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-util.h b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.c b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.c new file mode 100644 index 0000000..1bc9fc4 --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.c @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "subterranean.h" +#include "internal-subterranean.h" +#include + +aead_cipher_t const subterranean_cipher = { + "Subterranean", + SUBTERRANEAN_KEY_SIZE, + SUBTERRANEAN_NONCE_SIZE, + SUBTERRANEAN_TAG_SIZE, + AEAD_FLAG_NONE, + subterranean_aead_encrypt, + subterranean_aead_decrypt +}; + +aead_hash_algorithm_t const subterranean_hash_algorithm = { + "Subterranean-Hash", + sizeof(subterranean_hash_state_t), + SUBTERRANEAN_HASH_SIZE, + AEAD_FLAG_NONE, + subterranean_hash, + (aead_hash_init_t)subterranean_hash_init, + (aead_hash_update_t)subterranean_hash_update, + (aead_hash_finalize_t)subterranean_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +int subterranean_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + subterranean_state_t state; + uint32_t x1, x2; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SUBTERRANEAN_TAG_SIZE; + + /* Initialize the state and absorb the key and nonce */ + memset(&state, 0, sizeof(state)); + subterranean_absorb(&state, k, SUBTERRANEAN_KEY_SIZE); + subterranean_absorb(&state, npub, SUBTERRANEAN_NONCE_SIZE); + subterranean_blank(&state); + + /* Absorb the associated data into the state */ + subterranean_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= 4) { + x1 = le_load_word32(m); + x2 = subterranean_extract(&state) ^ x1; + subterranean_duplex_word(&state, x1); + state.x[8] ^= 1; /* padding for 32-bit blocks */ + le_store_word32(c, x2); + c += 4; + m += 4; + mlen -= 4; + } + switch ((unsigned char)mlen) { + default: + subterranean_duplex_0(&state); + break; + case 1: + x2 = subterranean_extract(&state) ^ m[0]; + subterranean_duplex_n(&state, m, 1); + c[0] = (unsigned char)x2; + break; + case 2: + x2 = subterranean_extract(&state) ^ m[0] ^ (((uint32_t)(m[1])) << 8); + subterranean_duplex_n(&state, m, 2); + c[0] = (unsigned char)x2; + c[1] = (unsigned char)(x2 >> 8); + break; + case 3: + x2 = subterranean_extract(&state) ^ + m[0] ^ (((uint32_t)(m[1])) << 8) ^ (((uint32_t)(m[2])) << 16); + subterranean_duplex_n(&state, m, 3); + c[0] = (unsigned char)x2; + c[1] = (unsigned char)(x2 >> 8); + c[2] = (unsigned char)(x2 >> 16); + break; + } + + /* Generate the authentication tag */ + subterranean_blank(&state); + subterranean_squeeze(&state, c + mlen, SUBTERRANEAN_TAG_SIZE); + return 0; +} + +int subterranean_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + subterranean_state_t state; + unsigned char *mtemp = m; + unsigned char tag[SUBTERRANEAN_TAG_SIZE]; + uint32_t x; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SUBTERRANEAN_TAG_SIZE) + return -1; + *mlen = clen - SUBTERRANEAN_TAG_SIZE; + + /* Initialize the state and absorb the key and nonce */ + memset(&state, 0, sizeof(state)); + subterranean_absorb(&state, k, SUBTERRANEAN_KEY_SIZE); + subterranean_absorb(&state, npub, SUBTERRANEAN_NONCE_SIZE); + subterranean_blank(&state); + + /* Absorb the associated data into the state */ + subterranean_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SUBTERRANEAN_TAG_SIZE; + while (clen >= 4) { + x = le_load_word32(c); + x ^= subterranean_extract(&state); + subterranean_duplex_word(&state, x); + state.x[8] ^= 1; /* padding for 32-bit blocks */ + le_store_word32(m, x); + c += 4; + m += 4; + clen -= 4; + } + switch ((unsigned char)clen) { + default: + subterranean_duplex_0(&state); + break; + case 1: + m[0] = (unsigned char)(subterranean_extract(&state) ^ c[0]); + subterranean_duplex_1(&state, m[0]); + break; + case 2: + x = subterranean_extract(&state) ^ c[0] ^ (((uint32_t)(c[1])) << 8); + m[0] = (unsigned char)x; + m[1] = (unsigned char)(x >> 8); + subterranean_duplex_word(&state, (x & 0xFFFFU) | 0x10000U); + break; + case 3: + x = subterranean_extract(&state) ^ + c[0] ^ (((uint32_t)(c[1])) << 8) ^ (((uint32_t)(c[2])) << 16); + m[0] = (unsigned char)x; + m[1] = (unsigned char)(x >> 8); + m[2] = (unsigned char)(x >> 16); + subterranean_duplex_word(&state, (x & 0x00FFFFFFU) | 0x01000000U); + break; + } + + /* Check the authentication tag */ + subterranean_blank(&state); + subterranean_squeeze(&state, tag, sizeof(tag)); + return aead_check_tag(mtemp, *mlen, tag, c + clen, SUBTERRANEAN_TAG_SIZE); +} + +int subterranean_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + subterranean_state_t state; + memset(&state, 0, sizeof(state)); + while (inlen > 0) { + subterranean_duplex_1(&state, *in++); + subterranean_duplex_0(&state); + --inlen; + } + subterranean_duplex_0(&state); + subterranean_duplex_0(&state); + subterranean_blank(&state); + subterranean_squeeze(&state, out, SUBTERRANEAN_HASH_SIZE); + return 0; +} + +void subterranean_hash_init(subterranean_hash_state_t *state) +{ + memset(state, 0, sizeof(subterranean_hash_state_t)); +} + +void subterranean_hash_update + (subterranean_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + subterranean_state_t *st = (subterranean_state_t *)state; + while (inlen > 0) { + subterranean_duplex_1(st, *in++); + subterranean_duplex_0(st); + --inlen; + } +} + +void subterranean_hash_finalize + (subterranean_hash_state_t *state, unsigned char *out) +{ + subterranean_state_t *st = (subterranean_state_t *)state; + subterranean_duplex_0(st); + subterranean_duplex_0(st); + subterranean_blank(st); + subterranean_squeeze(st, out, SUBTERRANEAN_HASH_SIZE); +} diff --git a/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.h b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.h new file mode 100644 index 0000000..148e5e8 --- /dev/null +++ b/subterranean/Implementations/crypto_aead/subterraneanv1/rhys-avr/subterranean.h @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUBTERRANEAN_H +#define LWCRYPTO_SUBTERRANEAN_H + +#include "aead-common.h" + +/** + * \file subterranean.h + * \brief Subterranean authenticated encryption algorithm. + * + * Subterranean (technically "Subterranean 2.0") is a family of + * algorithms built around the 257-bit Subterranean permutation: + * + * \li Subterranean is an authenticated encryption algorithm with a 128-bit + * key, a 128-bit nonce, and a 128-bit tag. + * \li Subterranean-Hash is a hash algorithm with a 256-bit output. + * + * The Subterranean permutation is intended for hardware implementation. + * It is not structured for efficient software implementation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Subterranean. + */ +#define SUBTERRANEAN_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Subterranean. + */ +#define SUBTERRANEAN_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Subterranean. + */ +#define SUBTERRANEAN_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for Subterranean-Hash. + */ +#define SUBTERRANEAN_HASH_SIZE 32 + +/** + * \brief Meta-information block for the Subterranean cipher. + */ +extern aead_cipher_t const subterranean_cipher; + +/** + * \brief Meta-information block for the SUBTERRANEAN hash algorithm. + */ +extern aead_hash_algorithm_t const subterranean_hash_algorithm; + +/** + * \brief State information for the Subterreaan incremental hash mode. + */ +typedef union +{ + unsigned char state[40]; /**< Current hash state */ + unsigned long long align; /**< For alignment of this structure */ + +} subterranean_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Subterranean. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa subterranean_aead_decrypt() + */ +int subterranean_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Subterranean. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa subterranean_aead_encrypt() + */ +int subterranean_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Subterranean. + * + * \param out Buffer to receive the hash output which must be at least + * SUBTERRANEAN_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa subterranean_hash_init() + */ +int subterranean_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a Subterranean hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa subterranean_hash_update(), subterranean_hash_finalize(), + * subterranean_hash() + */ +void subterranean_hash_init(subterranean_hash_state_t *state); + +/** + * \brief Updates a Subterranean state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa subterranean_hash_init(), subterranean_hash_finalize() + */ +void subterranean_hash_update + (subterranean_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from a Subterranean hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa subterranean_hash_init(), subterranean_hash_update() + */ +void subterranean_hash_finalize + (subterranean_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.c b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.h b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/api.h b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/hash.c b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/hash.c new file mode 100644 index 0000000..250ae68 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "subterranean.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return subterranean_hash(out, in, inlen); +} diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.c b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.c new file mode 100644 index 0000000..1cb64e2 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.c @@ -0,0 +1,441 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-subterranean.h" +#include + +void subterranean_round(subterranean_state_t *state) +{ + uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8; + uint32_t t0, t1; + + /* Load the state up into local variables */ + x0 = state->x[0]; + x1 = state->x[1]; + x2 = state->x[2]; + x3 = state->x[3]; + x4 = state->x[4]; + x5 = state->x[5]; + x6 = state->x[6]; + x7 = state->x[7]; + x8 = state->x[8]; + + /* Step chi: s[i] = s[i] ^ (~(s[i+1) & s[i+2]) */ + #define CHI(a, b) \ + do { \ + t0 = ((a) >> 1) | ((b) << 31); \ + t1 = ((a) >> 2) | ((b) << 30); \ + (a) ^= (~t0) & t1; \ + } while (0) + x8 ^= (x0 << 1); + CHI(x0, x1); CHI(x1, x2); + CHI(x2, x3); CHI(x3, x4); + CHI(x4, x5); CHI(x5, x6); + CHI(x6, x7); CHI(x7, x8); + x8 ^= (~(x8 >> 1)) & (x8 >> 2); + + /* Step itoa: invert s[0] */ + x0 ^= 1U; + + /* Step theta: s[i] = s[i] ^ s[i + 3] ^ s[i + 8] */ + #define THETA(a, b) \ + do { \ + t0 = ((a) >> 3) | ((b) << 29); \ + t1 = ((a) >> 8) | ((b) << 24); \ + (a) ^= t0 ^ t1; \ + } while (0) + x8 = (x8 & 1U) ^ (x0 << 1); + THETA(x0, x1); THETA(x1, x2); + THETA(x2, x3); THETA(x3, x4); + THETA(x4, x5); THETA(x5, x6); + THETA(x6, x7); THETA(x7, x8); + x8 ^= (x8 >> 3) ^ (x8 >> 8); + + /* Step pi: permute the bits with the rule s[i] = s[(i * 12) % 257]. + * BCP = bit copy, BUP = move bit up, BDN = move bit down */ + #define BCP(x, bit) ((x) & (((uint32_t)1) << (bit))) + #define BUP(x, from, to) \ + (((x) << ((to) - (from))) & (((uint32_t)1) << (to))) + #define BDN(x, from, to) \ + (((x) >> ((from) - (to))) & (((uint32_t)1) << (to))) + state->x[0] = BCP(x0, 0) ^ BDN(x0, 12, 1) ^ BDN(x0, 24, 2) ^ + BDN(x1, 4, 3) ^ BDN(x1, 16, 4) ^ BDN(x1, 28, 5) ^ + BDN(x2, 8, 6) ^ BDN(x2, 20, 7) ^ BUP(x3, 0, 8) ^ + BDN(x3, 12, 9) ^ BDN(x3, 24, 10) ^ BUP(x4, 4, 11) ^ + BDN(x4, 16, 12) ^ BDN(x4, 28, 13) ^ BUP(x5, 8, 14) ^ + BDN(x5, 20, 15) ^ BUP(x6, 0, 16) ^ BUP(x6, 12, 17) ^ + BDN(x6, 24, 18) ^ BUP(x7, 4, 19) ^ BUP(x7, 16, 20) ^ + BDN(x7, 28, 21) ^ BUP(x0, 7, 22) ^ BUP(x0, 19, 23) ^ + BDN(x0, 31, 24) ^ BUP(x1, 11, 25) ^ BUP(x1, 23, 26) ^ + BUP(x2, 3, 27) ^ BUP(x2, 15, 28) ^ BUP(x2, 27, 29) ^ + BUP(x3, 7, 30) ^ BUP(x3, 19, 31); + state->x[1] = BDN(x3, 31, 0) ^ BDN(x4, 11, 1) ^ BDN(x4, 23, 2) ^ + BCP(x5, 3) ^ BDN(x5, 15, 4) ^ BDN(x5, 27, 5) ^ + BDN(x6, 7, 6) ^ BDN(x6, 19, 7) ^ BDN(x6, 31, 8) ^ + BDN(x7, 11, 9) ^ BDN(x7, 23, 10) ^ BUP(x0, 2, 11) ^ + BDN(x0, 14, 12) ^ BDN(x0, 26, 13) ^ BUP(x1, 6, 14) ^ + BDN(x1, 18, 15) ^ BDN(x1, 30, 16) ^ BUP(x2, 10, 17) ^ + BDN(x2, 22, 18) ^ BUP(x3, 2, 19) ^ BUP(x3, 14, 20) ^ + BDN(x3, 26, 21) ^ BUP(x4, 6, 22) ^ BUP(x4, 18, 23) ^ + BDN(x4, 30, 24) ^ BUP(x5, 10, 25) ^ BUP(x5, 22, 26) ^ + BUP(x6, 2, 27) ^ BUP(x6, 14, 28) ^ BUP(x6, 26, 29) ^ + BUP(x7, 6, 30) ^ BUP(x7, 18, 31); + state->x[2] = BDN(x7, 30, 0) ^ BDN(x0, 9, 1) ^ BDN(x0, 21, 2) ^ + BUP(x1, 1, 3) ^ BDN(x1, 13, 4) ^ BDN(x1, 25, 5) ^ + BUP(x2, 5, 6) ^ BDN(x2, 17, 7) ^ BDN(x2, 29, 8) ^ + BCP(x3, 9) ^ BDN(x3, 21, 10) ^ BUP(x4, 1, 11) ^ + BDN(x4, 13, 12) ^ BDN(x4, 25, 13) ^ BUP(x5, 5, 14) ^ + BDN(x5, 17, 15) ^ BDN(x5, 29, 16) ^ BUP(x6, 9, 17) ^ + BDN(x6, 21, 18) ^ BUP(x7, 1, 19) ^ BUP(x7, 13, 20) ^ + BDN(x7, 25, 21) ^ BUP(x0, 4, 22) ^ BUP(x0, 16, 23) ^ + BDN(x0, 28, 24) ^ BUP(x1, 8, 25) ^ BUP(x1, 20, 26) ^ + BUP(x2, 0, 27) ^ BUP(x2, 12, 28) ^ BUP(x2, 24, 29) ^ + BUP(x3, 4, 30) ^ BUP(x3, 16, 31); + state->x[3] = BDN(x3, 28, 0) ^ BDN(x4, 8, 1) ^ BDN(x4, 20, 2) ^ + BUP(x5, 0, 3) ^ BDN(x5, 12, 4) ^ BDN(x5, 24, 5) ^ + BUP(x6, 4, 6) ^ BDN(x6, 16, 7) ^ BDN(x6, 28, 8) ^ + BUP(x7, 8, 9) ^ BDN(x7, 20, 10) ^ BUP(x8, 0, 11) ^ + BUP(x0, 11, 12) ^ BDN(x0, 23, 13) ^ BUP(x1, 3, 14) ^ + BCP(x1, 15) ^ BDN(x1, 27, 16) ^ BUP(x2, 7, 17) ^ + BDN(x2, 19, 18) ^ BDN(x2, 31, 19) ^ BUP(x3, 11, 20) ^ + BDN(x3, 23, 21) ^ BUP(x4, 3, 22) ^ BUP(x4, 15, 23) ^ + BDN(x4, 27, 24) ^ BUP(x5, 7, 25) ^ BUP(x5, 19, 26) ^ + BDN(x5, 31, 27) ^ BUP(x6, 11, 28) ^ BUP(x6, 23, 29) ^ + BUP(x7, 3, 30) ^ BUP(x7, 15, 31); + state->x[4] = BDN(x7, 27, 0) ^ BDN(x0, 6, 1) ^ BDN(x0, 18, 2) ^ + BDN(x0, 30, 3) ^ BDN(x1, 10, 4) ^ BDN(x1, 22, 5) ^ + BUP(x2, 2, 6) ^ BDN(x2, 14, 7) ^ BDN(x2, 26, 8) ^ + BUP(x3, 6, 9) ^ BDN(x3, 18, 10) ^ BDN(x3, 30, 11) ^ + BUP(x4, 10, 12) ^ BDN(x4, 22, 13) ^ BUP(x5, 2, 14) ^ + BUP(x5, 14, 15) ^ BDN(x5, 26, 16) ^ BUP(x6, 6, 17) ^ + BCP(x6, 18) ^ BDN(x6, 30, 19) ^ BUP(x7, 10, 20) ^ + BDN(x7, 22, 21) ^ BUP(x0, 1, 22) ^ BUP(x0, 13, 23) ^ + BDN(x0, 25, 24) ^ BUP(x1, 5, 25) ^ BUP(x1, 17, 26) ^ + BDN(x1, 29, 27) ^ BUP(x2, 9, 28) ^ BUP(x2, 21, 29) ^ + BUP(x3, 1, 30) ^ BUP(x3, 13, 31); + state->x[5] = BDN(x3, 25, 0) ^ BDN(x4, 5, 1) ^ BDN(x4, 17, 2) ^ + BDN(x4, 29, 3) ^ BDN(x5, 9, 4) ^ BDN(x5, 21, 5) ^ + BUP(x6, 1, 6) ^ BDN(x6, 13, 7) ^ BDN(x6, 25, 8) ^ + BUP(x7, 5, 9) ^ BDN(x7, 17, 10) ^ BDN(x7, 29, 11) ^ + BUP(x0, 8, 12) ^ BDN(x0, 20, 13) ^ BUP(x1, 0, 14) ^ + BUP(x1, 12, 15) ^ BDN(x1, 24, 16) ^ BUP(x2, 4, 17) ^ + BUP(x2, 16, 18) ^ BDN(x2, 28, 19) ^ BUP(x3, 8, 20) ^ + BUP(x3, 20, 21) ^ BUP(x4, 0, 22) ^ BUP(x4, 12, 23) ^ + BCP(x4, 24) ^ BUP(x5, 4, 25) ^ BUP(x5, 16, 26) ^ + BDN(x5, 28, 27) ^ BUP(x6, 8, 28) ^ BUP(x6, 20, 29) ^ + BUP(x7, 0, 30) ^ BUP(x7, 12, 31); + state->x[6] = BDN(x7, 24, 0) ^ BDN(x0, 3, 1) ^ BDN(x0, 15, 2) ^ + BDN(x0, 27, 3) ^ BDN(x1, 7, 4) ^ BDN(x1, 19, 5) ^ + BDN(x1, 31, 6) ^ BDN(x2, 11, 7) ^ BDN(x2, 23, 8) ^ + BUP(x3, 3, 9) ^ BDN(x3, 15, 10) ^ BDN(x3, 27, 11) ^ + BUP(x4, 7, 12) ^ BDN(x4, 19, 13) ^ BDN(x4, 31, 14) ^ + BUP(x5, 11, 15) ^ BDN(x5, 23, 16) ^ BUP(x6, 3, 17) ^ + BUP(x6, 15, 18) ^ BDN(x6, 27, 19) ^ BUP(x7, 7, 20) ^ + BUP(x7, 19, 21) ^ BDN(x7, 31, 22) ^ BUP(x0, 10, 23) ^ + BUP(x0, 22, 24) ^ BUP(x1, 2, 25) ^ BUP(x1, 14, 26) ^ + BUP(x1, 26, 27) ^ BUP(x2, 6, 28) ^ BUP(x2, 18, 29) ^ + BCP(x2, 30) ^ BUP(x3, 10, 31); + state->x[7] = BDN(x3, 22, 0) ^ BDN(x4, 2, 1) ^ BDN(x4, 14, 2) ^ + BDN(x4, 26, 3) ^ BDN(x5, 6, 4) ^ BDN(x5, 18, 5) ^ + BDN(x5, 30, 6) ^ BDN(x6, 10, 7) ^ BDN(x6, 22, 8) ^ + BUP(x7, 2, 9) ^ BDN(x7, 14, 10) ^ BDN(x7, 26, 11) ^ + BUP(x0, 5, 12) ^ BDN(x0, 17, 13) ^ BDN(x0, 29, 14) ^ + BUP(x1, 9, 15) ^ BDN(x1, 21, 16) ^ BUP(x2, 1, 17) ^ + BUP(x2, 13, 18) ^ BDN(x2, 25, 19) ^ BUP(x3, 5, 20) ^ + BUP(x3, 17, 21) ^ BDN(x3, 29, 22) ^ BUP(x4, 9, 23) ^ + BUP(x4, 21, 24) ^ BUP(x5, 1, 25) ^ BUP(x5, 13, 26) ^ + BUP(x5, 25, 27) ^ BUP(x6, 5, 28) ^ BUP(x6, 17, 29) ^ + BUP(x6, 29, 30) ^ BUP(x7, 9, 31); + state->x[8] = BDN(x7, 21, 0); +} + +void subterranean_blank(subterranean_state_t *state) +{ + unsigned round; + for (round = 0; round < 8; ++round) { + subterranean_round(state); + state->x[0] ^= 0x02; /* padding for an empty block is in state bit 1 */ + } +} + +void subterranean_duplex_0(subterranean_state_t *state) +{ + subterranean_round(state); + state->x[0] ^= 0x02; /* padding for an empty block is in state bit 1 */ +} + +void subterranean_duplex_1(subterranean_state_t *state, unsigned char data) +{ + uint32_t x = data; + + /* Perform a single Subterranean round before absorbing the bits */ + subterranean_round(state); + + /* Rearrange the bits and absorb them into the state */ + state->x[0] ^= (x << 1) & 0x00000002U; + state->x[1] ^= x & 0x00000008U; + state->x[2] ^= 0x00000001U; /* 9th padding bit is always 1 */ + state->x[4] ^= ((x << 6) & 0x00000100U) ^ ((x << 1) & 0x00000040U); + state->x[5] ^= (x << 15) & 0x00010000U; + state->x[6] ^= (x >> 1) & 0x00000020U; + state->x[7] ^= ((x << 21) & 0x02000000U) ^ ((x << 3) & 0x00000400U); +} + +void subterranean_duplex_word(subterranean_state_t *state, uint32_t x) +{ + uint32_t y; + + /* Perform a single Subterranean round before absorbing the bits */ + subterranean_round(state); + + /* To absorb the word into the state, we first rearrange the source + * bits to be in the right target bit positions. Then we mask and + * XOR them into the relevant words of the state. + * + * Some of the source bits end up in the same target bit but a different + * word so we have to permute the input word twice to get all the source + * bits into the locations we want for masking and XOR'ing. + * + * Permutations generated with "http://programming.sirrida.de/calcperm.php". + */ + + /* P1 = [1 16 8 3 25 * * 10 0 21 * 24 2 31 15 6 * 11 9 19 * * 29 * 4 * 30 12 * 22 17 5] */ + y = (x & 0x00080008U) + | ((x & 0x00004001U) << 1) + | ((x & 0x00000080U) << 3) + | ((x & 0x04000000U) << 4) + | leftRotate6(x & 0x80000004U) + | ((x & 0x00400000U) << 7) + | leftRotate12(x & 0x01000200U) + | ((x & 0x00000800U) << 13) + | ((x & 0x00000002U) << 15) + | ((x & 0x08000000U) >> 15) + | ((x & 0x00002000U) << 18) + | ((x & 0x40000000U) >> 13) + | ((x & 0x00000010U) << 21) + | ((x & 0x00001000U) >> 10) + | ((x & 0x00048000U) >> 9) + | ((x & 0x00000100U) >> 8) + | ((x & 0x20000000U) >> 7) + | ((x & 0x00020000U) >> 6); + + /* P2 = [* * * * * 6 5 * * * 31 * * * * * 17 * * * 0 9 * 15 * 30 * * 1 * * *] */ + x = ((x & 0x00010020U) << 1) + | leftRotate5(x & 0x12000000U) + | ((x & 0x00100000U) >> 20) + | ((x & 0x00200000U) >> 12) + | ((x & 0x00000400U) << 21) + | ((x & 0x00800000U) >> 8) + | ((x & 0x00000040U) >> 1); + + /* Integrate the rearranged bits into the state */ + state->x[0] ^= (y & 0x40428816U); + state->x[1] ^= (y & 0x00000008U); + state->x[2] ^= (y & 0x80000041U); + state->x[3] ^= (x & 0x00008000U); + state->x[4] ^= (y & 0x00001300U) ^ (x & 0x00000041U); + state->x[5] ^= (y & 0x21010020U) ^ (x & 0x40000200U); + state->x[6] ^= (y & 0x00280000U) ^ (x & 0x80000020U); + state->x[7] ^= (y & 0x02000400U) ^ (x & 0x00020002U); +} + +void subterranean_duplex_n + (subterranean_state_t *state, const unsigned char *data, unsigned len) +{ + switch (len) { + case 0: + subterranean_duplex_0(state); + break; + case 1: + subterranean_duplex_1(state, data[0]); + break; + case 2: + /* Load 16 bits and add the padding bit to the 17th bit */ + subterranean_duplex_word + (state, ((uint32_t)(data[0]) | + (((uint32_t)(data[1])) << 8) | + 0x10000U)); + break; + case 3: + /* Load 24 bits and add the padding bit to the 25th bit */ + subterranean_duplex_word + (state, ((uint32_t)(data[0]) | + (((uint32_t)(data[1])) << 8) | + (((uint32_t)(data[2])) << 16) | + 0x01000000U)); + break; + default: + /* Load 32 bits and add the padding bit to the 33rd bit */ + subterranean_duplex_word(state, le_load_word32(data)); + state->x[8] ^= 0x00000001U; + break; + } +} + +uint32_t subterranean_extract(subterranean_state_t *state) +{ + uint32_t x, y; + + /* We need to extract 64 bits from the state, and then XOR the two + * halves together to get the result. + * + * Extract words from the state and permute the bits into the target + * bit order. Then mask off the unnecessary bits and combine. + * + * Permutations generated with "http://programming.sirrida.de/calcperm.php". + */ + + /* P0 = [* 0 12 * 24 * * * 4 * * 17 * * * 14 16 30 * * * * 29 7 * * * * * * 26 *] */ + x = state->x[0]; + x = (x & 0x00010000U) + | ((x & 0x00000800U) << 6) + | ((x & 0x00400000U) << 7) + | ((x & 0x00000004U) << 10) + | ((x & 0x00020000U) << 13) + | ((x & 0x00800000U) >> 16) + | ((x & 0x00000010U) << 20) + | ((x & 0x40000100U) >> 4) + | ((x & 0x00008002U) >> 1); + y = x & 0x65035091U; + + /* P1 = [28 * 10 3 * * * * * * * * 9 * 19 * * * * * * * * * * * * * 6 * * *] */ + x = state->x[1]; + x = (x & 0x00000008U) + | ((x & 0x00004000U) << 5) + | ((x & 0x00000004U) << 8) + | ((x & 0x10000000U) >> 22) + | ((x & 0x00000001U) << 28) + | ((x & 0x00001000U) >> 3); + y ^= x & 0x10080648U; + + /* P2 = [8 * * 25 22 * 15 * * 11 * * * * * * * 1 * * * * * * 21 * * * 31 * * 13] */ + x = state->x[2]; + x = ((x & 0x00000200U) << 2) + | ((x & 0x10000000U) << 3) + | ((x & 0x00000001U) << 8) + | ((x & 0x00000040U) << 9) + | ((x & 0x80000000U) >> 18) + | ((x & 0x00020000U) >> 16) + | ((x & 0x00000010U) << 18) + | ((x & 0x00000008U) << 22) + | ((x & 0x01000000U) >> 3); + y ^= x & 0x8260a902U; + + /* P3 = [* * * * * * * * * * * * * * * 23 * * * * * 27 * * 18 2 * 5 * * * *] */ + x = state->x[3]; + x = ((x & 0x00200000U) << 6) + | ((x & 0x00008000U) << 8) + | ((x & 0x02000000U) >> 23) + | ((x & 0x08000000U) >> 22) + | ((x & 0x01000000U) >> 6); + y ^= x & 0x08840024U; + + /* P4 = [20 20 * * * * 5 * 2 18 * * 27 * * * * * 23 * * * * * * * * * * * * *] */ + x = state->x[4]; + y ^= (x << 20) & 0x00100000U; /* Handle duplicated bit 20 separately */ + x = ((x & 0x00040000U) << 5) + | ((x & 0x00000200U) << 9) + | ((x & 0x00001000U) << 15) + | ((x & 0x00000002U) << 19) + | ((x & 0x00000100U) >> 6) + | ((x & 0x00000040U) >> 1); + y ^= x & 0x08940024U; + + /* P5 = [* * 13 * * 31 * * * 21 * * * * * * 1 * * * * * * * 11 * * 15 * 22 25 *] */ + x = state->x[5]; + x = ((x & 0x00000004U) << 11) + | ((x & 0x00000200U) << 12) + | ((x & 0x00010000U) >> 15) + | ((x & 0x01000000U) >> 13) + | ((x & 0x08000000U) >> 12) + | ((x & 0x20000000U) >> 7) + | ((x & 0x00000020U) << 26) + | ((x & 0x40000000U) >> 5); + y ^= x & 0x8260a802U; + + /* P6 = [* 8 * * * 6 * * * * * * * * * * * * * 19 * 9 * * * * * * * * 3 10] */ + x = state->x[6]; + x = (x & 0x00080000U) + | ((x & 0x00000020U) << 1) + | ((x & 0x40000000U) >> 27) + | ((x & 0x00000002U) << 7) + | ((x & 0x80000000U) >> 21) + | ((x & 0x00200000U) >> 12); + y ^= x & 0x00080748U; + + /* P7 = [* 28 * 26 * * * * * * 7 29 * * * * 30 16 14 * * * 17 * * 4 * * * 24 * 12] */ + x = state->x[7]; + x = ((x & 0x02000000U) >> 21) + | ((x & 0x80000000U) >> 19) + | ((x & 0x00010000U) << 14) + | ((x & 0x00000800U) << 18) + | ((x & 0x00000008U) << 23) + | leftRotate27(x & 0x20400002U) + | ((x & 0x00040000U) >> 4) + | ((x & 0x00000400U) >> 3) + | ((x & 0x00020000U) >> 1); + y ^= x & 0x75035090U; + + /* Word 8 has a single bit - XOR it directly into the result and return */ + return y ^ state->x[8]; +} + +void subterranean_absorb + (subterranean_state_t *state, const unsigned char *data, + unsigned long long len) +{ + while (len >= 4) { + subterranean_duplex_4(state, data); + data += 4; + len -= 4; + } + subterranean_duplex_n(state, data, (unsigned)len); +} + +void subterranean_squeeze + (subterranean_state_t *state, unsigned char *data, unsigned len) +{ + uint32_t word; + while (len > 4) { + word = subterranean_extract(state); + subterranean_duplex_0(state); + le_store_word32(data, word); + data += 4; + len -= 4; + } + if (len == 4) { + word = subterranean_extract(state); + le_store_word32(data, word); + } else if (len == 1) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + } else if (len == 2) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + data[1] = (unsigned char)(word >> 8); + } else if (len == 3) { + word = subterranean_extract(state); + data[0] = (unsigned char)word; + data[1] = (unsigned char)(word >> 8); + data[2] = (unsigned char)(word >> 16); + } +} diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.h b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.h new file mode 100644 index 0000000..71cebb2 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-subterranean.h @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_SUBTERRANEAN_H +#define LW_INTERNAL_SUBTERRANEAN_H + +#include "internal-util.h" + +/** + * \file internal-subterranean.h + * \brief Internal implementation of the Subterranean block operation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Representation of the 257-bit state of Subterranean. + * + * The 257-bit state is represented as nine 32-bit words with only a single + * bit in the last word. + */ +typedef struct +{ + uint32_t x[9]; /**< State words */ + +} subterranean_state_t; + +/** + * \brief Performs a single Subterranean round. + * + * \param state Subterranean state to be transformed. + */ +void subterranean_round(subterranean_state_t *state); + +/** + * \brief Performs 8 Subterranean rounds with no absorption or squeezing + * of data; i.e. data input and output is "blanked". + * + * \param state Subterranean state to be transformed. + */ +void subterranean_blank(subterranean_state_t *state); + +/** + * \brief Performs a single Subterranean round and absorbs 0 bytes. + * + * \param state Subterranean state to be transformed. + */ +void subterranean_duplex_0(subterranean_state_t *state); + +/** + * \brief Performs a single Subterranean round and absorbs one byte. + * + * \param state Subterranean state to be transformed. + * \param data The single byte to be absorbed. + */ +void subterranean_duplex_1(subterranean_state_t *state, unsigned char data); + +/** + * \brief Absorbs a 32-bit word into the Subterranean state. + * + * \param state Subterranean state to be transformed. + * \param x The word to absorb into the state. + */ +void subterranean_duplex_word(subterranean_state_t *state, uint32_t x); + +/** + * \brief Performs a single Subterranean round and absorbs four bytes. + * + * \param state Subterranean state to be transformed. + * \param data Points to the four data bytes to be absorbed. + */ +#define subterranean_duplex_4(state, data) \ + do { \ + subterranean_duplex_word((state), le_load_word32((data))); \ + (state)->x[8] ^= 1; \ + } while (0) + +/** + * \brief Performs a single Subterranean round and absorbs between + * zero and four bytes. + * + * \param state Subterranean state to be transformed. + * \param data Points to the data bytes to be absorbed. + * \param len Length of the data to be absorbed. + */ +void subterranean_duplex_n + (subterranean_state_t *state, const unsigned char *data, unsigned len); + +/** + * \brief Extracts 32 bits of output from the Subterranean state. + * + * \param state Subterranean state to extract the output from. + * + * \return Returns the 32-bit word that was extracted. + */ +uint32_t subterranean_extract(subterranean_state_t *state); + +/** + * \brief Absorbs an arbitrary amount of data, four bytes at a time. + * + * \param state Subterranean state to be transformed. + * \param data Points to the bytes to be absorbed. + * \param len Number of bytes to absorb. + */ +void subterranean_absorb + (subterranean_state_t *state, const unsigned char *data, + unsigned long long len); + +/** + * \brief Squeezes an arbitrary amount of data out of a Subterranean state. + * + * \param state Subterranean state to extract the output from. + * \param data Points to the data buffer to receive the output. + * \param len Number of bytes to be extracted. + */ +void subterranean_squeeze + (subterranean_state_t *state, unsigned char *data, unsigned len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-util.h b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.c b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.c new file mode 100644 index 0000000..1bc9fc4 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.c @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "subterranean.h" +#include "internal-subterranean.h" +#include + +aead_cipher_t const subterranean_cipher = { + "Subterranean", + SUBTERRANEAN_KEY_SIZE, + SUBTERRANEAN_NONCE_SIZE, + SUBTERRANEAN_TAG_SIZE, + AEAD_FLAG_NONE, + subterranean_aead_encrypt, + subterranean_aead_decrypt +}; + +aead_hash_algorithm_t const subterranean_hash_algorithm = { + "Subterranean-Hash", + sizeof(subterranean_hash_state_t), + SUBTERRANEAN_HASH_SIZE, + AEAD_FLAG_NONE, + subterranean_hash, + (aead_hash_init_t)subterranean_hash_init, + (aead_hash_update_t)subterranean_hash_update, + (aead_hash_finalize_t)subterranean_hash_finalize, + (aead_xof_absorb_t)0, + (aead_xof_squeeze_t)0 +}; + +int subterranean_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + subterranean_state_t state; + uint32_t x1, x2; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + SUBTERRANEAN_TAG_SIZE; + + /* Initialize the state and absorb the key and nonce */ + memset(&state, 0, sizeof(state)); + subterranean_absorb(&state, k, SUBTERRANEAN_KEY_SIZE); + subterranean_absorb(&state, npub, SUBTERRANEAN_NONCE_SIZE); + subterranean_blank(&state); + + /* Absorb the associated data into the state */ + subterranean_absorb(&state, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + while (mlen >= 4) { + x1 = le_load_word32(m); + x2 = subterranean_extract(&state) ^ x1; + subterranean_duplex_word(&state, x1); + state.x[8] ^= 1; /* padding for 32-bit blocks */ + le_store_word32(c, x2); + c += 4; + m += 4; + mlen -= 4; + } + switch ((unsigned char)mlen) { + default: + subterranean_duplex_0(&state); + break; + case 1: + x2 = subterranean_extract(&state) ^ m[0]; + subterranean_duplex_n(&state, m, 1); + c[0] = (unsigned char)x2; + break; + case 2: + x2 = subterranean_extract(&state) ^ m[0] ^ (((uint32_t)(m[1])) << 8); + subterranean_duplex_n(&state, m, 2); + c[0] = (unsigned char)x2; + c[1] = (unsigned char)(x2 >> 8); + break; + case 3: + x2 = subterranean_extract(&state) ^ + m[0] ^ (((uint32_t)(m[1])) << 8) ^ (((uint32_t)(m[2])) << 16); + subterranean_duplex_n(&state, m, 3); + c[0] = (unsigned char)x2; + c[1] = (unsigned char)(x2 >> 8); + c[2] = (unsigned char)(x2 >> 16); + break; + } + + /* Generate the authentication tag */ + subterranean_blank(&state); + subterranean_squeeze(&state, c + mlen, SUBTERRANEAN_TAG_SIZE); + return 0; +} + +int subterranean_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + subterranean_state_t state; + unsigned char *mtemp = m; + unsigned char tag[SUBTERRANEAN_TAG_SIZE]; + uint32_t x; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < SUBTERRANEAN_TAG_SIZE) + return -1; + *mlen = clen - SUBTERRANEAN_TAG_SIZE; + + /* Initialize the state and absorb the key and nonce */ + memset(&state, 0, sizeof(state)); + subterranean_absorb(&state, k, SUBTERRANEAN_KEY_SIZE); + subterranean_absorb(&state, npub, SUBTERRANEAN_NONCE_SIZE); + subterranean_blank(&state); + + /* Absorb the associated data into the state */ + subterranean_absorb(&state, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + clen -= SUBTERRANEAN_TAG_SIZE; + while (clen >= 4) { + x = le_load_word32(c); + x ^= subterranean_extract(&state); + subterranean_duplex_word(&state, x); + state.x[8] ^= 1; /* padding for 32-bit blocks */ + le_store_word32(m, x); + c += 4; + m += 4; + clen -= 4; + } + switch ((unsigned char)clen) { + default: + subterranean_duplex_0(&state); + break; + case 1: + m[0] = (unsigned char)(subterranean_extract(&state) ^ c[0]); + subterranean_duplex_1(&state, m[0]); + break; + case 2: + x = subterranean_extract(&state) ^ c[0] ^ (((uint32_t)(c[1])) << 8); + m[0] = (unsigned char)x; + m[1] = (unsigned char)(x >> 8); + subterranean_duplex_word(&state, (x & 0xFFFFU) | 0x10000U); + break; + case 3: + x = subterranean_extract(&state) ^ + c[0] ^ (((uint32_t)(c[1])) << 8) ^ (((uint32_t)(c[2])) << 16); + m[0] = (unsigned char)x; + m[1] = (unsigned char)(x >> 8); + m[2] = (unsigned char)(x >> 16); + subterranean_duplex_word(&state, (x & 0x00FFFFFFU) | 0x01000000U); + break; + } + + /* Check the authentication tag */ + subterranean_blank(&state); + subterranean_squeeze(&state, tag, sizeof(tag)); + return aead_check_tag(mtemp, *mlen, tag, c + clen, SUBTERRANEAN_TAG_SIZE); +} + +int subterranean_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + subterranean_state_t state; + memset(&state, 0, sizeof(state)); + while (inlen > 0) { + subterranean_duplex_1(&state, *in++); + subterranean_duplex_0(&state); + --inlen; + } + subterranean_duplex_0(&state); + subterranean_duplex_0(&state); + subterranean_blank(&state); + subterranean_squeeze(&state, out, SUBTERRANEAN_HASH_SIZE); + return 0; +} + +void subterranean_hash_init(subterranean_hash_state_t *state) +{ + memset(state, 0, sizeof(subterranean_hash_state_t)); +} + +void subterranean_hash_update + (subterranean_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + subterranean_state_t *st = (subterranean_state_t *)state; + while (inlen > 0) { + subterranean_duplex_1(st, *in++); + subterranean_duplex_0(st); + --inlen; + } +} + +void subterranean_hash_finalize + (subterranean_hash_state_t *state, unsigned char *out) +{ + subterranean_state_t *st = (subterranean_state_t *)state; + subterranean_duplex_0(st); + subterranean_duplex_0(st); + subterranean_blank(st); + subterranean_squeeze(st, out, SUBTERRANEAN_HASH_SIZE); +} diff --git a/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.h b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.h new file mode 100644 index 0000000..148e5e8 --- /dev/null +++ b/subterranean/Implementations/crypto_hash/subterraneanv1/rhys-avr/subterranean.h @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUBTERRANEAN_H +#define LWCRYPTO_SUBTERRANEAN_H + +#include "aead-common.h" + +/** + * \file subterranean.h + * \brief Subterranean authenticated encryption algorithm. + * + * Subterranean (technically "Subterranean 2.0") is a family of + * algorithms built around the 257-bit Subterranean permutation: + * + * \li Subterranean is an authenticated encryption algorithm with a 128-bit + * key, a 128-bit nonce, and a 128-bit tag. + * \li Subterranean-Hash is a hash algorithm with a 256-bit output. + * + * The Subterranean permutation is intended for hardware implementation. + * It is not structured for efficient software implementation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Subterranean. + */ +#define SUBTERRANEAN_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Subterranean. + */ +#define SUBTERRANEAN_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Subterranean. + */ +#define SUBTERRANEAN_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for Subterranean-Hash. + */ +#define SUBTERRANEAN_HASH_SIZE 32 + +/** + * \brief Meta-information block for the Subterranean cipher. + */ +extern aead_cipher_t const subterranean_cipher; + +/** + * \brief Meta-information block for the SUBTERRANEAN hash algorithm. + */ +extern aead_hash_algorithm_t const subterranean_hash_algorithm; + +/** + * \brief State information for the Subterreaan incremental hash mode. + */ +typedef union +{ + unsigned char state[40]; /**< Current hash state */ + unsigned long long align; /**< For alignment of this structure */ + +} subterranean_hash_state_t; + +/** + * \brief Encrypts and authenticates a packet with Subterranean. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa subterranean_aead_decrypt() + */ +int subterranean_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Subterranean. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa subterranean_aead_encrypt() + */ +int subterranean_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Subterranean. + * + * \param out Buffer to receive the hash output which must be at least + * SUBTERRANEAN_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + * + * \sa subterranean_hash_init() + */ +int subterranean_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a Subterranean hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa subterranean_hash_update(), subterranean_hash_finalize(), + * subterranean_hash() + */ +void subterranean_hash_init(subterranean_hash_state_t *state); + +/** + * \brief Updates a Subterranean state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + * + * \sa subterranean_hash_init(), subterranean_hash_finalize() + */ +void subterranean_hash_update + (subterranean_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Returns the final hash value from a Subterranean hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the 32-byte hash value. + * + * \sa subterranean_hash_init(), subterranean_hash_update() + */ +void subterranean_hash_finalize + (subterranean_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/LWC_AEAD_KAT_128_0.txt b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/LWC_AEAD_KAT_128_0.txt index eb2868f..bf157c2 100644 --- a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/LWC_AEAD_KAT_128_0.txt +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/LWC_AEAD_KAT_128_0.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = -CT = DE50F41FBEFEF36D5F3702FEFEACE6BE - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 00 -CT = 0E34CCBE4EBC5E306B3CEDCFB44C7E7D - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 0001 -CT = 78C2DDB90A06030B7D2AC16A3CF149DE - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102 -CT = FEAC49B484E3D4776D0DB295464FC4F0 - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 00010203 -CT = D1FA5341E557D41AF43ADB47ED656129 - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 0001020304 -CT = 0AA6B811CCEFE188F918A96DB67DAD51 - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405 -CT = 9653181DE18FC20B7347085E95913F7F - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 00010203040506 -CT = FC3FCD530E809EA6B81D5B794A4E9CE0 - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 0001020304050607 -CT = 4B2E4BA1BFD51BA959303A5F6126F756 - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708 -CT = 220A33659087D28A8E8DAE3404FE16E4 - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 00010203040506070809 -CT = 13802BB7C2EBB9145B89A61AF28C4F5A - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A -CT = 3AFF9C1FD8DA0AB59BB051B65BF55C15 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B -CT = 0F6CFA66129A021902BF35F04B6C1BC6 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C -CT = 71762DDFE55489674183F9761F82A376 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D -CT = 5FDEB7F886F5A1EFD34539DF6EA7853A - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E -CT = E80109CBCD8AA85B8979F0FFB8414993 - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = AC6F099E9CE19111C4F4578EA6861748 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 498856CA68B1E28F4A7F33049D57312F - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = AFA7FD9D16D7EDD6BF51B9C1AD5F89F0 - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DA30899DCD78D23166AEDC66D6D9AD25 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 63CDD0FF67B767CD4F123FF73B1491CD - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 8B84DBBDB31A04EEA1B8B786E04620BC - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = B8BBAF6BAF4C05567C5C565234F3C6D8 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 17E733B8410C1FECBE7210ECA1D63987 - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D886006CC0A280B28333C2159E7508C0 - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = E6BD47E11283CD6CE344FA6684F3116A - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 8644BD43547733B091C7F11C73876310 - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 087C48ADF6D0B87E2D4205CDEFF1544C - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 8A03FAD614D7512E680D3B93DEE3BDCD - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 97AAFDE8E838CBA42548A5A7AFDA9B17 - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E031393A03F35BDC2B00558417EC0745 - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = AAED113C91BFB7766B984D96FCC37C22 - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 74D62374F61400AFC751CE62CAFF86E1 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = -CT = 3CA1F6C5B51B4E87880039F409D7270DC9 - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 00 -CT = BC6F5FC1A8D428B5F42810A18C1149B0D5 - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 0001 -CT = 667F1C3D513DE2237A6CE8E45B355BF01D - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102 -CT = EEFD74CE47BEB1E3D23A3B0835098CB674 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 00010203 -CT = EB47DA5D3DCC8E1DE0C1BD627FACB5F9A4 - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 0001020304 -CT = 850A5C051CB7FDEB98EE2060221749FE9E - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405 -CT = CB7331B61959659FCFD171A493CEB410A2 - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 00010203040506 -CT = C56BCFDBA6ECD3CC1E38BA5BC0728C6C36 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 0001020304050607 -CT = AE34995FA5368F6E35B72FB844F9A019FC - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708 -CT = 77DBC9396DA6EDDC278AFCDFBECCC1331A - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 00010203040506070809 -CT = 20DB590C3B2A9C689AFF247C2F03AE71EA - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A -CT = 7C7B33EDFDBAFD1EB1968B85D7451328F7 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B -CT = EC9F79C350C7483FC26AD29BDC9D1B95C9 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C -CT = 697D8ABA49963125EDDC71B46D4F6AE508 - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = A0834ED29329D87EB2212B35E6C5D61C0F - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = C7BF55414465BC947246AA93507CE363B9 - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 0A4F804871F125A1BAF044F3C49CD0399E - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 691FA036486B676A8C05A5A9B09200E599 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 8454B64FA275443145D540B08AE2C8793F - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5D0497BD3D9B7AA8284101AA54DDEDDA8C - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = ECC3D948C67FECE0A1CCFE55CAE2BB77E4 - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 075CB6D1FEADE9B4FBC9705CFF0843A6DB - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 66F320A5C7FE52B5848882932920ECE710 - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DE53153A0FD651E7351C0336EA1FAA4445 - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = B7ED4B1049B8B59BCEBA8A0432AA9FEE5F - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A0A864BC8858272689EA1AF47FE603D79B - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B217238749D23946DA2102BF29175830DA - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 9AE1358B80FD137A3A3644D8ACC19B468F - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9D5BC04E8360EF1CD49DF88F0A237515CA - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1877505DA03FAD5BF11FFDAC1F7C9C172F - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6EBC505BA9FA9F6BD268BD6E5D8D8934A0 - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 988777E0C60DAEB3941431C3E87FD9A160 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E5C3FC7382DCCCA20FBEF356D886993075 - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = -CT = 77DB63325B90DB90BE869909CE939940E918 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 00 -CT = 3B653BF3BB5178F0ECC4C091566A05016B5B - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 0001 -CT = 6C436AE06EC71F3674B4C3E4AA17DD18CAE3 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102 -CT = 0DBC2D0920C6A9491091448868259050FA9B - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 00010203 -CT = 85A6BE9027D250C668967BF488E7A9FF9BB3 - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 0001020304 -CT = 688F9907BFD2412A54CA03A5D9DBB7BD0E6B - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405 -CT = BF90CE321E269DE812ADC4A09DBDBDEF6F57 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 00010203040506 -CT = CF10719187AF3FA31A9493032B54814D7C7A - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 0001020304050607 -CT = B8074331417766C83C5D9D9E7327A09ABBEB - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708 -CT = DBC9AEDA698511AB9F5C61809771350F2C46 - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 00010203040506070809 -CT = 46EA2A671FA05E3493B8C97DF98929879313 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A -CT = F09A5644DD2A51D76D17DF90FFB3B7E7144E - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B -CT = F1698035C4AAF6A797EF42911D8663EAC7F4 - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 945C38CD9A31E342A180D5C32206904A977F - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = E230860A9E13273B4A2C84E915126434EF5D - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 3BD2BDFCF14BF2B833D39C7D83D2F121E977 - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = 1684A27816AB5DB1B785F7DA6973F1827B6F - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 2B42E7331D83D266EEA46DC7436E38842E11 - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = A5AE9E79A67A8732F7FA5D008D5A3F53A7C4 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 7E31792F1335CB02640D4CAB8B658B4F11CC - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5625CB4DC0D820F8F73ADC7097909EAF83F6 - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = C3644088514A474B92A4EE71A494DD40EF50 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7FD6F4FFC213AFC6B5E4519D2AAC781D4E91 - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 58F8FD3B3441893951608240105AB92BB9DF - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A4CA0614842C8A9A21232AB7C27913391804 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 58310930BE2F2B5650F4EA586083E9C600ED - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CBC3DCBBCC2C204FF1B3E741BA45F6480234 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B27C4C3240180F51015C0B0613CDCFC3C3C5 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 22E0DC25BF3DBD2672EF6FC3659554D4CA20 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EEAB2A8DEBE930B4C6644FE4DE5847B98DAF - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = DB2C74AF2BF485E1B152FB2A8695B144431C - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8492B3C0305773CAB4EB045A481EB2CE322E - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CBAC7CB92D24BA0D37CDC09BDA13854398E6 - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = -CT = CDBBCAD20D5237A010B199BF93FD3EA0ABDB26 - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 00 -CT = 231E9F228D9A77C61C65891B58A7E56BCEF0E5 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 0001 -CT = A45A8FE89DF356141002A42A8BEAE9D3A14FBA - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102 -CT = 72CA5B87D1DEFD6E352CADF88B6E1F51D2828A - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 00010203 -CT = 6EA0FC340617A5E4EF9BFAA4F19E5BA9586CB4 - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 0001020304 -CT = 47B2AE66E5B2DE1026A398D7F9E60C5C19E2CE - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405 -CT = 4EAD73A5055859B504249B9A1E7AB3B3BB47BF - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 00010203040506 -CT = AF5D8C03DE3752BDD2EE7C3C24CFA10D62EF08 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 0001020304050607 -CT = 15E9984D2286CF2EF5B62C960BB8C814B88998 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708 -CT = 23E18C90D64A8080A2DB536AFDE28EC3BBFC9F - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 00010203040506070809 -CT = 042C264C298EC528722C7B0378A081A966C5CF - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A -CT = 938EC4272DC2268E374FFB6F2995C537F01DF5 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B -CT = 10BFD186013955DF2AB32DDF1D3BBD8BD196C4 - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C -CT = E4EB4491D9694AE69F22D8C6F2F69CEC90CE52 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 4735B0849571B0A0A2E1B563B4CADF69F5572A - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = A0F6617388332C8A6374BD1B82951CAE53B09A - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 00A55539719DF863B3ECE11E281C0C003E0F83 - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 50FCE4D2DA342E44FD3A028D8880076E9CDD30 - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 20A63BB02241445AFCE19378B5E74220A61C66 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 80420493867A07922654DD5BF2C872D9941A28 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 529419716F77C765E7E86A6ADD0DC10938B710 - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5B6465CDED904142D8B6BFCC5D8285EAF6259E - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 39949316CC0E9A61270FCCE64D6BBFD79DA3BB - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C091918E211C7D06CFB9284840785B8BFF6BE2 - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5A671FCEB59C315D03936E9948E69FFDE19E84 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 9627E0B3E69BBD1B80294C19AA8F5EF4D07F11 - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = FA96BB6F95BF63F3386EF62F7871FE9E609A8D - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D10E85B2771579679BCC33CC3BDB5DBAE94809 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 24184FA6047EAED4795F8B7C608CD8C5FA4E04 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EF8865C8C9A4386D29EB5F4D5C58F2D9A30B5F - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 4842C1618F86183E6A9BBA9CEC0AF45A4B00EB - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5B345E5308DE29CE4A7DFD7D2264BC2E4D5148 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2C931DB11D4DBCCC0E9755B43086B22B96EDD1 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = -CT = D40A4B1141F108A1B896DFE81024C16C8C52AB2D - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 00 -CT = DC141D9CD9A47259789C085F8A048B1A37735E0F - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 0001 -CT = 57C00B24CFD8C8A640BB356FC5D933DD61530BF2 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102 -CT = 6F0079FC8DDE59FD9354668F0179AD5B0F0F51D3 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 00010203 -CT = ACC222076F6C23C6934D76DAB046821B42D6FBA2 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 0001020304 -CT = 0AA5A1422143CFCEBB5614100594301F9D9C46BA - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405 -CT = 0B93C93D524BEC4CBFA6390862B578EE0A9F33CD - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 00010203040506 -CT = FFBA30782686ACDB48DFFA5D9E1C93CD6F1AAFA4 - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 0001020304050607 -CT = F474A623EE765DA1EAEAA5838DDA07B529430DFC - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708 -CT = 8F298CCD071DE0FD434F620AAE69EE2758D5DC86 - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 00010203040506070809 -CT = 799D733648FCCE075F991F3F73BC1FFB3D8B957F - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A -CT = 109FFBF70F3C9D72247D10A82398980F600ED755 - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B -CT = 3826B619719A1621E8FFB9156F8233CA90F45DED - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = E5E9174A0A929FAEDC2BD9396F45ABE05C6C403F - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 6A44DA6575CFCB9B7D1518B71CA9EF4ABF872765 - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = B8A27B8B09764D937D25F6980A978E379D8946DE - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 106FD45D3953F34FE649CD7FDE3B93146484EF61 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D6C3DAC061BF10B6E5F285FF3766F103E783B961 - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 872CDAC4BDC456626047A4321747EAD16393A1A7 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9EB61F2B366DED195E11FB52CC270FC6A8B1BBDC - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6884A7B46EB5EA6A021D7A35BF3099E3ED3A3E5B - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = DEE8E6C7E54E286FDA055152EEC9953C09CC3AB5 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FCF6808C0FC27A30B389A2D95A4C1CF9BE55E282 - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6BF84BF53BC03F130958B6BA6EABE36173EC8EDB - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 355A6D58774CA97E931FF80AF17A1586A8B55660 - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 151AA0F6FF73A4224DABF4181BB4AC56B1F0A872 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AABF6743DA32480BFCA88F4BE88B7B6124CC06CC - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4765605A1A8049328AE5A78481F8122535C5A0C7 - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 4E1919BA63E7F619303B472D433515E41CC0A1D7 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 76E5E86645B58250066A7498EADE8AE9D294D609 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 92E67E0C83EC936F752EAA9DD367AB070EC9A10C - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B34A7E8B8B5491B43F02E863BF53DF6CA8DA66C9 - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 4112446371C13C1A4C4DCFAA2C07D2B55ED97003 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = -CT = E53BA594728F0856DCD8AD2AF185CE4913F94DD68F - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 00 -CT = 67F121E88A20E5B26463E4B594EA35D6FA97F2627B - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 0001 -CT = C66A200B8503938DFE986D64A5822490E9D8DA5B18 - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102 -CT = 239B6383BF63CCB3EDD789E8507D32D5B4EC3C05DA - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 00010203 -CT = 8B3765C431325B699A88849B7D5D14203D899C8889 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 0001020304 -CT = 4D3692C42545AB455F0796F407BAC98EEC216C0B7E - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405 -CT = BECC6C4993BE15522EF459B1C6E73E1BB5BDCDD9DD - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 00010203040506 -CT = 10B71020C508378CB725CBDF96DA64369E5ABA169B - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 0001020304050607 -CT = DB127DF4A182823A0E7207B822A94AB51BCC580849 - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708 -CT = E370BF8E18541A7DE091AE6A445E672AF6A6F64BA9 - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 00010203040506070809 -CT = 0BA206C83BEA9BC3B642AD2A75480713BCE9F5E761 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A -CT = 820596C62C6BDDC942C3AE7D5477FCEAAC47AA2CA4 - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B -CT = 8D53816CFE0E93322ADBD2D8FE6659F89CE5245BDE - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = E10357C9B4ABD72277E490F83479C4BEB234E337CC - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = F34F696A0FBEACFC22071AFE5B39A291ADAD54B8F6 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = 31BA53B4851926727B021795553DDC4AADAF4E5AC8 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = F79A322E57DA79ACB19C26C36EEE122315757C8501 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = FA498549E0AD3EDDDAE1B064A86AC6BD2808BFCFBC - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = B7F1077F02189C27EB2B7180BD24FF4B02BACE4882 - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = D38173A5B2B574B044C6FFF20E4E9A472EDD6B6FA9 - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 7E0CD2D9D3E447E4E0CDF2E51B1073B37DA703A027 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 806992DADD9DD5B77994506411537565D97DE80209 - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 343E7C80CE95844A47ABE91ACDC43E8EBA5585BB0A - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9D81FE468796C55765CFDAD0C30A8798D8275989C6 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 54B850FC9EB402331D5EEFF4A8491B21DEACB2D311 - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = CFC8C67E88A5AEBDCE6785EBD7BA4A5AC8A65573AD - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CEAC07E588085996A1CC709424B001758E698F812A - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 41B0973851C8B7C412712208E5F7C946432B7FDBD6 - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5CE236352CBED518653CBEF78BB58075C84138DF54 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 88066436FCF6EEB0CBF0630CDD52FB949E2C0E9307 - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 45EBAF49745D54895F413B549AD1B77E37EF54C030 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 0CA28956B3C674BBFDA9DABABD1A691BDE754B199E - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = DC30FAC3111D66F50B2A56B66B2FD40D6852D4460B - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = -CT = 23D23672C621EA633B7F5DDBE7AF7169B165994FABE6 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 00 -CT = 340E60A2E2DE3AC2ED11F6979A310D2165088717E343 - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 0001 -CT = 659D444EE1EA2CB21FAD525BE19673A9CC401AF16358 - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102 -CT = 595B70CC60C2C70D613692FE781975299958895BE529 - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 00010203 -CT = 8487542BCDAF548B98A9CE48187AED56DFDF3B199F09 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 0001020304 -CT = A6ACE31F2DECBB82EDE341AD0FA14E2F91322D86D3EB - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405 -CT = 5EED41F0C72967873F0D175C930EF60C943871A278A0 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 00010203040506 -CT = 6363AD9EFCC98EE7DD5D95FC0EFC243E81157B175322 - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 0001020304050607 -CT = F4378899F011A8BB77D32020CBBF0B3AE22688CC4D11 - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708 -CT = 72BEDBA173092786941057EDCD2A5AF34415924E879E - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 00010203040506070809 -CT = 9AD09DEB2740CD6B0C38FC98AC35C3E356F03F5FFD61 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A -CT = 6FB82D2E5D6FCC726A728AE3DA553485C46EF13E6441 - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B -CT = 9D96FFDC2E36D868169E05F9F9CBDFD0994BAC2DBF15 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = 12B47986FDC5C0657C8A2BAC6E1013D981D86C7927EA - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 3D964ECE39E0916A524808D1873CDCF54989C252374F - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = 26EF3FCBD2F0984E4048E436F9DE0B42CF8AF7E4399F - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = AA8E7264D4816F97496329295327B071D669C287E16C - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 75587BEEDF4A4745513A6BE1ADF35D2D361092581FF8 - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7567C36D6BC8075C213270D99E59ECE895AD58683743 - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 551B7A7003B305E6F5DD2DD3D7C2CFA7C5ABAE1B4FC2 - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = F5FB1F41095261A32F27E9F45EE48AE01BF852E76D30 - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EB75603E0D50F4B199225D12B1ED3C2035C7E780C6E5 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FCE26B51D4E2A8CDC7B067859B0C16A042E7BB0EB67B - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = A565713FE362342BD85E64F0BE1EC891392E34B153FC - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = BD441D741C6B1BC331CA4DFDC9C1D86E728154D9A1D6 - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 535927E0CED8E779F5D062BDEE06283BA22DEA34F48F - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = F35E24D2E9A023481A916DAE610D53427BE8E67B1524 - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2FA4AF66043FF68F3FA10BB9DC8E666760315BE04E51 - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = A64ED97F9F0AF20B16BA1BF5E00AFD89030EF411C502 - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = FB1C3DEFA080DEB2FDA7639F887CD0DB935F785B589A - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E6B63AFA34D6140724961B322445DE5CF72491E148A3 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F971F1763F18382F13B2BB29F669299E977666C0A140 - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 9F627658C91BF2CFE1F752B4FF924AEA40E3F2DFE359 - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = -CT = 20EEAF7858F9A8F0EBEF1FFADE91E93AC660F4B8146938 - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 00 -CT = F5D1A8ADBCA20A31864D7F9F335C2418A42A10756AEE1B - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 0001 -CT = 2464F50F1D19BF35644484E1F54DF4B13942E3B0BF0CC8 - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102 -CT = F0C154AE15C4EF13A01107833365CFF796C03FCFA0B575 - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 00010203 -CT = B508B75492DDA50212121DFA921495F65D1F06F0DA087E - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 0001020304 -CT = 84DE619EA21635A14C0DB5CCA88C7BBA16B0A882A63FB5 - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405 -CT = 281A0647D9AA50F6E62AA2F5DAF1FAB3E4327ACA847B95 - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 00010203040506 -CT = 609F354375D42375809707166AFD214F13956B9D3421F0 - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 0001020304050607 -CT = 16A9C9238F1111483682DBBDC383301C93531E67750DC8 - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708 -CT = B5542F17261AA294888A4F368396967AD76E336403D1D9 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 00010203040506070809 -CT = FE0F8F97095871391FA24529C1B8EB1E9550E40E353AD8 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A -CT = 82C4DC0AF47E80EEF40AA865C6EE75E568154A1B48CC09 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = 6FCD09C52BF129865D176F8C7CE0212A9A542040FB1517 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 87482449A35D8941289DF8079F8A33B3EDB02FD15139F2 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = 2889DAA5E4267BDC0C6DC9C1D2EBDA23C1FC4DC4CB6240 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = 6058654D68E78D04B20E97229D330C2E1445405C57C985 - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 841224EE0E59DEDEAE8CF4048C24D8A74152CABA081714 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 02F061F7C6CE297F182ED0E20B4843119A49DC6544A262 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 550AB3B50B9681052BDF0338F49E70F4D880E23A6DB243 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B5D250415944921524947B25FBA55021DC9074A152029A - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6C1888AAD7692D0428EA274E2E2323DFC542EEC226C87E - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 7D0299BC05DE1E95043159A2C4F096BB57A4D9F47F4C98 - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = ECE57CF6FB450738F4626CA4DEEBE9B5A3D36AAFBA5AFA - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 33608181DDAB8BCF98F59CB2A0C0C523DC764F324903EB - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D7A7680C502C333BD098606D7B6107E3515016F75911BF - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B8AE7D28C3D75D7368BF4A6967F02735D52475FD45B6F5 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 93FAC4464EC4311B7B4D4E1F385FE0C92455D5ADC629A5 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2603C566FC9D73FECED712177D41A1AE406D1D88B8ED61 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = CD9C0894C35C88DE7E8ECC60676E850DFCDAC1F2CF3D96 - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 58864F943B21F56B464E8991D643DC10AD30527F39FD77 - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6F0F23D86D7486CAACD5C09BAAE52D998A2711461E7A07 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 472BFC4D5B80822B46BA4013B9B11E198FDDA64CCA957A - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 5E84C1A8771E0BB028300BF208F8764820EF5368FC6D2B - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = -CT = B055EF77BBE7DB2CAAD152ED1B947D22B199902BA129E44C - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 00 -CT = 55746D69D31CE342F9E10383E732A0D9E900831B56E58B8E - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 0001 -CT = DBD0CBF0302443F9FC5C32F3911191EE28561F04D2EC65C6 - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102 -CT = 46F5584322823DB63F942DDEB76A3CCE3A16A0AF62C675ED - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 00010203 -CT = 65028FF82769E836DAD4EDA6DCDFC7592934DDBEF06DA169 - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 0001020304 -CT = 4F0B15DB7769CECD43DBAA324D3440FC0B98483D44BC396A - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405 -CT = 4481818336601B08D38037FDC643283950B2788C0578FC7D - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 00010203040506 -CT = F72992C06519831C13D2E4F0F53941A00D9561BAEAAA0DE2 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 0001020304050607 -CT = 867A7AB4D1C55F5AA1D7F7BCB15673697748D8FCE3F11667 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708 -CT = 97792FF815F8D4EF43E089E529F78940C228370292F40BBC - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 00010203040506070809 -CT = 4C2A442817FD54D6358B19E17D0EAE20ADECF6E141D2F3EA - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A -CT = AE0F54A5AFD0836AD1E2BF0BF3BD1A5DCCAA15CB5E79B7A0 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = 85CFD0690002954799D76A8FCCEA15DABE11AA4713CBEB3D - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = 3EA0CAED6E4C88C80FA2EC7AF3C02B9D6DBDE79C78D51BFF - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = EBFE915EF8EACD15BED6A880BABB783D198A7D6A709C1403 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = C3729846F306AF738FBA4EE9BD544A318D12AA4D156D2E3C - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = 4C95D4AF066CF8834A44BDCA1FB6165DC6E7EEC05252064E - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 3E14B49AE49A2B4CFCD39A1DBB6E0B0890BC5B936B060B9A - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 28EEC9D641B88571597549B08F2EFAD2EEE31E67D60FC699 - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E7F2479AAE6DFFB9A7001DC3E6DD33B7C26FC4D612F81714 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 2FAF1896A6A2159B4F02EC66D715D8143E3135D9FDD9E1F8 - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B818B07AE16909CC50BFD5C56CE210467076779F3918A4B1 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = CB4C54267F3C6712D4B33F787FA0401056AC9D741F98A4E6 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 8B8BF0B16B1398F0394C3D3ED208DBA27D2BEAF1C8231E34 - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 26B04F41F1C4FB6F17812D226708BFCEBCD7DF1E8D2C212A - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 24A625AACD7937C19DB88643FAFCA4A2E866CB460B352CC0 - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 790203C65DB09A718DAEAD881ABD9098F12909EA60D9B6D4 - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BE0DA3C722114D4F6F9E8913B53CF5D14A0266810D2FBCF8 - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BCA11719A273B262F387EDBB7EC4A37B3DFBF99C81D5BFCF - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = F890CB56AC2AF5B584B49929B7214FFEA4B082478BCB7900 - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C7293C318480E544C16320D60CA69218537DF0115F2AD85A - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B660BCCAE329F4901EE021AD0329A6C4DDCF7D6A7270AAF5 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 23644CDF0C5791A8E405EB8B9BB9E3E771373AC3335FB93B - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = -CT = 52E5A65A124F84CC358B9186A7E8893BDCD3588B2AA7AA5479 - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 00 -CT = DF22AB02F11EBA1DAEAD4EF631419A3D7ADD249520F9F5933B - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 0001 -CT = CA64D3CAFEB1440D7B62F3ED2EE1ECED98B183EF85D614F6C6 - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102 -CT = 55959446B9426393ED2299F54FD051F89568E251D715760154 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 00010203 -CT = 06DE24D6EE22DB3352984209F9AF646DFC12712B553B4E89B6 - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 0001020304 -CT = 865690C75BE7D9E3B16B75CB688302B1A94C16E2ECF9BCE09E - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405 -CT = EE1B08EAE63B503847243821FBC70660CB38DE060D8F836051 - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 00010203040506 -CT = 4026796BAA67209261A8D4E7ABEE28F8AA3B73AF62EB157D36 - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 0001020304050607 -CT = 27AC747CE57D2B241BE3FE9DD8AF6544F6632BCA6C50A7CF51 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708 -CT = 2B41FCDD66BF7603355FD785354C29656CE2487DB8480DBE8D - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 8CCC087F7E2EA2B08B23695751737C322EEA378BC1C0C4E71A - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A -CT = CD0FB38CE46E073EC1117C55579BF9349D01BEA7D74B66BCB4 - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = 56F5332B835A536764C1D6E3C6FECDFE7B5599C6D4DB04C36D - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = B8EBA6BED3F38747DD16782D39422892B2D53056980694EE95 - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 06CB835370582C46DE612EEB9E75E792D5AD8147F7C87DC853 - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = DEFBE9E014F4EA1F77736A3B347454BB437E3B1F5E2BC40BE5 - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = 02300424C0F65458F08E82424333281ABF06B92F8A496A7A43 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D29F1A2A154DA2360B10D4B840FC625AD7BD838645397970F9 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = BE9DE5263B4F6E2606BB6966F80C1FE07BE2EC30EADABB96F2 - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A2682C077643DF989D40F0E69580819D9AA6AE68504E735DC7 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 11AC5F896F099DFD894A3E830D87C1807E868C0130B9AF68BD - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 9CD3B4807DDC3ECF065770BC0B0BA92DBB323DEF102CD13706 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 86E7BE28931FEB158CA63D578791591AEB67D34A82F5992C16 - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 16463759483476245525635F25D92A6A416C6C7BD9BB06A403 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 7AF9AF625EAD564082667C714BED16A2FAFBB3E7E9F93F1F5B - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 710B4B91F696A91BD6D409637938C85A208780281ADB500CC7 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5DC26C74A48D63FCE3328E39A69DAC103DA4FD701D820F85EA - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C167EDA706C4D3195BE0090596F647FB70502405A92CF84625 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = C6AE1C7A6EADEC09FC52DBDE742A404E7ED59FEACB9400BE48 - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 88C44407C879706E59B46EE1C1434C6CCDC2B82EE1B2158F30 - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 1859F9326DF7BE549D26855A841CEB5E4108ECFFDEAD90ACE0 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 6CF6813A09AC9333996D390291214C5BE66C2185AA75AB80DE - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E301AD1837383AD0EF2DA36F0EB47B226357AE7DF0420374AA - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = -CT = 549C9352148022CEDDF4BAD87CBC140B49A21848C070CFBF846C - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 00 -CT = DF7388B7C179DA3D22E43662A30BBE723EF19D7E16BF13E5907B - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 0001 -CT = 3F6EAD4A906CB81BAC94B524588080BBEEB47D3E988363051622 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102 -CT = C034CC9AC6CE8FF7A5D1FAB749A05BF3C0D2F02DCA3873ECE23D - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 00010203 -CT = FEF5AD77AE86040B0C1B61816B44F07B3B1700640FA19E7EBFC3 - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 0001020304 -CT = 651D84E3C978D814388ED9DE72705CB6F298B9485C9FD6D620DC - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405 -CT = 6EEA31A966A9A5A74EA28E6742FED1ADF930A52C186551109C79 - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 00010203040506 -CT = 39E694A18B9F3A58716AF8A94040770779D355A06A47DF589330 - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 0001020304050607 -CT = 2E20D564AA0D8F10EF356F60F6BEB5904E6710A5BD6B82938E1F - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708 -CT = ADAC5883975C30511948E7A72B5CC56501314CA9F08F1D148709 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = FE455A16F8DD47BF28A5ADF1E6304BC360DACA7D7C2D040B93C6 - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = 4338DCB059E9066562CCA9EBBD664F99B7371B9EC13797DFB011 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = DD432C33B192F363915492876CA1B1C3B68B50E69025FA27F071 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = A7388B3969626E0E39165043F2057F56DBB7276931F0DA149568 - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = F5F4E2ACFB4CCC7DE0DA695A32D9A3A7AD88686EB8B678C26E3B - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = 9648EF88BBD12056A4D79BFAD58E5A4F0655B81CBEAE463CDE05 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 7EA166D90222290B2AB7920AA508A1619847BA6D003802171AE4 - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5039C0DDCA844ED6083CFC35FDBFF36E5DCB98EDDA2BD49148B8 - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C78CDC68246FFD74E27D83E0573D6EBD880095DF2F127CBECDAF - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = AF9AF6F134D2EE31CC80BDA57A76C8248DE28819760A9B398FFF - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 083121FEAE252BA47C258614E826A19FCA24BAF6766957FF989C - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 151AA3B2C8EC587EF6A414D07045FBC28C09801A43DE188A6598 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = A0AFC655B741B8AACCB9CA261BDEC2DA51544A01FE24E11931E1 - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = D300200C2E0FAEB1EA997ED433772F4963868A8E47FBFAE32B3A - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 64E7627C9BF85DB87DC43F5B14522C5CA7694E2B56654FD91A09 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C4BDD15654D02ED030DC6187F9EAF1771D26C5383FD3947ABFDA - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 545B3115532C0C72B673EA97143E0747CFAC628EAAD4773F9F1A - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BC9D0A93B689CA502D539EA258B624D9C2250BDFA89EFC8F0184 - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B24EE7B97BAAD2ECADFCC0D9302F597E1D6D031E0CC3E615957A - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4BE864A4380171AA1C2C615D83E32715CCBE9003986C97171CA7 - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 1B37AD7D34320C3097518819335594D9B2B914ACA931CE5F8F60 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46C11113A1174A9922A2C2D5773B685353B9AC2027E65345A0EE - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F63D5D4924C023B8617DA0459C9385E7DABB045C6D6BE74AAEEC - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = -CT = 35FC6027021DB701394CFDD82A2B67201B17C2693738922ED1C2CE - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 00 -CT = 68A63C647C4E3A5176200A3EAE775226D9C1AFEDFC9C30357E5C71 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 0001 -CT = D00303E57BF658E2FF2DDC2A8DA1715E38C18972C7F819A0D87002 - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102 -CT = 7E9BBF16045F04A391EC3985D4394D90A33E9FDF6F7FBBC3E5C6D6 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 00010203 -CT = 2EDD982F1FA334580F8E850F061E746852A59E2D91629796C94061 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 0001020304 -CT = 739B7BABA15E221C8481E832165F7CAE8B629D5958B928697BEFE9 - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405 -CT = B4A202F1F690CF77EFBBB1DDFB0ACD3E34D67C6712754E243305E1 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 00010203040506 -CT = 21A2D58CDB0C1828B69350A2B9C9D82D42234C9B51A9956C477AC5 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 0001020304050607 -CT = DD9D1242BE70300B8F438E6BE242F5C4F64FDA3593A39DFD002DE5 - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708 -CT = B8D0827A29D5A3FB8544E417609F0AE4CB3F5772E1D89AB01400DB - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = 33840F770965AF999B08FB74EBB058BB982846C13E8DC2DF8EA825 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = CF6D644102248A48846CF20022749268DC7ED81DFB588D1AAD7924 - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = 7F50A824DFCC07F1CDFD30CA29C6CD63C87F075241FFCDD00642CA - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 6B85F3828B192B55FE21A28A404BB84FCACC2284D0F7DFC9C67F13 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = E7D03368E2F25B5C9006DED2B1D6B395CB6509920674673A65BB95 - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 2B3741896BF5AD764D1998E9DA20EF79B0585AE801BB1EACD93CB1 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = B8918DA0B370401DDC840C8DF0B6B0F83C29E01D72F45388DE0567 - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 9AE09BB5415086C541211EEC96BD15D045338F6959081685843CE8 - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = CF486814F7D1FB6E0BB74B18C70F53684476DEA6E1FCBD03EBB049 - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5F32493697CBEB0D074F35E3450264CD330E4F7E506908A81ACCC1 - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 36EBE08364CF9327BD2DAA163D2300E7435194A9F6BFB91FB0BE08 - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5788F811C92042D1B639E6B8B66293FC20D7620CC02BF7197CCADC - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 196946E32373CA520CDDC36BA5FF7BCAF40A0F30049A9A7282FA6D - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = F8D322E0DCAB7B6CF25E5B9B39BC7AFBF470A0E453B84D2844B676 - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = B57050A0BD6EC8A3B2025F5CCA4EFCA3B330E183AFAFAECE860A14 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = FC2625665693B86CEC47B6484CA8BB9EDD787EADD6286A9B8F190B - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 6FE134FBA45EC228FB1F705FCDEDC6E83D13FFE17A21A4DFA56E7D - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1F9392560F77F1DABBCC6FCF6FB962CE721F5008BC45ED5AFA46EF - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 92CE51D5A349AA339A879B5260FF702837FE57980DF53D78934EFD - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4DC5B814B50F3B628C6845AF22D252E13072641B5F6F190F594FE6 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E940259DF60AB3C5CC34C818A570F5FA8B093D79C5D369D6A6D0F3 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 694B1BC359D262FC58A7C02C2CC9EA79326B98AA5BECE6CD803FED - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 81291197B1671AECC7C8FAEA1D603CD6245B4F01D75BF099B7C685 - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = -CT = 710C81EAEFC2794921F791543C02CEF44655BCAA08349CD7FBC500C0 - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 00 -CT = 97455A31A07628DBA6A8712A8C36E32DAAE2C58D57783A5FF85B9AC1 - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 0001 -CT = 9385C1BF410FB9CCF89120035C199FB60055F1906321CA7847CAC860 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102 -CT = B5E389A19A5AAB16F696B6FB988A1353FD8374806E239C0587183166 - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 00010203 -CT = CA9A1F651CE535D5BC49F43C310B8AF874A55F9BCF308CFB93FA449A - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 0001020304 -CT = 35F53479B700FF85F54E5733AA8D33D2E89695635D047454F0CE7FDB - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 21B52F4D32A22130C26491BC8E0143F22D522AA68783CADA06A7B35F - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = C4DF30488AA5C2F6D7D89004561CBD084353F26FBD992BCEB85EE8EC - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = BE443348A731EF806D90FA749E13454D564698D3A6509EA0269B79C2 - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = A24252291C7E77F8A871273A625A0A0BC05ED90A5A0A21537D66D155 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = FDB95CB22311C6CA62B3D00857933858AFEF1DD9BDF825A30C5D6E80 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = D4ECADCBF86844BD3073FA68B00E98AC95991382540EFD0BBF5B9182 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = 003C4ECAF96B124C3E1819AA92A140B8D4AEDFF8136DABF5E48C66DB - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = 9AF94D093F74130BD0983CC3421C310A40C3EDE836F2C6688D4C0F4E - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = 7CA37C9FCFFF4E6566274F96A6CCEFF1CB84D85970EFAC6A14BB10DC - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = DF34B05E2D82181F45F1149A64130F2F4FA46560132CDBCC10313D3F - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 19E7A98518081CDB0C2E2A8EF7FD468DC524D70BB927A32730DCC171 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D49830024627895F241E35BAF790F4E0FF2BA99F36850FDF65A24784 - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2B7C507C35733F609F2ADFC0C1E26EE929835BFA17EE73A061E2286E - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 078072DD69E0B0B7E8CD698D3FA3326423B34834CFDD298D0FBA3595 - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 32DBD6FDDC516CEADDFF1740E99F475700C7B8F5376249B892D5BE35 - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 85BA943A30DC35AC8180B59B4048EC667567130D7DA6A29BABDFBC58 - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = F544DCD9C22B72CB5EBF758270FE922DB3ABC739666B54980C414EB8 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6B413B17B13CE4876CA4E9B888F3393C85DABADCEAB21BD036120D09 - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0718A51545129CE11AF01A5B20287918E25B1C6695D6FFB321C27B9B - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 209150EFD1DDC454C36EE2BA686CD063AED4CFD8113780254B2244D5 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 35E4D6ACBB154DAC6C8AE09897E2CF494D2A26034C2B84B6B51DFFEF - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5A4B4BDABC66B0A2956B3B35AD54B07116DB0D70C5642BCF65E742CC - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 211FE5CC3E97A54ECB909BDE4501052CB06726EE58DE575D35FC1090 - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 784A9933976B0B744281F3C2B524EF3285B888EF23DE023DF01D9F11 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = FF1228A98B0F7CAE80B877CE0A121C0312DB7367A3961D6D3F2C0A48 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 00F1699E173C680246D2459D17B2C4634B5837EF16C8F1E0DC1F3336 - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 1C7D322993BC9353ABA2F20B9088FA4B4FDB8D849C276E507B75BF41 - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = -CT = 90750B6892625EF851205E0BF7C241E8FD412AF50F7D13AC33A20C8FED - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 00 -CT = BB654F9C761F423896F006199DDF0408FC237D0754DF242E272A5F1164 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 0001 -CT = CBEC1A2B99A0977AE3233BCA0D8CA52D42C39D7698C6514369F0C872F9 - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102 -CT = CF3095B7352958B4FD23ACD1F61F2AAC049A2229A83225E29A762B393F - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = 6D405261567D2BFB01803954670FEA7831B66446257C6EC71FD1FB2DCF - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = 075E3ABA6B0894BDD398752DD84D136EDDCC741582AD35698CE114997B - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = C9F656940CEEC532AB8434B2B8CA030DC4FBF891D70AEDDF009B2777DA - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = D92693BFEFCDDBF483B7E33C598BBFDC3B7AEF9C8B3DD222FD6AE59B5E - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = 32590512BF51FCB44EBF75AB71B2E33A9FA6EED07C0A34BF7396C93235 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = C26FED8FB4139D35D8BBB7E3B13FAB5B19610F55FD936D4408FE0F15C1 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 6BE53FA48263E7663B66B490E23DED2D0F8D7DFFE7391CD5EC261A1D8A - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = C95F48869E616DD5238943FB13A23F70C044681BD5E1E677628A0F87B4 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = D44A59DE89FB2817F8B6022F348C18C2DDD937263CF540864C1C8A2D11 - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = F12EB2DF70B31D1932C361F873861988D6789BDE07C6FDBC686BCC43BC - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = 529173F56C8E7EE7C2CA2B1B64780378D2862E5FA80593FF25D42D50E4 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = 8E7754F5AA0D0E37825233E1BE8DFA666D9AE7907703142AF2BC2F753D - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = 6D3C5CA2ED8EB555C4F99E0427A95435CFAA01AC4D6B9F7268D18B5EE1 - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = A48BF53FBC343B9FAF405C06F07DBE35C198E85DDF777E84AA8C0BA29F - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C639158FF11F2DC0624AA30AF4763DDEC5DB436090C702D5E5118CF65D - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9D0014FD183D6687EF5FF3DEA613BDEB8B8686CB213C568F7F1CB44FF7 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 7CCFF0ABFC54EA408290767C82C94A01468F0EA840DB3A92E6FF6660A9 - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F1622935C9EE9C25492CEF9AACEAD5EA2068348877D28E9904E68470EE - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 74DC7AB2B8115BBD28AA761CDE06F6D976F05D8F8867CECC11B5E832E9 - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = EC859B554B7C7D53751F0E809AA69BFB09D4CF26F8317D0F42FA24B70F - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 43CD2168BBEBBA21E4FF49C25DAE74223240DC3BF8883389BD4898F729 - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = AAED57CF635F135636905EF7AE84C17A0062D1919AAA12DBFDCD3BB064 - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9C737BDF9ACC7445C52B2532F9AA62AECBD41FC7C38689F38EB239BEC1 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = DBDBF5002BC52AA396F30DC0C395578EF3FE6FF4CE4126F802A373C769 - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = CC0B9355A25437B949BB394D404E7F82A0D43887AABC729DD5E95D83C4 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 430817223B3753392434F1F4EF48071B859775720F6AC7FC3C7915DCAF - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A9625E0455296B4998E5DDDDEE0C545DC8B81980BDFFB53EADE23FC957 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 194C2E12C916D1929B8F9AD1EFB87756787942F1F5A57C907074EDA07E - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3A34CF1714BBC1DC3D4BF3CD90C0F003F987013F191963047983772B15 - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = -CT = BC6ECE05EC221EED37DECD3B3DF234DD146F4EF047857A6C44BECEFA201E - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 3322100F12E37BDEF5EE9E0E49D376B5E494E8EFABB4747E0408B3381CF6 - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = E28557E70FC0DAA163A89E21BB4000C5DB3CF25D7A01AB104D7C082A7732 - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = 4C9CB1559C0BE301B3ED3F1A790D652C2E3E45D817D74EE5E7C6192B53D7 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = 8981FAD53A9C916200119A5FB82CEF425C9D122EBA792B3B1C677DC63301 - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = A7845E76B97294529FE364E9FA82B440B9449BBD4820E2E6E3EDFCF52279 - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 51AF7E8339E7554523CFADBEF038BED05465002776BB2AAFC4718FE2BE3A - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = BB3CB72A1C484F116784D181675214BC2835CE56C1104F9011DFBD03C070 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = C096FEAD7F7FE1E7E39B8D8F2AB4E309AA8FE11953CE25A9D42B499DE6AE - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = 8B1317E6835ED42CA4DFF3E6984B678D118DCE2AF241AE4F0723780FEE62 - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = 684F15E2A34F0B4B02626DFD059EBF6C989A3E6A62D8E23F305FBE67135D - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = 5D6B397DF2FC4E3572FC473421C65A7DF88133314B5AC03BD6654A032A14 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = AF75A493942305935D3EE0727ADF142B76DDF5DC2E9F94082C3F2C883975 - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = DBC62530FED70B01DDBD54AF8DAEDC106DF39EF1810679470D4D03D138D5 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = 36082FC563D034433EC5350A0E9077329400DE4E7775DB371FB2E4CD8F24 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = FC81F4DFCCA9278F300788C4093CB8DA3A45341A45511BAF01421983CA48 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = 72A9AB6156A2C44B5FDFDD8980E191B63C7524054E51F5F89310B54B9470 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 2CA1326712A392793B60F3C0CE274F6AD3A795C764A0144884A4B60AF796 - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = A9F45B697EDAB559E6A8D1091A0E2DE0D13B3CA89BB113FA2649192385D8 - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 17171CB4313884FC246668197FCDAE33FCC03B274739452E7CFC9A33247B - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 97276087EA5C1F7334D7A72EBF53AC097B61930DD62DB54650E38E6946B5 - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = AC026443D20136B484404AA581E63D058ABC3AC0A893889E3106DF472504 - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C88CCBE42CF2B88C9C99BD537558EB0BBF710BC02C1221BFE2FED17263A8 - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 01E21A21A875F2B7B138243538F3FC00119F3A462CD9B8B0C520021C5922 - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 9A87032E7DF62A5FC9645FA97EE0CA46634F9760712434D2BFCECFF6BAAD - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = F6AC6C5B941095680D7B735B3457EB27A56823AF0B03E2C195D1BDED6548 - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D43E6ED537BFF0D188F6E92772A55127134BC5619394B348D39E33F3035 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D186B4B679BACA868E79760E9DF7D3AEE2D0E7D50799B3BA60455E55B273 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 27F2DC0A22AA53390C1021100B7BDECB5C5E0446A1246DDF3FF27D0A0C5F - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = D1D8B7329A93FAD776C29E1E0A42B76AB60983913625B7A450938436266C - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 06E9B3080A24F5807E8DF4A9C46B6F15BCECD0A10F1F4320B0E6AA7290F5 - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 93D9594250652332B4D68892D0C26F6149815B6F40DA546052DB3692F60D - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CA441FAE25646CA686776754FFCB65D2BB65366CD6D4D7462005624AC659 - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = -CT = B805B13AFF15D9AD692EFC87B8D174FF99FFA8FABFBC82A71AA0B9E046D92D - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = B2F77530F4B65C6FC299C02CFE78E2085A6625CAE90BDE252873D978D4EACE - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = 2E9E1A49F2BA9419E2916181237ACA1D22E16A3E232AB1F41C6525CC7FB9C1 - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = B5D66F595A0AEFA0E6F8DC3CE16165D0DB5FB83E0B0E68A3AE8DCB4D9E716B - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = C32AD7098272CACE273511780D16697691B305CFCFDADBF66A3A60E1555515 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 0A8203B76F1A9EEF5DAB7105E9E381EBB82C9C725D2C083D398986A90FBE92 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 6C6B4FB6F8CDA530849CC979D5501245AB0B0417DAFA73F1B5191AD23797FE - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = 590204FB78F60BDF86C7128D7F40509FD48200DB3B3A6A85C6F046FE84CCD6 - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = E769D6EA4E166F530EE2314714148DC5AE768FC1A45340CAC0773EC44CD4B5 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = D220DCAA5D4FC01456116E9CD9B609290492BF81C25EF3463C10D027DFD303 - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = F27D18BB8EEF9C2132636BB0F6F89713D3D0187D771F07ECBE789CD9EE0247 - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = A7DF3F2C87A4CB45B0941786F8CE8BED366C975D31AB7C2DC08107D6B7BCB2 - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = FC00B0632CDBE9A7760D3DEEA123DEA4492859E52F4861FB2A3C71831B5160 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 1036FE4919900C1AF6ECACF63E8AEF91C18BC8E7867B01EDF125FAFE681962 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 7474CCC0FB463328C0CA8BB066D41EF0E33A582E5DD6E42970C6740D0991F2 - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = FE30C984D7B441C6407C128A23EF18C8EECC405AD4F573714C2E1F1873159B - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 647AF9D541E46B49A4B78ACC56E3FE9ECB1F61623937E817A4B06AA60E2F7F - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4721E15218081698DD26207B9FB6B91ED5E0510F1F63E4160D844E5C1BF555 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 406A329A549CF54EFC7386972AC62DAC3C5BEE337E313A141B25BF9A9C384A - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 960C56462E0B5FA07CBBF92915573A07DAF8D912A0F03DDDA28D831599DBAB - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 55C3C4BDB61AB5162F73F99C4E20A97545070F5DF589A8CBC745CCF164334D - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 7674A7CF9ADE593D0DE5259A4B19922B455111E622DAC3A1A3B31156CD4CCC - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 298D73298252BB3B90DAEC4602920EE503E6B10976E6A6FB091A6A9D02EF4C - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 43C6A5A5E690C7748114B053EC0D1946736EE8B77A9756206FB14476EE214B - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 94C57ED92E5315D0FD679BB70F44E3253EC43A4B749608858FB8189CF9CE5D - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = D878524E092FFC7D7FC9AFC70F15D02D3BAD3972D9ED8559E77727D011999F - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D5ED027BAA8866985811BEF0B543F8B336570DCB47E0786CA1CADF95F2B8BC - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 480F5A12BDFE026D5FB5482C7DA6B6FB4998811D4640D0B5851CF350DF55D4 - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = CF4616963D328AE89384B564473B1FF3AD4DEAF030AE8E564D35407A02DC53 - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 78A6F897268C551C4533E5A90C6760B28260072CDDBABF835671CC2C2990D5 - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 04CD20EFC396CFA95BDB3F667AE002891F51D869482025335B1DC9D5895401 - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4DD457F11C9BD0BD04F1C07022F393267FCE61DC7987CDDF8C41D04C07A90A - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F6A8B25310C2F6567D2B747AEB34A73BD066722D10A7A4426D6A3D804698C2 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 1969B711FAA9AA531B2FC15E26B09F417458D0E3E39CE442E087315A4B4274DA - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 0C4E9DFFAE8C9BD206BB9B28BF6F75A996B9CB0760CCB8030F6EE81A299B0881 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = 55B9F646E5501CEC8ECEB9C0C352D3243169B908ECC7EF92BD83214A98076C5E - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = F619CFEAA62A7B73717F62CDF807D328651342C52BF71FAC3D221FAD9B478C2A - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = 1B7EE7CE0715434C9EF6EE70C9EA785E66C648079550D0CA3D641457C9C9D160 - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = B79780D690A382A9D1D55EBD7B624F0E492FE3E96AD2E159F81883DE7849C65A - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 6350F7A015F2F77D5DB036D4B05A4B527CF49440BD74690F819ACAD3CE688D32 - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = C29749E13DEED56D97961B7D795BCFFA37361A2A10B9A60BED228A2A3F862198 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = F3D3C74AD833B356C8F2F6245E43A75F87177422DC45E960C82DE2B8121C0ED5 - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = 61C1789E3EC8424A3EF0FCBFAB3ACCBB2465480BAE5A5120E85F6BA91029752D - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = 33C9693EB51FE89151C8327CB9D80DEEB49CFD931B8CD302BDCEED3F243A7226 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = E44D1A9650B144D38FFDDB397F69F84EC62B2A4532914FF520B5DEB4559588F5 - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = 484DCE9DC54C871BBAF08971D0C8F2A8F8D6CB0360F38FAE6E446ECA1548D294 - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = 0E28689814AE026E8D97BB6E23B385AC67D3C491D11C24CDD7D069E2AD27E69C - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = AC77778EAB94796624D37AC90D0C944D47F1A47CAEFEAA7F69B6B56D1E38971F - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = DA0AFC31F6142E108C9FD5DDD205E141A42A58834C401E2C65A2843119E7413C - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = A07417BA981A4F6DFB790C546112AEA241E3C08E5708657550E8D78BE11B4E02 - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 08FC150E1EE99B27C231F87FF8FB672880FE78AE1C204690B8731F385DCDEA79 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 269C06FA52CEDFE798468852DF31229BF4003C13068B569C8B43A8D6C9106D90 - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 91F76B51DBD93259B00F2594F99EF80948C51E5F37DBD24ED73AEE46D6A9717D - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 3D1C80EC594395C0414B2B3A12A0F9656D9501F31790DEAE443C1D61DD90FCF3 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = DC13C339BBAB7BD1B66FF1860CCBED9CE5FF5A7E9079F999E31EEF0C0A82D6E1 - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 0E2D470512E22BCDB9FA8FE938341D706DAC872C839C4B7F670B65E13378B024 - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5B131CB1C681014F1B9D23D86BA35083AF2E3ABF59FD9C005205F4A4E655FA7D - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 9403BA0186A47E847B647E591B134ED2D4260ABDD3FC7040127B82B56395CB7C - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 17952EB8263DA842F6C57AC888B6C8A55705C4F016EA0FA515B65455667ED853 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = E6599026CD0867FE36D50899D373B22431B7FC204EEC570D3DE7097498835C21 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 9E7FEED2AF6FFD8DFD89DBC1FAFA367F4FF5BACC2D8BBFE069B2EE2C63298D4B - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B718B6FD95C03606BF5C28DE602881B36754A7B22C3E748C088282B1E9CDD871 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 278678BFAF8162303EAB20946F2F2DB040970A1C6567457261A1F9E588CE8407 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C8572A8BBC2E348D791D44BC2F3AF45CB67F39D7CBDB41D0B7CE8FC547426D97 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = CF7B5995D6FC285688F06174EAB4A4C380F878AFA7AF44D9B7163C2062AD3C5B - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 5520D409AFDAEFBA9669F8236E5C991F2027759220B0244698CFCBCC10614C41 - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 2D7ABD964725434B17D45C6E73ED881E1013E7801DFCCAB5C8682225A646BB6AF6 - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 832BBE8270E4B9465050DEDE854C2778BDCA68DFE93D899367947478D22D4021D3 - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = 4BCDCE16C94FFE4F7EBEC861D0AA7F1FC9157C6A5A76C85C15FC8B4B85E298D2EB - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = 5CAB40C9A8C8F55AF407227ECD42EA7E78AD2FFDEF6F30FACBB6F442F6C1E6877F - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 916452BE95AE3D50DF6922C3066F93D338F559C8C1B5FC42D4434142815DC2045B - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = E092AEBE20AA7A48A820C79CCAB7B06E2607066155A6045B040D45832E900A4863 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 9327D4730BDBD8453BA464B5600605F3EA7DE8991EB91094FEB885DF5EDEF62C6F - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 896E2A859982AAE5DF7313245C49BE48B6884BB20DC0373CC2DBB4023E63D8F24E - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 4EF5EB221747A52F20B54A960D5F59B2D10933B3EA808434FC75BEA94E18A0C3B1 - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 60891105C72C35467B41CF167168F11BBDA02E1852342DD7236A9632C4DF47EFA8 - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = 28ED6DECB3B8AF7CAD39518FBCACF669BAF4BC04C6C116BBAF41F6DAC3B645148F - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = BBADF17265148DAA63C10390C4489E4B57B6ECBBE25EAFDA14F32C96C10B06150C - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = A25FEEAEE7106E7C925F4582C89B28FE0CC0131B967B9C3E560CE254090A05D752 - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 3ADBED795D47F0E228BD81F34A07DA643A6BF7AF33148914C327D07D68642E598B - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = AB7FC416104A020A9CE982DE896504800F2AA2460B0FA8F60072A446604738C29A - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = 61BD69A96100FC4376A17302B7470751F2CD434F329CD64DB59529B009C033EFD0 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = 67D435958F96F3A675D8D78F30307BEF9CF1F3A072FEA6693304EF8AE38684622E - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = DF08CD236B6A3E38E0F286A8CDD20B8D21F39450FAFB2F166180CA69B942C281AB - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E424C134C10B4AAD52795F2D6BA1FFCDFA0ABF7648919B3B63D7D96609A854C38D - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B6B15719DED9B32D4D4B19322E1F63DA0003970BA223F14C35790B002A2D827196 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 148AB4EA86AD68E29CBBFEDE44EA75A1B8953EEB989055F90C5554BEBCF8C6DA8E - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 14E7D22DA73830BD970E02F9BB7EEDD7B2A991AC90158CBE84BDEFEC4C4B1F2560 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7418077C9C1D56F6AE1C1A8DAA3F530FCB941E116B37D9E9EBBB2F6C345DC782E1 - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 7CC91209140D376E5917060550041997B115FD36C3FC71177AF3C18AA716DDD3BA - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A938552DD112238CFE43C02FC0CBBEF2944331423AA72842558C99CCDB50A116D5 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 27A8239FD95CD7D8C855C686CD7B92CDF1940AEF943A89A6E36135115CC6014E58 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 657D3C8CBF42D0D1A109336A320864C0529CEDB80741ABB15DCAE5303B91F48E45 - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A216BAFF34C3B9A5D07F01B54444B14B8FD875E6072ED50BCE3FC5551D270680E6 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 793C29F936B28BB9AF487AB855DECAAFDDDDF8580EF2EEC8B32B734E4DF06A7AB3 - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = AE6C51ED55110D232BD4722CD2D9E804CF67ECA5BCF7FC4F21AF39F8C6FECD0EED - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B6838ACFF26FDF2A4BEC9E467B205675D79E182E4779032F243AF975024F1C49E7 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 0C2DB33555289F1D87CA273BB0164B2296E53489C8345E3F37F08624C8E4168CC0 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A8C0C787C96B7B496926F85D498D9D0F8C9D996AC721F590A9EAA239CEC9F91549 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = D229C13B9DF95ABAC82D1F9A533E6099D4B637E30581B3F186C72920B8FE6B54AF69 - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = 53F7616906075F44050C8A32F3E2C47887A5973615689DBA29F2EAC9B390011C87A1 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 2A52ED379A6CB1A2909F2956A65949A0555BF79EC0C5A300BF0B7F7A7DC8F0F092EE - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = 45925A20CF183B603FD248AE7115A10FBDE53E8449AF0D7C55E810FD790797607206 - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = C0F1F47B548D85D3155675D327698454CD132F136E539AB81B8C5919CA9DD32DDF7B - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = 0AC2751E003EA13285E7E39721A11D04DD31365E50DA7D19B71ABC6A9FECEF94AD81 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 7F83EA7802B594A0FDC0CFA5CAC1B9FF71E6E9EA244B693E3D9305A4048F6FAF919F - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = 3616E9F07B2943550CDD6F06D9DE3EAE002ABC4F0107EE78F1A6DF1936CF4E4A3CDA - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = FAF9A5293D8D27AB736579F528CB50A98B5010CF04A8ECF0979E9F5101F0039BDFE3 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 53A633B72850C110B1F8E39D75E009801F0276E87AE2E0A1300915EE34128C071610 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = D7D117C8B98737B761DCCE1FA5E0753C0114813A25E282D9814748741ADE29E49B41 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = F9F1193A95BD5A504AE2D394E073EC955B8D1D5A2FBEB2D8F005A546FB085D2EFE10 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = 47D5528E657265E5E2411C1738EFB552661C5A1EE08692DB23DE9A77AD1E93567543 - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = DB3BC8B991A356513FA2268DB046AE1C2BA99A991336829F3441D3AE3C0648051079 - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = E1537581BDB3B49ABF7962AF463E59B1CF73A25B8B9998643EC80D4037E0F9D5FEF9 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = 44A6215409C6E28722AAE616B492E58D3D94DA86BFBF8DB00200BEFCC634D5C14F96 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = 1AAF1FF2FF1EAE73BE30F86DB5101117CC47AAA8A7CDFB0E556503B734D932ED0C56 - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 47986237E8BE078EB773B9A69622C389F3973337CE640415C3E8D6D47D1A5FDAA9AC - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 6537912B6578246E14B49482BFF15DF3BD09192490DA49A8764EB939A71DE7CFDFEC - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5121B3FD41C30A1FACB7B380F712D6ED3D2471CEDB779E161F94768D21E4CF15219C - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = FC6B9AE10A6F2F710996A265D32FAA62C272BDA002EEFB07E1591D36D61F5509A218 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F80B25CA2FE25812CFC96BAB35F546112C7BB8A046B89F9C1B3BD82141103E411FB4 - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = AFA47087561D4F0DA14877709A3ED1EEE7FD1E6A6E729F8E5D4FF3FF19835539D684 - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 8597F3473E45ADBF3BF03D44963A3D8B28D20335B10667A108D25C67CC76CA7D0D53 - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = EB2960E1BA58D000933556D366907FE09AB71C7BCBCDA0CD9F70B0448FA3813D4109 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 24101C65CD5D127BAE5FFD51F417A3D22875C50186173609CB970F16487BD170C917 - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = E32C8A412E524F0000B000B8CA758D59E29E7B8C9212AB872B8C7449599E2D07752F - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A9CA861665FE53EBA5339A7FFD82DCAFCFC3C22A3AA58FDC12B657595B066AD48F1C - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E320A9CC0E0BAD490541A7C5E29B53CC53DED0D8A9FD13A4E339CF6B4F8C27496D03 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 93CDAE603B6103EB7099981B4B59A204555296757F977EE3A9242F7327B6D9D4818C - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 8871F24A21F247170402592759DF6D0A0B2DBC4970A96BEDDCC213787ABA56611B7A - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9FB0979FEA4B48D858F6B0658972FC7E01FA3C8859F431053788474FEABD039F8665 - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CD335FAD6D04D0AA19743766B57E13C9E0C69BDA5503A4158789881B94E3E5C1B5CD - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 8E89E5E0875B45F1157D6DE789B318112F808E7210A3C51458813819F984FD1C070F92 - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = F6AC0C8C2C5A02AC13750A26A75EB56A1418AE578CE753162A26CBE262F888AEBA99D3 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = CB166F9523025EAAD382E1E5D394E594E47999DFB2F303D31DFC8BA45164C00CFF77AE - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 43E3A799F5F37873BA1ACB1A0BD4986D7373D4B1F2E22B11AD6A8577C41BEBC0F0262C - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = 4CF9F4B84A779B532BF74EDE392BEE793255A96BBB16355720A2E41D9B9B4BE3DC5D54 - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = 6848BE9EDF974DD776D5D414D79C257691BB24CA7AA6D3181F6FEC8D6C7891FF9A1B79 - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 14CFFD7E81FD2C17DDF3505BF3FEFB887B10C083A0DDB6758AE5636C64CDCB80BF418F - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = A4AF75E9F307E59158814B3B2FE97B499C8551A2BFFA121774A0089350BE442793EB62 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = 0DF109756AADBF041F39AC606DAAD3BC2697FA67BEAB08A9CB346A176873C11731B056 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 42623B56A46FE3785F09A6ECCE01C0E1BA3357345284C00F3A3B9FB22A13AC1A721B73 - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = 5F83714569B2323E8D24EBF2229B4A06D2B134881A262AF8E6B61E5D5981A8F470C077 - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = 090204C33AD74613A00170E020878618D55EA74632FDC07CB0CEDE17BC6DC63785982B - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = 6711986EA541DE632DA03E5939A05C4B73D33D666EB6732D581FEE7296FA1CE78728A7 - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 83A1EE609FA78C03225D904376877DBE4225C02F66164423321F7A787D520370CD685E - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = 505E4AA11F400BF894CB8CC34F1FDC6BCFFCF4707CF78E1126832901750B594856B66F - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = BB8271466ACF3CCC08AA9B1978DB748B1CEADE939A6B496728952C7C7C2B143E53FD7A - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 8156F7DA9D9D2E6871DB5E3BE4BAE5424D4A37557B4471A0086AFF607BD7005E05F50D - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 33650D5D0D17544829946ED573B25F32C8209A58F1292ED2ABF80B0B36351E71BD1805 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 17DC1DDCEEA288023A7A375D13A31C72F385C27BADDB2F41E8A0F269C76FD962B7CEEF - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3F0D3FD4F3BC51B136C408148905263B47727685EFF38E0910A189C019D344C408BB3D - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 96D25C5469C0968FE7FB2C839CC99644651645AA26F8DFF9E12CE47757F8FD0EE650BD - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EAFEAA5C4010CD8E56F87E2B3A422346E3D5FA696251419062BDCC54DA27814B0A08A4 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 4A6C525EA808FB45DE2D29497CC573AC7469078AE89DF4CB69E0DFCC9FC2845FC040F8 - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 22A741D5A63A1D560A507AEAAAA68F660D20C2B73ECE458B72228450C0706D2AF659C6 - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 15CFB2A91C38578213630F0DE13301FB432272DEDEA13209E85020594A4B46399E2716 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 5EF555A691F3CC8EAC54222D1BD04CAB0AD9166687FCED6F4FC01EF1A0DC402F5419C9 - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5E2145382632A0CC7449991104F26C40A58DB9A18AAD07A525F2B8342281A93FBF6CF3 - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D1B9B4C3D02F70F3EE6BF6CBD7B1B228A69EAB02D3AC1B82A2E3511702051613FFE43F - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1E7B197DB79771B0F8BF44A07948F8B3870670E3E7FCBC9FD96AE07F56E6797848B374 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 40CC440051F3A7E009BF8D776DC55EA621FF3B2A3679D356AC1F2553AC9676E46AA2AA - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 7BB6678A8174119D48A98FCEF61B28712EC1FB2F7DE285E336C1234B0E6CCCF2C70E08 - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = D99A6A470F48D363D96B7290890ECA5436F3DB083CFF2ADC38AE4F57274D8C07B04A2B - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D1A7B8690F60A536BE11BE6D1C2B38F275065D872BDB4CFAE1D9996098755A8ABD4F21 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 294B3BF22EC0B370E06B5C18CC349AC02C7639C06E146A9019523A831682FD88FA557107 - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 02632E1F27A994F6580732645FEE4F9549046530BA9D236123800253B9EA0554BBB6A2F2 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = 53C7BF09AB81C7F6C8543B15DAED161A6D0C7C100D8B3CACF26BFC5C5E00F50C59C5CEF0 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = F8EF8C5A5898471B4CE9ED3D95F49058C6BC0D8EF2D286341D6E609EA40B3D99353A1FAA - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = 8CDBC9DB86E93594E7C15A3083E76DF4A0356D82C668BEE82D23AAED5FD6DA6E48490FE4 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = 1F96657441B1F362B73623FCD7E59927DDC0168D001E88145ACD2E561270BD3B82EBC2A1 - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 6DD2B912683878A4FE1DA61BEA280B76D3867F2FE77B3F2C7550CD44D912878ACB594245 - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = 0C8305FDA9A5A53712E2E0F409AF4EE4F499E843C0F9B97898F6B57638ADCB0D1D10306D - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = 6FC390998D5B3B0417D7763D257AAA40D6AED5B64390A30CAD3F76DF1BC2AB65218743F8 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = CACD1B9AA85B7097A9A384ECE7380C051702D1D54A989EA767B8F426E33DCB67BAD5C307 - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = 6C0152D047F9F8E6CF63B392E5ACF46995783E7C9B6F7C1274888F4CD9AF655F3BB084D9 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = 166CA297A6562500D494CD26D143CCEDEFBCC6DDDD9CA6EF2CD5A50CF09B548EB5A57804 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = C451D65DB0397F1504329DA7A3A2607817F674AAA3387F2E543BD76C006BAE005F4B531E - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = D85053335407FB724FD699E7080B4E6FE7CE394D148A33B228D6892D482E61545DCE2A3C - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 12135804215560F9A0E7332D4CDE7F61E3B84E8C475911AEF33F58E4F42A631E660F6B0A - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = 7621E0A0DFF9455D6ADA49BC9E9228862AD7D2D621FCB9A3562C53EFC052C8ACDB35AEE6 - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 689CD6A2344E943CAFE021B4B7BB686395C446BE2D84D1940F8FD4532CCB653DADF15AC2 - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C105C2F4CC944D607ADF4C738F16A829FF9564A7C559A36432EE57EE82EE50B16156A371 - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 14B34BBE6C61232ECFB82E544AFBAB784CE6E1734911B0B718B441C686AF6A0F18CF08A1 - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 47691D448726329D7D71B7FD074536CCDFAF1BFC55F8BD2B9EC1798B6F856C8ED361C5EA - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 612A28DD83E135F2453248122AC2A71933102AA68DDB3A616CBDABACC8B6452EBE1C1DC0 - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 035C6DF4DA36D98881AA87578852AEBC31EC26DA4FF8309D5B4293AF52A07E7A230E0DA1 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = CD6D00D64C83D8BE0BF4165D0B231DDF066FA56CAE9FFFC40F3E733ACDF00D99C4AB9672 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 60F68274076ABD71984EBDEA4D6CAA1E68ED9F821EBDE82DC9062DFB4BE493611224DD00 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 843D471CF268C6ED954F3117B069A235F90CAC963EC1C27485F58316079AAFA2151F7C29 - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 53840743D3D60F99BBB32DBC8A41CE24BAF8A81D9B4435FCFCE0BDDE31CD31AE856919C2 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D5AD636C6E63943DE449FA19378BFC470CF7BF7C89C260CD8FACBA07DD251515C2707745 - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 6654B9DE3757B0D5CA5938D1B7C74E2ED8253FA6E3778B463D9D951B2286CA9DBE89CDE9 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = EEA40D0C747762E880287F0D204A611CD3523CE1A9BB2C9E5D8D8174EA9AA5C435FE6B53 - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 63B8227F5802985CFFCB15DA9BA0A9CD92C4F139303EC166614F061D1F79A0A326961C51 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 380299ECEE6052803D95F468D6E765968CF6C507E49F076938F6C672D42E68E21192C2DF - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E64CEEABA556CAB6466AFD1BC0C803B8BD2EAFCDA074FFDD18660E7C0BB8FC1A100C886C - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 7FFBABBF68090363B6BB8B664EFD1FBA3F1D6916D0752A706C5A94F1A04E0630F9D607C2 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = A4BBDD88D0C23BC4E6E8C762D6F7CF8C7964A65E7809A8B727000F307E21A87A752E820FD5 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = D27F4B2FE3284B94AB1596E9EDA5C67788205BCDBADEAEC0FCC1C2CDEFA9D2EB61176075A4 - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = D85E992B6B8563E99ED94356790D158DEB71F5D42FDB6B926BA7030EDD0D1A66C127D92C22 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = E73B4BBE66EF21654A076FBB821FE1CAAC668DA707E9F0AF6670665DA63A4553D7D5273BC6 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = B68A2F0480DC0D1E91C3A7EC3F8112F0F4DC509F4C095C4C66552195D616475D62A6E8A3BD - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = C6A1D0E21AC06EDAEE9F31C45410E1F3419C13CB4E1600571D80F853827F296EEBE48E6BEF - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = A4E649A53FD14C1799FB9E02268CB375A3A72123FFE4B916DBA3C90A1CC2C80A62DE495CEB - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 67B9ED0B1DBA24CC3D16EECC00456F8272FA873DAB292EA71D215EBCD98343379ADCC4A136 - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 93E34BA6C911CDE1F55D5B7BC255626FFAAE86F82571DA199295511CAF2C386934D257E5E6 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 2DBCC19EB827C7D3F3843417DEEF52406B3945FF952CAB473EE72121EC4E00BFC4308F6236 - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 1BE3B13E65D6574212072D61170E9ACC2F06B72456F1F4F40E2426B9962F0468B826DA9FF9 - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = 6AE911B2268C91EE071070C3499C97A3890644E7473E95933C0CF711E482E964C0E07AFAE8 - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = E7EE5CB90603F11E0B2153B0AF574B04DC8A24E91C4E3885E588DE6B3132F11F3FF780034E - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = C1E5E6A1AE1BB12B31D0369E6C163F2DFF9CE87A67017974AA0506A7CFAF01524DB7CA2C08 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = EC48BADBF3BF613FD8F088991788931C914F0BCEB53AA521EBEEDF915BB0F1FC7E0CEB0E05 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = 08D425BDA3E346F1BE4D4DAF7F2070FC4A197A89AEC7FDDE92F02F4BDD7DEE7964E1DBF136 - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = 7D4D5159E42E9182209B6FD04499A11B2C9146142D8F9F99C3752B6E6A8C19B8EC3865F5D8 - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C746E6D535C7A11851AFDCC1246090718F05DEEE4D74087987AF6F8A92939A8F17ABDFE44B - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 4C79D4272C471906C79A4B957304E8F85FF9C2419CD7C3A60F2E83FF9DD9C37092D624868F - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 08F5B6695B9100B8E50DDBDC97DF802640A5D594C776A788CAF5F1CB4ECFA36B11640B5C95 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 7A98A407674C4C17F06DF6D230997E739940C191F0452B11AE4EF3EB23A8BE00CE5F1781F1 - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1B61B36BBACAE3C8B8B6B4F26C84E888912087FC92DF36976CD88FB15669C31CBFE0FC463B - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C41E694844ECAB982C08739507C3DEF5ABFF6C093895967CF52742ED953A591CCB6A5E661C - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C71D7235EEFA57DB3BCD9D385A725C5202A89F3524C0B6A1FDAE1301461E9390AC69240926 - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = B4460676B17F0ED359A6E9AC110E572A421BA13E2B493F993C8B37499FA459E011676EBB07 - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 05F5B870F626513E677014EB13000044FD908841254747C9729E6BD937D3F0707E8239D2CF - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A86CC4ED7F247715CD473F40F9B1A10CA7F5814CB98E9F4C748F9DF5516D177A038EE01C99 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4DA05CD99F31EE478210D5B2AD494922F6135AFD3F6CA695891E2C3CCE6961BC1C1891E418 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BC9C2DB0376DA8E34DDD3E4DB67E197C0E2E0807159F70AB292070452090B1D168382526A7 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 12C08E49AC7E48494985B6D4B1D2124FA8A39873873AA023C68D95854A48500987D986BB68 - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E6ED7EE2C6D5BAD8A423F30DF7D48B279828A0B0C0E6A2CE65481C0EE8D85F142D42E91300 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F350092FD3E2AEDC16943EF2528122CF0AF7CE3A13BB05EDA2FB94A72CA7F8FD985E1092B2 - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 88AFF0499EEAD33D3A0B059934C4F8A8CD8B91BA6361A0739A761902A0D93AE6BCFC97D39D - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 409A4C8115E7B93DFCD42247D0352CBE6521106DAD1D7404D1ADF6AA4B9331C50D0B1C280427 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = AB65CA09E1C511ABCF968FA5F28A89428B7FF1B1464B4A4D75380AD22AECBDB275BA6CCDB64F - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = 6A32F3237993E0ADF465489AC1527644CD70B7F3AAB7D0244DC1E42EB9CFF2E0FF603A4ABF2E - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = BFE2BDE7350609680EDFB75086F44733E12A9738234F59525FB6D00C4807675E016A1C9DB262 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = 84EF3E87E4B965B748F6DF13D7A916E050584E76A769107156936297B8FB2A6BCC40BF85E676 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = AFB0C3FE71D33BE0C2EE825142BE5737933333AACC90915C8BEDFA27B734EC857BADEE42C55F - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 25FC062BF25EFA80E11843D503A4A36F0C9C6D6007DCC57F769A6C3E4047DFF44CEBBE2A3C12 - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 1DFD2AC733C6BE9E75BCE8680A74189BA4D0F413704C3D98907854D2D84405C9A757684A3509 - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 7C5EE6871DF45AA11DA3970AE47CA2E689217927981454E39E2392D9D62DF38EADD9E82DF7B0 - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = AFF031053B26840F29C0293154938A9F2C2035FA3CD43C0C050A88D3C86BEB4F3FB78D34D726 - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = E71533FEA79120F3E3FFB6C1D61EC340A8D0004609A289308F09249C16987333E80BCF940195 - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = 17ED195D34018020EE5A84FE6CFECCE938A68295CB372E0B4A5F9E7B23C70EFFE2DA1F8F3C8F - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = 3A945941076EDA3F5A9F62B360A4E542238029484E4AE0D46FAEB7F14538640500F08C38995D - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = DF42F0533967A43B0347D2CA20C38C49ECDC7837682765681E0F7EC6F82CFF134688D30230C9 - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = E63BC357FB1A16BD20681FDCCB58B610EF2BFA806D5E6378BC7A356BB707B7828BC0A8C3A115 - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = 4AEC9664948F41411AEA2B9749210EED6720EAF3EE3FBF3743D8C8E3E3267F80410E3BD6CF5F - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = EC235E1FD9BC08580396AD273533A0548655ED03DE5E63944803B06CCF9211A51F8753AF8070 - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4C01D80A5C7772C2686D0457FD60B27511B9E6DF25331E0E6880793EBB4F125FBE26C3D25D99 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = F4C623C560C447F356DCD406ADB17EADE3000CC5941E8307BE090C1381F8D3EC63245C4347B7 - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2A3099F6818F3B1C49709E9817CE2357072BF0AD4D038E660F5DF6CB88D6C1AE7F635711AE7E - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E378F54B4B2CDB0B4642E1A406A1AFE35804405DCF6E02BD4E8460B379F65D183E7C48A63E70 - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EB5A5422DC2FC68BE251E284D6A8BF57CCF9487D637E8F96C581E1E404C2330F7C5DE28717C9 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C9A227128825FFFC3AC1CE7B04FC4A8F251725E66584F2A9A623FAE6937C8CF645CD38EAEBDB - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C507653A2094DAE8DF7309E8519B0B28D652030B7F82DBF80D0AA8597B0827472A9B19C3A0DE - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 26EA7DABC5D98F7A63918A206192B0C9049078A048B86040F9F5B7564F8EBC646014593B8038 - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8ECB1D7C8C19CB05F782CA26D26FC4AC4BA660F8C5A212E0E7C55B73747F6C62E42712415AA4 - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 36BFBD08A879AB92498502513DDAFA3781B78ADF22F382F1E45BE68EC747EF5DC6BC042D1A13 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 28E958887F3CC74CDAE34F5727F825A37E735B73C64CC80C7E9DAF14786CFBD4D6A7A27CF24C - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9DD2C56D8BFD4F6B0F3DDEE9F82FEC1B90F4136F1D33CFAB06AAAFD341041D50CE74EBDA34A7 - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 91C81EB3F8CD65097CB5A767FD0FA872EDA54DCF153C3C1B9419AE0BE4B443358BB33360157E - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2F4888953422873A73C8E94C13528588BE908229584641CCC9E8522D4FABA0D446C7D2774FAA - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4FC3CAEDC23659E09D2AD346BC8EA0FBF11183D0EBA2D2F51B6A6BE6DD84A3146D7A91499805 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 497F70A84D3CC0A686B759C80579516A52F07A019F3CEB897D8F8FB21F87F51D68C107E5F9F1 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = E881330204A6D3D1CDE7548F0396AB40C55A16BB61A006489788D83C5024BB28DC15A8F537E6C5 - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = B96AFCA04198E0E59EDA2D01969653CB3BDB30B43A212F28DD06BD13D90338718C967D6417AD5A - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = EBBB22C1D2B23381E3EB24DDCC85E295E59E5CF81A36127B040AE5AE711DCAA3A3131A1BC10C7E - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = 721A55ED6F37073F937F0B48370572BC1F6C5EC5C3E073205D31C1D0A09AEE7C18059B0C924419 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 35F78BE9E30462E9B4756F7E4B54A602A0A104665C86880D9243BD556116AF91766D1826DF2EB6 - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = 6FC870CBB6B35FD9BFFA703A6B94A6694E80C8982DF96EA6D3EB723C30E5FAF218478339E1A566 - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 7DC7AF292CCA4858ABCDBABE9972BAC257F87CC98329AA1B84C6039F93D067520A244BF16E3DF8 - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = E3D3E2B21B531AF637087DA044E9CD753AF910838D563192A020D52921A227493219EF60EA5FDB - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = E3E3182A4F35860881C9D961692AC75B84BE7B52DE69F39D82DE6BABAAB1E4F2C2C23B0C7A9B53 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 4B3B4D4EB1938D722DFF5CB663F49495A6425E03596D420F606B7D28C6EB5E18F8BBA8D69E0303 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = 655E16C6C2FFF2CB4E30D2237A8499055591D5E39FAC97765E71A1483007C20965916A79E65867 - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = 13AE8CEA6B96F7BD83715FAC2B592301E24D86D5721CE98DC262A5026113177EBEFBBCED81B7CE - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = 5350F2C540189DB103A32A008CAAB925E149AF0EED396B1D641CA9A552C0F26AEF34DB16C0B2AF - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = 786B090F326505FCF9794AC8583B5ABAAFB2C6A46F5D3DFF652D3E5F0CBB033EEC9DAEC9483988 - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 5741A22FA41EAB242F4C7B905C190C07C0CD0C0364CFE1B3A7C9B5A574AB6901DCA0106F8A0492 - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = FF9C1BF4B5CD56512549880A188EA23CD342E7325CF62476AC3D59FF6491780F7A1970874E7362 - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = BFD1A2CB0DCE6C97EC89E5EC7E3FBF39520F1D1B15FA3E401CC2EDE0964FFC594F5489228ECC68 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 12BAF4A4C78266FA41B64645C4D9C3B681937D4134397FD6196B9210578FA31E7C96237EF9401A - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = DEB6B417CC4C0BDE79F13156B71510EA02ABF84DF9BB84D627C1311011487E942129DB0DC8CE7C - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 8BB55582C0387A5E0CC49F8669507D5493C61B0508CCA187D2E5B9A4F5A1E163BC4FF4588A3938 - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 8CB3058DB1823A1500DAA698F83685293149F34DAA2D7891B2B5B48263A6AF58E500443B8E9572 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = C1283BEE712122A5C4B7A2875DC22592F1B24D2CC05EE5B6A1CA9AEC81EC20034DE8152753A004 - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = D9C75ABE9F6FE93B10C4E29D336714F5D2EF95A7B9A854B9DD539EC1E48B1AC73A10F1821A2BE1 - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = FAA9388DCBADF1204FC7AEE3B916FEFAB041647E4AB2FBE5D42ADF87350D43DEE5D390627CDB97 - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 7F85C4374B71CA490E993BAAC8FA7BF94C51700B83C1576918046B02C3EDDA4CC93970D39B1C8C - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 6704E8763AB04FED9AEB427F631E84DD7B02C7A41E57861E96FD28DA897F09FEEC74FACF46109B - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 04BA380B19FE7500988BFB936C833C38A99B35DAF34ED33A0A6995758F589AE118336582C7BD03 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F069F0CEC21674D58EDB5C31ADB4F11A2B3B6EB90965675D74D1C11C4A204B3573E1A833DEE1FB - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 42C64E8D118F889E859CE27A249C27631007BEFDDBA516F6BB8E8932748EF6387E4CBF07FA70EB - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1699DDB0A05C8B934956D47153A634AADF950B6F5AC997E112D6D35336337EAEADEAF5D6336EB0 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 383BCFB140CCCA8A3F1422F54EE0AFB965F7B8A87ED135535F44DD4A167FDD0D0AA002750F6984 - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E721532A64DDB5FA3CF3FA2CCEFA53D4E7D69A77919247CA458565ED8453E2308F7EE87120F674 - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 42AC63DDB9C7D6B03B56DFABE3CBE856C5C4069CEF979DA92A283DD71DBD62A6B5A308D5D7D306 - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = ACC8C60F8BAB4086A566DBDF2BB73AD5DAD76C9EE6A784B2B80B9734371B2C32853CD7C7B1619F7F - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = FC300233E51945B65125D80C29FCCFC24A9F53A6EDC416747F30BDA22FB7C22ECA41606499BA779A - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = 8096E0B20D8B8C15B28C2A5AB331A25F6A60052BA483BAE416E83626B1F43B0BAFF9BFA344B576DC - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = 6558E3D6A900A69E50DC7952DC017A6CE7C4203C75796149A5DD0E9E46EA0918D58487ADB776681B - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = 9B867E8C12AC713E7D2CE2042AAC825E354AAF8198C8BAD3F28FC671E625F75E240B5960B10E16B6 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = 0BAEA1921F2396F09173D885AC44D448921542DE3A3128E8F3529E9BAEED997EE37A0C5649F27C7B - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = D9B9CB05BC6275BF1C91859870A86232C2C4259F8334B59EED781D5DE4A85ECA9ADD3193E5F65F8B - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = D61F4D060A1CB12C0F6B106871FFEEBCEB35F228BC02DC73DCFDAC67EBEB6A7CFB972EF3DA26F461 - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = F5240470D6B56D655756AA529E3108CEF3B9794120B1261EADEC441B2842C1A5CD612870CBF03E81 - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = FC129D487A1A60ECF6E62011E7229B1314148C8818639C5E6A3ADF521AB730F9CD6BE1A586002A0A - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = B9B7D00B18116009E4A2D441BED8356AD3F3F16270AE9621D1C96F34B591228905183C5DDDC79797 - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = B747DDEC11A1A24F2823DE246D6C246F91E7B8CBF741B72FA8230422A4F9B730AEFE17F7E8F4DEA2 - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = 15A62910B25D604863EB479821E250077110C880141C00C779D78C3583F7EDFB707ED2A5FE58B08A - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 31E9C92934FA130D6BB23691BFAEAACEC03A20442588D75F74BB5DE88D7E93562F1CDFB50D3E7233 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 8EE8C217E34F64EFE43C84773688A6E1062D99BAADABC75CFB6A058501FC5CEB45F825503C412A31 - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = 432BCF950BCF4CFDE929D8CD81294D7EF354D7855FC80EA42A618BC66236B78ABA1ACB42D203C04F - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 602FB744001AD56FED26FA6C25A1F1C93A381C243C6BA631BB17B7D20A90802108BA5488CD98DF9C - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = DB45A32E21432111EB6708B273A2EB00BE83FB2029FBDF62415C245FE5D2907166FC0B8D3712F172 - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = F80FE4D5584D63C1A9B211464A3523D5B17BE5D9D1DD026DEBB4A8B8EFB7941E8D6DCB33D1B1B9A1 - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = BB43AED6A79CE22A32E90659EAE3833817BD31E6FB6EDC08689DE976BBFE75CD385FE65344888DF8 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 003E1F175948205473E2B1D50CB1D2B5DF94090869F6417FBCEB8C9B15758274941B3ABA478CCDF3 - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3DC0EF892E08746855D36BF5214C473282DEFFA7C12379D39A43AA7E663275DA6D4B42B83C5E470F - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = F2B97A27E349771D057A8FA7954803991E7C2AC6405FEC313DAAA0E8D634ED074BA2A4A68A94DA39 - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 4A4D87753B66940F9731A40827C83C9CDF237ED87E910919710D145B6E54C54D1E7BC9472AEA4040 - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 834479010E192F6A04B7A521E5B8EC1408D2B23C018DD7844A3EDC205272478708C9D7F5F02ED610 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B8CEF54480695F000569774C4AAEF9E1C7DB84694CFC4CDD6134EE6C0A2A9E0D2EA778B6FBFE1EE8 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 41BF81EA5AA73E5E573D3A7F0A6AA4FA5484FDC8313685B9BC32B69F3CBDB0AD8FE669BBAF9E73F3 - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 9BE2E62132E83B941038ABB2A61F88B16986C91D2A976DAF53EC9DB68AF5E77E6C435446D92F5117 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = D5EE41DE1394A3DD9174B4C506D026C4E381612D86132C2354B98BE39C50A4731E64D5C17012D21E - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 96D6CB9D2978C28E0090DCA2D14BC6907DDA9552B120B6E7C03C5D1A1D4FA0B54BB17F57E69DBA3A - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = BF92B0CC22F2A7F807724C61868F6DD95CBCFD8D29A70C7116A649449ECBFC331C26BA9A59DCCF60 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 38D84DD45153BB2DBE4AEADAEA73D37A5304E236D61EA870FCEA9C019A24415EF77150EB571DFFC9 - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 000E0A5099A27A36E252B00640C54004E8BF58271E5D4A4185418CA9981C01AFA10D2477B1741D5B - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = BB0841DAB4566A362340E4B60FEE6917B6024974AA037AD276CAE551C6A1CD37814CBBAC352E1C5079 - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = A929DC6BA33C4A4E850ACBF807779E05B0CCCE4A596BFA7E36FBF6D05AA43AA2AF26DC923E2DC7F55F - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = 5B83C91B8AD01D3310253D522F0C70315A7FC9C82D3AB48CD3D937171702AC150F0352947BA52173AE - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = 7EF1F0FA3755F89003FF851A2BE2843879870EDEE9465E87B40862B12AA44E48BB35C28E99ACD2B2B7 - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = 4CF7FC346C3FAEB6E0B2523E23BDF384D39C6309D2D72A962B8C37B296B19B5029F7979A3007C0BA4D - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = 615556FA9542CCE2274ADA29A6BC0DC09D46069CA48F5942B1E3F505902B1EFA2EB2C7645F72969FE8 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = D4BD8A9D56FB5925EBAC0169C3FF58303B4ED7DB03F7080B0C023A03CBBA92CE6D48A216176BE7B85D - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = 56B4BC3E88B441364C7F3BD6E54A1F22656E96D878BAB960F64DC9441617DDA7B9DA2B9420E4B0A5B0 - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = B2486A6064246CBB16DF3F20D69AF92D7CB3BE0939B532C9308480A145D9FF4578B029F44B32D5B703 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = 62BBDA506069D47F462B69B083EE25FB1ED99B977769F86D95B6BB46D22EAA322D0A2EEDDAFAE0C584 - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = EB37C9AB5CD45FCB3B922EE79E99459368CFCCF434D242CD5E1ADCD32CFC25485EFA6D208D3FB8679D - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = 173C9C8AA6C33C69F3AA47E988461987EECA5E2AD95045652AA086035ABC318281E5AFC3E1D1043D5E - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = AF56EB617817ED4C8DA071620892975E3112724BA9B528957F459C58004CEA821708A0673BE5FB5E06 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 955A941DA91B7E16D7155640F4018D4A7316D100E03919FC3B22075BF952961257532377F3CBBF9FE0 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = BD9BB59C97D3B1752DEE24A2F8F1A45A87A1CAF00525163CC147A837EE62B016D4839BE3C6C77FE52D - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = 795D4C29082C9E2552991977FA4152DAEDEC1B98FF1E4486A6E0B45C16431F79D62F24F7FFBBC878FF - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = 69E2BEAA0822F5046B8409DB346C897A558740471F8B89321F9C9D32140163338D5669D164CC6AA23F - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5D73119ED51D7DD26C841F1A0C1874AF7CCD9FE8E0267BC54E225CD1F0D15527A7759C9EFB92A5C544 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7B3D2CE92FC13E083D02AB9EDEB3806883790927B45C2CE429AEE1F7E1994CBC935A9730479DDD4DCA - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E7C61DAE15F214DF74555DFF8E867BF83C9D5DA89A88F53577F737E4B31161ECC8C9006A468B08A630 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 777B518C3FDB63F752BA966A7A26BB3A3BA3833EB4686C8BD13137A786AEB50E35637F615DF3A46B8D - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 63EC1119B56C6FE37B961096E2EF3C83A13CE9F0AA253AD76AB30F1E74AF304A69BF220BCD82A7DE57 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7A1F0F7099AF4C466DB2B1DB2098ACC36A7FCE0CDD1BF2F2F5CD7EEFB82C16A67D390302176A0F6BFF - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B79D565A399F232FA91C04E2490EF065C26D4B4CE820697461B54F1449E9C9D23CD0606C15143E154B - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 370A1EDBF61CDDD5A70125F260C21F9A27E952C3538F2F452BB4D0608193BFFC5D6A6F4E2172E72557 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 60C23F6CA04ADF120AC95E11CB6F55A5B345901EB709CDA3D3CB7BC83C9AC116F9C1F9C9A9B37C48DC - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 189CAEF940469164744CD7A011061CC00DBC4BC26EFB8B44AA04DF68BFC176B2F62938F8CC6FF2C46C - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 0CF11675B01690ED3A63F2CBB1B3776E48F26C5875B5CF81371DCC9405A29EF7813361493E6722ECB5 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = DE200E56983D7BDE927850817EB74134A1CEDD8AE02C520A5FE38049C58DE1B8CBDC71B473BEB87E21 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4BDD32D5E97D27D6EB170244150ADE5076F8E608F591E21ED2D61C8016603E9F92E5A01CA09E6B0318 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 4408B280C872E090D77E71CF607EB634EF2526792B0C065622080C2BC799CE4A29F80E8C2746862AA0 - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1498FD5FD07BC0156252DF7B57AAE3819B2DC070D8656E0CD481F6E9E93BA337BDF5F5091332C9FD39 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = DF8B67C8C49E55602F48A5F616FD14F64F9B526483F68F907F4152F84AC6766955A779EFD3EE493CA6 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = C759CAF134FA9359269E8D1E2B053210292F23A41F14970703C77D9490D31600F939C6E61A9A55E973A9 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 949E816E729B1A78D8E707597AB5F5E1F85ED44F397E7C14844AC0B1996CC7A5A82601064B685F00E1F5 - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = 0E4C270820DA0EDF834E8ACDF392A697B3DF56206B47EB4747154B12008BF2F724EFB772F45DAE4EBD06 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = 092A5FF2C42A6B35233FD3B32DC19A26AE9242FD3DB34775296C11FF0B8ADDC934F0A81D75E1E7D7FBEA - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = 93A4F14BCF98743544CA548C9EA92AB14CB3A5708962AA95C2150E1E831CBE767852387D8D6032264AD1 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = 2668AFAD212DD030BABCC2D53CC434CF246432955B21E53D05DB5A14C58A9AA319C9226BBE4B981EB716 - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 7D4BA08C742766A4130ABFB63C851543FB29794091B3D5787E7D0129C3FD9B9C956045FEEED5D69A0151 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = ACF311541C5522706BA3FEDC96FB157CD6DF7F219DFD9E917DB6BC951D8D2C106AD0358112871AB41866 - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = 5488B5CE7BEE741D7BDF14E49237BF397A37D82692D5CA1761B453B7268FA00E180C81E0B2912B3F83FF - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = 9B506246E6BB0796B6A52787056B312756F70E202BC329461C3F18AD58326249CCB00848A8E965A00AEA - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = 50C7078B28191A7FCA8CC9FE269CB7E3D4D6BED9EEC40B7D0E89D28D38BE1D30518AD6A247B8840A45A7 - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = 68323436A11F78A0C2453F696881E2DCB7A67559F9CFD0BED4CF06FCF21CB73C9846DF4792AB8FFD22BE - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = A9D617F3DE777CAAE476CA0AFA6205B042E36D44E6F878C07366498234DC121FCC99A62BA074DEA4FFA8 - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 605CB6057ED8EF530012908223BA46FA7068C7D0F0AF885871697D03B8EEF94AAA91994CECEAF1BC88A6 - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 5BBE0124D1B32A796C11FCA1042E68BDC7061A38A8100FDC11176126109872991843C23B52EB60C3312A - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = 37D5EEFA0B0DC84F8709581BA68C3D57219B84EB8EDB5688EAFEDE0F699B2D3DA2848FE2A1B8B74EF4C1 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 8B67207DA32F6F095DAEE4E7B6AF3FBCB7AD5BF1F2C6A5460868E5826599B67D1038A61E992B64078295 - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 520DE0A3BABB922FE9A6903D68DBCA1D603196603441E28FA0E6E41C9BD3C4977EAD6FC2444030250F75 - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2BE55D58808DC66B65BA4AD27EB0D6745DD14647C983EC665355E71EAA8F4273AF03A86EC6376C01CEE2 - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = C5DC0EDA7DD57EA7E5A27231829AF12D1279EA1EEC0E94CD196B26157A1E585E00248DA5702286550750 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 9FAE6A31971A84F8274A2D41897156FD83860C9F07630CFAB0471DF7BC0753588670FCB48BD575257ED4 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5A2FFFB60D2E335279D17AA0861A13D900F8BA901964563032248A1BAD70301A6B4D7B64E25B472FA3C2 - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = B4AF49E0937A41EE435CBFFE300D8861CB614D303DD027E82EBC2C571170D10F8356CF9812179E93E5FB - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 1DF9DD5B04438881EA8334A956ED8BCBCABB4036012DCD6D57D36B035BBA0B32380E22B6A1107E8562AF - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5C8BE3438710350701F811255AF0720C94DA9CEDA4D34996A20BF808291523BEE53C76D2E3C1C01FC4C9 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BA9DE8E758A038C8A75B0E4CC58E8443F73413D41F428015B0E9E02BB1F1C820A5A90D05020A756247B7 - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 48536384ADEB76A347060504C47C1CB50E321EDE1E51C5AF666ED075BAA79859CB6C8EDB700830F65F21 - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 48B09628D7DD79C5FF1837FA57264CE030B082B7A3B863147D0995A2B463DC653FEA1B01F4592B8DEC94 - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5DBB24877384C1B41501F06A20185C8ED9AD1A83B75384F22A02BBA07273468A69A2DA0197FF5A9F33F1 - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C7BB648DD60715F3C05B22EFD8AFE2211334925F11491C2A7EF78C991277B3747B7A2457336355DF3EED - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 8F2E210E58BE0FD432AB4A2D978111E920338A02D8F228C10D44382047642537E428F268D5B9C27691DD - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 32E7CF80B6B1265FD205F610F134D8B4D651843AD01BEDA80C27493A5103CF0ED7BC8852FCCCCCB7ADCF - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D00A30B791103C7945B5DC151FCD80F93A0F98BC72142FCD051E66A7DA1B083459E84E0729F3544CE225 - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 8C4779536E52A6E38B516F146489FA5900F0048851BB0C6C5D33660BFAFCFF66FD8DEC70C0829895F9786B - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = E9DA94CCACC36ECB5FC504B7DB0A817004ECD8F70BD8124EC6DF25975A0EC7CC8894A4869304CC0B47CD43 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = BF10DF8F5C5BBA1E832331E89BFA8F0C3C71E6C97B0936125101E9731526EB824538EA7A9C5919241EA3AA - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 3AEE6318350617321CDD3B248833C82DC5564F097DCEE57D674222252E811711DD262F846A1EDF55091D78 - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = D28828DAABA0A32A45633CBB5E6F98021167433FD222924F69483F2E85CE0A0154416397B082164D28FA38 - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 00E90922645056A0CFF9014BCE4447C48B9E18CF0CFE0956BB908492E941CCE96F1246C4E91D53B768A568 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = C074B3DC172F6893EF421DFED0C12E680015FFD2AEFEAA97FDC5AD9CFE1D915894F912136EF54AC17E754F - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 78E20FFB0DD23A62E9B82CA33AFFD20BA4CFB8CB06BFCAAEBB193DD439DA31AE367AE74AE5EFFFD96F0B17 - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = 007A92D9C6C5C33B8410F415F6BC38D5C8EA2210E62C5D8C81BF595A031F134CCC7675CDE9DA281E6BAFE2 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 82C25907574F93E0A69AD8CA74B645EE52E37E908DC6DCFD6C9BCF81D9877E9C2BB4C2B35943225C70E053 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = 2ABC7F084A98629BDF379B0116A70F2FCD4A9D140E9CF910D161F8DDE10AE804662B30FB3FA6673BFD4990 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = D9A7D43E92FECF74A16ACDB3C7F6800AFB7829C2AD10606251B5D202281AA1E7BA996E263A948AB0BBEFED - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = B57FA7181D0526E558CF610150A6DB517821BA26E44E6A671264F574EFA6700DE4D51D7C825F1CE9856328 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 6FB5EA410FBC837325C640209CBA23520D8E3BE9A4979C91332F6F453FDD5F7859B2E0C3A04E6ACB510424 - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 8331B23BB529624776E85504143E706301614B46E5A2B674B6A43DC658FA203E960608C1DEA303F2F076E6 - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 86F28D5D8772959466C47B1AF010379F7164A9381C9807FCDC64BC7B60A2EE703D6838851F0D58831AAFB1 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = A995B824CE465F04E6B44D3B8484353F109C934ADCC5887E07E413E1DECB4B8C5604EFD912447FFCAA3430 - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 138BF7F073C33DD01861D489051FBE41D408DFD776F061BB6135FFD273C208F96513D7D52890E25B6E7129 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 77C9408C77AA0E3D90FB0122323FCB5B299310559173C1AD1CABC3E233AB917306A16916AE19F8B87DD991 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2E282A6B377529148B26802A1DCCAA58765CEADE041F407AC9A2DBC08CCFA0C683846E1516DE863DC449E8 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 55ADF62BDAF9A7FF3FFC047847ED267DF544D61B0F232D6595A5FEE036FAB58B80FD6E5FD867BA86243E8E - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = CE501B98A723C23C16B46E0315747FDC2E811A0990C5FC4212CCB5E4DDC8A1CEC0EFC854AE3E29F364ADE2 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = F604DCBCFB5E8BC28C8504E03E35DAF038B3183AA969ED36CBBB9051C7E71BA3E56FCAC143A3474F219842 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 66FDB38D7642E7782E3C9E97B68393D890EB57CF4092878A867D60BB05910A7125B4E75C8956E375A456A0 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F1B68E6E720D0E19A7429064676F3B80AD8BA60AF861B81D39834A9CE16852EB5CB12F2E7C4F73F119F754 - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C4277DFD0C738BE74F169C2842D09B9F666C53167C76339BB5C013276FE96890C3F8DD93B2C967BFA70A5C - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7AFCDAC865A901C9842156E9785F32F6699B704B4A73EF1F15284980EA789ED4E284C76D1751F208EC66EC - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 664D086D12DED1B75B9EEA2DCD7012B1030D8EEFC4AB93A90DA57E80A54424C359D1BF428867A9849B9F87 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 76393AC28A7593F37353D425984576D03F2327D36678CFE51753F67CCD1D413F61937E5AEC2231374EBE23 - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 31EBAAB2ECEC1FC8FC75E611E19517165107D7C3E01B5D85B2578FB36A974D1BC2388C30CA7145879F4EA5 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C2873403A1D285B6396DF046F09C6EE4D92DB9FD95EC1F6F6960BC6DD432B1EA5ECFD9697A0C41ACC15398 - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = CB4B2CF2B9105B7BF9DE3EC59ACF4C8B7E1430C7FCDAA311B936731956AC02177DD515059B576BBC62270E - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D6C7B694B7F7548060F75F383D6D06D98A116BDDCCF8F2DB09387704B0FCC65FFCB291508BF998B3E09878 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 15F0E5F35E1DE1AECFA3B0339BBB5FC629F9D0ACAC160983367D1558427BA8947C6CABEAEACB3882F38205E2 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 679B40F40A6995ED18FB8E1073902AABC5C7405A2A3CECCF54D8D7F0CE105D5D34533BCA750254D431B94D4E - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = 79E7440B29D960B1E59CFB05B3353ED06390F56B7BB75065A6C0D37E6A36DFFCC5512C8BC8D7E01D1C428F6C - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = 87757AE2E2CBCD5802DDF5885C80FF9BEF24080E3144E3517EA7E8530B86B84B3D1CC95967FF3B704E18B1F4 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = F4EF51BF94CA2DF1039550D0696E626C35F9A7AA69DC517528AA2529A91C2E6883D1057FD20E1122EEC157EA - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 152FC883B65B64F363B44EC713E7AA2E0F85DD47532ABE21746C54DDA73F674113C54AB1DE88247411B5CDA8 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 33F8FA87D4FD3651607EBF3DBE21C7DFE0A87CA079D89B67B5E3B8FBE369EEAF555A0CE817459BBB6F83A39A - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 91CCDF7545FED9F4C527CCDFAEE2746A47F34AED9205D15B90971E90FDDF9445CB9BD154E5A66D71199A28F7 - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = 39147DEB58BAFDECC796EDC377C19E52CEF8C0E366E5A7355F5AD6FC03B7C0FEEA1D9E40128F8EFCB1A5ADD6 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = FE72EA64FFF52A81CA4015077F689B4487C63189D899C53E136616A99EB78653D0D56EE7221DFBE788742719 - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 93747A15D829262CE5952644B5B0DAAF186A205467DC6EB379E1C226FCE7EE74D9AD45E46C7C00288CC21C6F - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = 0586EA22D5BA260E52FCC2E23B0CA6FE0B166B4DD010F439B63F4EE50E03FA16AFDB88747757C7D0F843D0D6 - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = D4708DD9ED6A68E2D422F5C793FB02080505179C475D51E281F1C4A99CDBD3FEA3CA3849CC704C09AA43F0D1 - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 80A99CFC19D0B6E49B1B065D058AB83F4F2645BCA1217B2C72C15B773C1C7B8086FA97500DEF7A3BF2AA43E0 - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = F222D75452D36A438B412291D48B33A7878283B3239E176DC844D73570FB2F9E65F4EC1023FECC24D0807CA8 - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = 15523917382ACB1D6E8FC3F4DBD00B1CC988CBA494D1BBCE7477BA8F9E5F9DB038F11B02A0EE17172DD62112 - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 1CAEE1A8E9D9250B87BE6B30F92BC7529F8A39ED6F4A1D84B80668130ED9D704BC8B10B50C5F8EA12CEDF689 - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = A8FEDB0791CAB5C28ACE7CCEFB562D2FC0B9994F3F9C5FB307DEC89E51ED89AB741C9DA2E0D87217D7A62F7F - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C2B569EA733E24DD8853A8FC7A2EA4525330C493EB0D4B4F8B573843B95273D75E31105FCC4E743E6BC49CF2 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3EDE271C48205FFCA61617D670DE60623535FBDECA6A5FF360728B1135C2C0FF94D0EAD2850F512B811ABB40 - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B704465D11643710055C9DA10C3219EB37525921AC189BF9A6166111719FDC159E11A3D4F378DD9BF049D4D8 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 7C846DE54D56347382A2A7719BBA2DDBE20EA28028ED1CF895E83E59EDE619692B3177806919C3B784EB37ED - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9AD29C09E507B07E4B5CC8D41B0B03D30BDC0539E25088C7FB5EF13B6ADBBFA535684E8C8D58C4095D01A451 - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6C10AB4F0022D6EA4B1C25319C6B583EDE813B318DC39D86790E6F1EC298522F267579B686F17CA5372211CA - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 42D27C13C02E537A8143B8C24DD965222CCA31ECA8D9FE4974625119585A6F7605659770F3F0FB8E8B9CAC37 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A12BABD2879BAE1965E5902B19EF156DDB6A00C8918E845DFD8A980BA44103B5488FAF9E42A5A8C081C62FF8 - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AD5F7046341FDB55E9E0BDE0FEDE2BC100B2DB09613C7144B1D988DA32FF349717C2F12075AF50A4EFD2053D - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1C9BD71B72922A3E95608B1C8EE937DC0E94640652CA74CE0C388BB6A3F3686CB2856AD2AB4B4EE2AFDED03C - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = DA4628F9C72970C6A5CCA5F456C966AE3B552F4B9218617C82785EFB42776229901A04D7A5E552C5F2118191 - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5D5CC7D8745D90C2D106CE52E12CBDD1BE1264A4787AC6D3EEDD7931D9975011C413BA03B6398E60E09D11B6 - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 30EC0883038BECFAAD20AF7EE0D91FD365CF533C27A828A4087EF62B3A857D8843666AB9256480A9A33D6FBB - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 3223E0BD9E4B37A65FE348779FFE093AF311D08196714FAD8689049DCF4F66E912A2BFC5605740ABE7BCA1D6 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 62DFE5F0F83EA31ECD495EABFE0324B2E1A11CAD4CD97A8B2DD832DBD5F5B021E1155EA23F0E4904C9EF41E4 - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 32F3337B9AA6BB19F7634A46262E4DE955819A22702A6A233AFA1B9FA4B7253803BF83ACAEFC7784443B8C34F7 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = CBDB5B98B3F43B6828BE4AD4F7B0A28D3AABAC6FE585F1C0CEAE7DEC17855E70F58C7FD47AEDDFF5C9C5851AC8 - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = 514EE12A763917E262307FD63138ED881C30063720F35330097A3EAB6803709ED13740D149CDCF54029401FA52 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = E283A14E34C650AD956879F65A462A1BA42F2736CBB0D32EA4B87724228ED77DD87B917E45B778BF2BD2CD2396 - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 2FAE8CCDDF19611A7BC5F46E9026CC2362285CE2F862DF106E4E06D66FA77B2FE8DBFC76685C17D24EE5707C67 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 03DC00F1022824A8F8F6B2000B9A2A652C394E7BC7AF51CBBB3F4B9C72EA3E486311C264E202EC1AC51CC92C97 - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 66A48B1EE9EAB87CB932D5E2784B7EA4C31710DD3C8AFC48073B2635CA90649CF2663FE0F69FF4E609A42DAD18 - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = 182921700836938F9E7C0F566A8F53253FA38D1FF7C02FC167655B176A45A8EBBF718CE114AE81B6FC9C932330 - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = CD0CC38C3D2D3F57F6AE0E15AC091C5BEFA9204145FC0D5F400AA2A0498158F78696D75C3200C8A95ACA1BFAF6 - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = D4519DD7C7F7050A27E90931AC638D1593CAC4C0296309A3198CE27DFEAEBA220B4A8CCEAAB2766909CF194B40 - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = 8D4AA25C8E6462F3741E88C28411765CC273712901FB167EFB4F81A377708DC763605C8096D7BBCE5555A8F20E - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = BCA070048CE225004BFFB5487F46BB5774003008855BAF767BF67BC95A9B43E221045424E5AAB9F87A356228C9 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = 8ABD7158F9285FEF3224FDBC1FA5EAECD372126DFD7A101BBE11BAB2AC0D2DF63F33635F67BC203EDE046C5CD1 - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = D711B2399539890F3E277DC9ECBE00A6C15D748F8B97AEFCF0268B58A0E45A2D954A8A13F8FA0015D1CE0EB403 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = 5842BD2EDC347FB477DD62E5578790369E9AF1ABAF3C130B6336894EBDC6F7B047D5AC69F5A816ADD2BBE25255 - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = E35232FFE5084AC76C059F0A43CA5DFD5B9380EB531B44EEF033BD9A4AFCD0FF3FFB1AEC55AD2C0BD39E391785 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 8AB93EA29D7D708350B55236BD4210E8AA9146775808CC072EBB62C659B362F12EEC13C60318E1E51765D98B83 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B1EE72B4E8039E1BEE1A179AA14F4945939C52CC91B75E951F8303FCF9F8A49293C9386E4A5DD3A201B93825EB - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E5DACBF97BD02446454DA3F805D45B35798FBBACFC172330FA07314F07EFEADF0EB25AC4C943C692CB5E3551BE - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = EB4D2D7417A1C425F4F06B5A5FB82855C0C37A25DD689315E869163EF3CB05116F0EE2C1C7907570201E59C759 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 59F10A109053836A659AFD58E5BBB8DD961316C34C89A870422E509CEC114BA5CF47A1D7C39F83661B7C2ACFD5 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = A3C363828BAD5AF6CBD6BE634B91FB25408515592D2A7E110188AE442A88DB55384485BED4300504C12AD7374A - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3EFA81AA42E676B1CAF37C147F81671DA2A691A12A2819697C061EC4E67C8E6B3FA08864A70D3A72AFBD1E8391 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = BBB7F2EBD0F857E2B429F771C894423DFE76D05A4CD496B657F489B8FF56D9BF2EBAF2C1DC504AFA2FFCC27723 - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 01983ED8E94CE039173391C76A250D487C5B8AA23EFC22D9EF8D4DF6B1AFD60E40077CFF22D60EDBDDB8482DEE - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 9C993A1B905F6C531332273D8762351DFD821626B91F86B5E1049141436EEDA4A693761E077A0504B6EB78B2C4 - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B160031FE3BB9AF8F64EF9C20177E2B6431658B24D272A151B46CB9905179524BB2D31EF919DE1BB9397BDE2BD - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3AB5A0F799BE1FF74AB4ACFEA0528B92FFD56B0FE1B9DEEB96D0CF023DBF95EEFD0E5DDC9DF4A0A98A70825B9D - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 8F10D0F49AB95E68758186F3C84F7A0546E2EBE9BFFC2787DF9C1D51888C3E0BEA3D9AB06086DF2279F8241434 - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E97BE16F2BDAEE3338DFA3FE5145C9661FA35005B4A80BE8464808CC5F8E52BDFF2894DAAC14832556D1260DEF - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 84FB80B42788AD66F30A65448B93CA96B80D06C5BD7CF6A2C5B2BF17E0D2EB4489641F94BEC39FA4F83BA7E4DA - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C634F93B9AAF4760A474EE62C1A1E840EF7F248341F7B54FBFBC0E2DE8DDD895E44140762C78FC49A7ED74A231 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 265B456A0A14003236F8BBE3556065D7C1A780BA8BD11B38C45484FC24A0940DFF87BD0655C6B2BE08BCC5952B - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 0B09CD4F5F0851A501924601D3A78CC4A58CF749ED684C7DD3255400FA463809DADA3BAD7EFD58E74F3D0CFE1937 - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = BC685A60BF16125DF85221A22796E6305352F7675C2269171DD5B6570A80F59759DAC956B5FEBBFE582C948A12D4 - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = 0763C8486DB8CC03458091C15BBB1E2CBAAEDC1A51F4B5B1D43D4F4B1072818764520BC59ECA19DC829DA67C3975 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = 263B1BAA60E17F77487239C0FB377A410B0DE653880B0EF7856859D06E5030DFCB5C7687179B56E790C1CF611EB3 - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = C0D66846B2D0B0F8BFBFCE8AA2EA4D0CE1E7216A0786EBB68D0DF87BFF6CA5C38F410E708C6BBE47190778024180 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = DB11EC8ED7C6F841F5BEBA72446BDE63CDA85D8711C4A1E79AFD66D9C40D3B17E9B5AC2D0AD9C3C22C722A2827BA - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 328C4745BB0EB701246E0C09897A680FFA022A05D9A3C43A2DDD4B19AB1F569D8A17C55DC5A52C01FEAB608625E1 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = C91068D5A235597E4AA64A5582B966701FF1E8C32C2CB2FA7C21952ADBCB837BBA8F8BDD20FB28E952D192A47CF3 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = 85E05D9370788ED0DC7F64119965C6B1EA328964B4C35CA6EE5650470A797D36579A4AEB810E2C715F2FC4606C43 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 8AFB8138773F7A85460E08D64978CB0AC8E1607E636F1113DD8A51283F90605F091A51CB6DD025174D11A612720B - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 3E58ACBECDBEE18BAD898FF9D59DC49674B06A93AE2A9D6743283F536A4EED60B0459A7C61DAE02FBB970A8D259D - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = B394253A4AB6753CDB9A78FB9AAB038FD457DE318F43585583590FA23A3B3961424C6F58C011FA9F20A9135175F4 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = 9E7C88F35EBF1AC835B0AE5D5695BF278EA7C32B53143D72F12C3E252E5DB86CD76871C1DACF74769CB113591B49 - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 34C9671BB77D1445E9E8F83004CA238962E76E32E7AA6CC77309589F688228E3010F941EDB98313BBCC02FAA3F93 - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 4753CCCC40E5DB9A19E9482B0C70A461E51F397AA3E98EC88AA392C2B886DF636428F389DA177D99C0851DD832A4 - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = F29475FDEF88FFF1359423BA63C873D5C02A12B2A0906C1004766D3D8DCACB3D8276BC3AED6B91932E37ECC63078 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 4B40E75ED8EF9E174C36DD5EDF3145C954BCBEF4A89ABD2D47A1E5DD9C3A047CC96A7C3D0BE0A2FD58E62406DD43 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 241FE6F59F6C5005CA1B7B67AE657EB99589356749941A338FE3D86945C2BEF5FDDCD6EC6EE91EB2F5A4AA0AC05A - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 92F4F47CA42CBF014B95A10CB0FF7ABC88F5A4EBCB1E5EA42D8C6AE8C3EDDFD93ABF79007A8A245F2E5F92320357 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 0BF6BE3E06892E9BB6DAB6974F77F6095CC9831AE2C3ED71CF11BDDE5D3C136C2DB7D3F2A28CD722C7177FDFB95A - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 3E68594D86A1D86293C47329E3281C1297FB3BB9EC8407710AA02EF233833436C7CBE3984A7C4E187EE3DD5BB4D3 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 864B1ED0A453923F1D92C8DBEDDAE2C18877C0C2F52F5FF631779A76B5DDBCC53662D7957B0814E2CDE960703113 - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7E9AEF9BC326B8EA2FFD9118DC116D91837F1412CF541B98C5956E48D432CE063BB14F215B8757CAC4339877F317 - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = FB08AC407D1271D44B11B49947D1184723D67F6ACDBFC1C41CD46352AF670D4EFFC0BD5A71AB3659F69F20B0D9E5 - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E4DBE32BCD706DD02520A58388F7084D583AD6EBC761ABF904BFE1C01F9BB0D96F119FDC90DF46748F13550ADEC2 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C2D3227D681FB249681FFB0A182AFB92D72AEA37BB49E880CE82B415751A123C18192B006D7DF17F58EC31BDC170 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 759C0F7540163AF01924246EF83184CA94A9E2C629712B428C22717CD89A7387F943032E45F953CEB8F4F7DEF135 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = EE60C0C74B8E5F08DAFE8406BD6280A9309B46EE7B9EA3978B1F4B974A1348F4A40F68A52F4D0A26215EC636120C - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 683943D9B8F7E974853BE8DDDE96A12492E11B495FC22F5E21F7550747BFC022D6B806DEEA7E06336051B93FCBC9 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 0AD4505F7278B8CF4CCFF9BC1E33379054FBE2A956DFF6A5D2B3F7255E6C524F695DB6CB2B5B494C274C06EB86BF - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C49C7567EA36F31351F1C431131577523AF0C537EA54003EE00740CA95922EBE242A23BEEE6F8E2C2DCD32BF42AB - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B8800A1516CCECDA31C8DB29AFCD76CCED919357CAFFB7C18209CC977F62E3CFBFCB8739A6E64E0D0B8C99382BAB - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2E5913FE300DA9F981847EB83BA265817145F369B6BF6945D97CBAF810BEFCA5C5D7782BEE4C9778BDC370732DF9 - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = C32427BC1F338A75C0FA853F2998183D7E030A4D9244DBE83FD8B73E1E5D41B9CE368359853E766A3B5C752C40341F - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 0C2B673C99267B791C2E09C2BC29F9A09E23D998F1E2EB12E9CDA53F9C120A6DCE3CF779E994BCA0DA424FC0B2946C - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = EF7A2CE3466C69D356F69544B1F535DB9D126858FE19E7C3C9BAA9317A6EE00FB1D08F41B9F6137EEB2F4292F279D6 - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = 845DD00102EDA5013F3C27162FC45BD69F1B2E6D6539ADCE3C826EECEDC3B9082A745EC56557B28D54CE9879E8B9D4 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = E8B768F5FFD78ED7FC5B79047999E8C1274A1F650C01EDBFC054B2AB9B0E1AD947E3ACCEF3CC76D2E4E6EFB20DE4C5 - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = 21C457E7D15833A0A7DD0D2B7078D919DC1564876A5C3397FAB78E2F6764D9D3E6CF1E975F38E823A455AED4C64CF4 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 3CA1B188ED5E2F3AD65CD5E2E42A15B3E1036925870EAD5AAE1B47DA049DA5617E5D318340885234AD3C52BC4406F8 - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 7D3CC17D13AEC925461EA01A8B5E991250E262589727B3E9C5C85EBE2A4CC5C7951D29B6F7E941B9DF939C01D447A8 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = DBFD436E949DD9C3E32C6CA5B3952EE78073EACA0281E77965A7A23735E10E58DA350AEF30E50753EA54743AC87294 - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 649874000E737F79586E2FE573208F532D128A30A2F83371FB78743544A5DBCA4512F24E0BBF69FA8CBB705C910BB0 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 85227E4F47C0DC1840B3D0ABB6E557806C94FD26322335FF3B6C3BC6268B859F1A423BF04C1EAD1B9209DADAD114D7 - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = A9E770A26ED28EDDA1BEEE4D8FFA890AFC859A071215322F35C83289B7072753E52B720522D2C7AE2CA9549453CC68 - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = B0A6919AE087BAC00C59A6F7A76FAAA4141D2D848A6396346E9D2423D3B11D0181102356AE17F3DABAE2426774AC2E - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 825C2BB34EE31DEDDEC454491B55C242B2BD7F1F73D07661ACFFB425CA8A7761AF7159771DAF056FE018B908BF8322 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = BB1F4A0C3C2F2E7A16041C0E8802D0EFB88ADA8B900D4C92C9C22A3F4B4BFB37A18F327B7BBB0FE08550D22E281A43 - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = B6334BAC3D88B25E6D2B4CAC8C336CEF2B4E9D4688139DF3F02D3B72045237814203C6B9CF36C480550FFA43B8BBC8 - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = EF4AC395F41855406B372304FCC9B087810DA30896D6AC64B566D1609F01174C7206A9A957AD88C8264DB6D2888C40 - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = DD56164007B459CE02783107E213F3B5004740DD2A9CD0C7A186BBD661A02FF25F3A7E7B9EC0540FF100E0D95F6844 - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C803C93E93F29A3929B8202596DD5AFD1D0E4E13974F97AC3F0A75E0ADC56672FA8E5E1057257C940CA86CB3C131C0 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2D78D615DA5F70A0E688A6339329C462F58EBA983968C565825510670329FCD20A0A57A529E015294D852E723279C2 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 50E78BD2ABB039072778410F37BF7170F96FE4E5017FF2556F91B7CD338DFF837FD01C852AF4E024ADE5F49DD1B62E - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 9DAD8C1ED8455D52DAEC7A8E53E10B4F8501AA160D8A6A9A5178F9DA4082430F962EBACF0ED9D31BFF5EE90E5166A2 - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = EBE7C27B8B1655F13F66EA6FF8AED404EF1CB00E811B12FEC629C709F39CF6DDE11E2B37815A35E72E40C54020DD61 - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6DF06078A3E99E2FCAB5969EC2AEED03590FD67A3228D55130EE52E4E389F4C9D4C4B1E2E91D7E7FD91B82EB0E1E3B - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E280AA2A918A3AEE36C73D94048F830AA8FFF5AB7C709C4528D824775EAF72F14D079461E2A85B6AB3FBEE074708DF - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 80120FB1DCFF9C03155A63929F005C7D76C3B870878ED178E87F29398F201F36D7F6584DAA7785EEEED8FE4082EC3D - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 75EE8798463E3D9CB4F95E2173860F44C612F3210D1F28595126BAE15FD386A19A3E71C7CBE788FAA4E794D06BDEDA - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 270F3F4777963B802820E2FE71F215035DDE467E3724925A0CAD2D0A5FEED1A34C11084736ED1A36604C9A31063A4F - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 7CD293EB05269B7D9CB0BB315D38C86DB68F6CA59DB0A895ED79F190B000B818ACFA9BABC889F46369FE0036305AC7 - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 080303991BDA69889729DCA0BD487455C48610ACA62A86D215EB6E68168E46BEA530265416B6D16BDEAC279D8440B5 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 1D6DED2C9B5C03A428B695BCC750A99F80DA76913F35AEEC470EFF5EDCEDB0C52E18DEEE6C5745A34B655EFFFBF004 - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F0039E1A2520A812A110993954A7D4A64C9F87DB50FB34811F21EFE4271C722EC45495BB1A25942342AAC02E0A02D0 - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A6EBD7AFB42B26A3310C67A3DAFF816DBFA56D70A337606230B93BB07315A75258316323156C3A2B0826C534867ADD - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 56D4BD4AEC4B27D07A3469E7D74C1D721EEF5DC4905F47587AA50E55E6065789D93B0E7104BAC6BBE85D976349E034F7 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = 7866989E9DA417CFE88B03375D5FF1DADC39CB67C34E98F83C452A803308BCE9BF16EC82402CD2310A96896137723BA5 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = 26C897818DFBC05345BD547184A664D1ECDED0676E02108699314364ED2D7CAC86BFB7CFC58078B37C882CB68A9F53B0 - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = 8459B74C4BCA30E3B2DDBA0AD61632DA6AD67E3CF8EF9207A1395FEF85D9767B42D121023E43DF1010FBAACC9ACB7533 - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = 1E3F7D783E11F7665027354D98036925C5E3C63207BCB5FA2CC919D5C439E5207C406423D820B2D6A134EFCBF53794B0 - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = 92CBC66E6B5ED2D522D36CB7C7FB6D920B1AC75D3A15FD83F1993C4821362A7A7B186851334E88580571E70461A0ACCB - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = 4322DCD5DEDC235E188F57C605107A4EFB9D1969F9DDEED811F82092D91D658B76926D27A5E0519667DD05C704759E26 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 204A6724F437C98E37FAA9724EC4C239B7B942A7CC216A6E54BCAE725A0CC3FE16018CEAB20D36D51E13F38C74A0A72A - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = 1F41F49C1335D8ED7987D98D0E4CFE3B63AF97AAAED55CA223824B68BC1CEEC6AFA22A74A06B53BD3C72C5F18F89EBD6 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = A78D5542CE72008BD261165CD61E093FE8991BE66136F6BB5062EEFB20D2F5CF36F231CA0986A9E94DFDA6F4B5C6953A - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = 3FCE6B91BCC3F3F68E98677CB477DE9FFE5A39150CE6A1A9C59305383F1510409D767C6612BFC90CC020B131E8E95A8D - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = 1F36BE3AB9745D667EE91651F38135392D9FEADF351018C30AA100BC333243892D332995BDD592A1D6D31B8FDEE55960 - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = DF6ABFD0342841DE69B189328A3F52D2FDAB8F9483607E3B9D63F713206C15DC9CB2A04183FAFD48F2C92E7D3FEB743C - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 5D29B1E5014197D11BECCDA0A50467D2CE3F4293898B5E149D1C781FEC9198142222F1B6DC9688987C5DBE0DB5950628 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = DC081605D212DBE3E639B1872CDB63C792B1A981B368D73CBEDBD2A2B8514D9F1495B5EA1E0945D497A0D83FADE76467 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = 95E2EF5275E297106DF1C2ACD68527C54C0B6D634E1BC4043EDC7F4898EF5EA4DB325C546013618804689CCE2D1F5F99 - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = D254AF62C0E893A2F1DEF996880DE6DA4D613E8C23E9C2D2E3D82575F29FB229011469992E78CDC8C9B1B0CC3089A5F4 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 1166730D62A3025F516CC203DB29C8CD08D709D1063AD1388D7298A4532B2A3AEF7B7904917324983AF2C963E70AB4EF - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 6F023839C4B632377401A42A1FDC1A30F8A4C3866A75EE08921FD9D930A66D1B86262916CC265FC6FC6EFF7EF70FEEBE - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 725CE30D2D39C686A73AC55F3B5673202B3C9691D7B7C5B64F57FD47F214D98127F59BFCA0E078BAE93C703D792F247D - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = CC33FE4129DEC29A9300369A514A9F3C8C16C72DDDA1A34CF358ECED3CEF605AF20711A02C2DEC14F305DCD49EA7C665 - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 45D89A0105BFF9EFFA1525D5475760A3A1170FEEE5AAA3E3AC8BB6A3E257613CAA64197B3B32B87B3898729C899A1230 - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = D18C242AB554CB6277B0953544228FE0C0A8291657999DC7A3DCF4BB2CDBF0996560FA8CDB1FA1FA442AD02159500F20 - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3CFCF11B2D4D0708AAE7509623A4CFF3FC4261FDCACCBB7F57A4E097F5A3FE78AC13B6FE36D2295741441871DD8F35ED - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 8BF15AF94D784A07F93F9C8BCB0EE236A8ABF60437D920EF171127E1E36544A49CB0C6C244E1FB231E9ADC32F37B023D - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B37230059916DCE59BC181C0AB60EB8A484C0A415F1A54CF9992CE0906FC09E92E9DCDDD2949C8D120D243405FD71558 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 22DCA922EB8C75D63AE535E340046F51CE9392A819F051A5CDE6730D50735E6E043B224ADA144BBCFAA8D8C73C3C28B1 - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D93530BC853A6293076BAA6934274D43D149638AE3D60D0466B2C03DA6B04D953CC251AB15B043DF234286E88D3E5171 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = A66D0DB9218D226F65A5755DA3EF96129BE59430A9D61465DA5CFA6FDF7DF82617A003D8E145CAD8E2AB2F1EA3E76734 - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 6AB203E2CC95E024B0541DDD4130C43765B129B8DA4825960ECAADC3A7C731CC71BAC0B2518C8938B4A2C0EF7B947E3F - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 921B18C77999EAEB52770BE9E60753AB228ABCD961A51D3EDE0C5527F160CFCF1DA451D414A89B6CEE0859988C16C5D6 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 7D8A673C887B7A81E5B1960CD6150B699E592EA05454DBC8F7AAAA7BB91FCE8638036DFEF5263B621957C84C0CB53A87 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 5B5FB6B01A6FDCEA1E58D20E2AE84281955C379BAD97BE025250769FD1DA0493876ACC85B9940C36B05DB652FAEC8A33 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = +CT = DE50F41FBEFEF36D5F3702FEFEACE6BE + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 00 +CT = 0E34CCBE4EBC5E306B3CEDCFB44C7E7D + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 0001 +CT = 78C2DDB90A06030B7D2AC16A3CF149DE + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102 +CT = FEAC49B484E3D4776D0DB295464FC4F0 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 00010203 +CT = D1FA5341E557D41AF43ADB47ED656129 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 0001020304 +CT = 0AA6B811CCEFE188F918A96DB67DAD51 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405 +CT = 9653181DE18FC20B7347085E95913F7F + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 00010203040506 +CT = FC3FCD530E809EA6B81D5B794A4E9CE0 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 0001020304050607 +CT = 4B2E4BA1BFD51BA959303A5F6126F756 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708 +CT = 220A33659087D28A8E8DAE3404FE16E4 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 00010203040506070809 +CT = 13802BB7C2EBB9145B89A61AF28C4F5A + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A +CT = 3AFF9C1FD8DA0AB59BB051B65BF55C15 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B +CT = 0F6CFA66129A021902BF35F04B6C1BC6 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C +CT = 71762DDFE55489674183F9761F82A376 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D +CT = 5FDEB7F886F5A1EFD34539DF6EA7853A + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E +CT = E80109CBCD8AA85B8979F0FFB8414993 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = AC6F099E9CE19111C4F4578EA6861748 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 498856CA68B1E28F4A7F33049D57312F + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AFA7FD9D16D7EDD6BF51B9C1AD5F89F0 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DA30899DCD78D23166AEDC66D6D9AD25 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 63CDD0FF67B767CD4F123FF73B1491CD + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8B84DBBDB31A04EEA1B8B786E04620BC + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B8BBAF6BAF4C05567C5C565234F3C6D8 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 17E733B8410C1FECBE7210ECA1D63987 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D886006CC0A280B28333C2159E7508C0 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E6BD47E11283CD6CE344FA6684F3116A + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8644BD43547733B091C7F11C73876310 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 087C48ADF6D0B87E2D4205CDEFF1544C + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8A03FAD614D7512E680D3B93DEE3BDCD + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 97AAFDE8E838CBA42548A5A7AFDA9B17 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E031393A03F35BDC2B00558417EC0745 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AAED113C91BFB7766B984D96FCC37C22 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 74D62374F61400AFC751CE62CAFF86E1 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = +CT = 3CA1F6C5B51B4E87880039F409D7270DC9 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 00 +CT = BC6F5FC1A8D428B5F42810A18C1149B0D5 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 0001 +CT = 667F1C3D513DE2237A6CE8E45B355BF01D + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102 +CT = EEFD74CE47BEB1E3D23A3B0835098CB674 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 00010203 +CT = EB47DA5D3DCC8E1DE0C1BD627FACB5F9A4 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 0001020304 +CT = 850A5C051CB7FDEB98EE2060221749FE9E + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405 +CT = CB7331B61959659FCFD171A493CEB410A2 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 00010203040506 +CT = C56BCFDBA6ECD3CC1E38BA5BC0728C6C36 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 0001020304050607 +CT = AE34995FA5368F6E35B72FB844F9A019FC + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708 +CT = 77DBC9396DA6EDDC278AFCDFBECCC1331A + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 00010203040506070809 +CT = 20DB590C3B2A9C689AFF247C2F03AE71EA + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A +CT = 7C7B33EDFDBAFD1EB1968B85D7451328F7 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B +CT = EC9F79C350C7483FC26AD29BDC9D1B95C9 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C +CT = 697D8ABA49963125EDDC71B46D4F6AE508 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = A0834ED29329D87EB2212B35E6C5D61C0F + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = C7BF55414465BC947246AA93507CE363B9 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0A4F804871F125A1BAF044F3C49CD0399E + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 691FA036486B676A8C05A5A9B09200E599 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8454B64FA275443145D540B08AE2C8793F + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5D0497BD3D9B7AA8284101AA54DDEDDA8C + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = ECC3D948C67FECE0A1CCFE55CAE2BB77E4 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 075CB6D1FEADE9B4FBC9705CFF0843A6DB + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 66F320A5C7FE52B5848882932920ECE710 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DE53153A0FD651E7351C0336EA1FAA4445 + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B7ED4B1049B8B59BCEBA8A0432AA9FEE5F + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A0A864BC8858272689EA1AF47FE603D79B + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B217238749D23946DA2102BF29175830DA + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9AE1358B80FD137A3A3644D8ACC19B468F + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9D5BC04E8360EF1CD49DF88F0A237515CA + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1877505DA03FAD5BF11FFDAC1F7C9C172F + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6EBC505BA9FA9F6BD268BD6E5D8D8934A0 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 988777E0C60DAEB3941431C3E87FD9A160 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E5C3FC7382DCCCA20FBEF356D886993075 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = +CT = 77DB63325B90DB90BE869909CE939940E918 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 00 +CT = 3B653BF3BB5178F0ECC4C091566A05016B5B + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 0001 +CT = 6C436AE06EC71F3674B4C3E4AA17DD18CAE3 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102 +CT = 0DBC2D0920C6A9491091448868259050FA9B + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 00010203 +CT = 85A6BE9027D250C668967BF488E7A9FF9BB3 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 0001020304 +CT = 688F9907BFD2412A54CA03A5D9DBB7BD0E6B + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405 +CT = BF90CE321E269DE812ADC4A09DBDBDEF6F57 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 00010203040506 +CT = CF10719187AF3FA31A9493032B54814D7C7A + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 0001020304050607 +CT = B8074331417766C83C5D9D9E7327A09ABBEB + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708 +CT = DBC9AEDA698511AB9F5C61809771350F2C46 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 00010203040506070809 +CT = 46EA2A671FA05E3493B8C97DF98929879313 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A +CT = F09A5644DD2A51D76D17DF90FFB3B7E7144E + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B +CT = F1698035C4AAF6A797EF42911D8663EAC7F4 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 945C38CD9A31E342A180D5C32206904A977F + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = E230860A9E13273B4A2C84E915126434EF5D + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 3BD2BDFCF14BF2B833D39C7D83D2F121E977 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 1684A27816AB5DB1B785F7DA6973F1827B6F + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 2B42E7331D83D266EEA46DC7436E38842E11 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A5AE9E79A67A8732F7FA5D008D5A3F53A7C4 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 7E31792F1335CB02640D4CAB8B658B4F11CC + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5625CB4DC0D820F8F73ADC7097909EAF83F6 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C3644088514A474B92A4EE71A494DD40EF50 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7FD6F4FFC213AFC6B5E4519D2AAC781D4E91 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 58F8FD3B3441893951608240105AB92BB9DF + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A4CA0614842C8A9A21232AB7C27913391804 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 58310930BE2F2B5650F4EA586083E9C600ED + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CBC3DCBBCC2C204FF1B3E741BA45F6480234 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B27C4C3240180F51015C0B0613CDCFC3C3C5 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 22E0DC25BF3DBD2672EF6FC3659554D4CA20 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EEAB2A8DEBE930B4C6644FE4DE5847B98DAF + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DB2C74AF2BF485E1B152FB2A8695B144431C + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8492B3C0305773CAB4EB045A481EB2CE322E + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CBAC7CB92D24BA0D37CDC09BDA13854398E6 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = +CT = CDBBCAD20D5237A010B199BF93FD3EA0ABDB26 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 00 +CT = 231E9F228D9A77C61C65891B58A7E56BCEF0E5 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 0001 +CT = A45A8FE89DF356141002A42A8BEAE9D3A14FBA + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102 +CT = 72CA5B87D1DEFD6E352CADF88B6E1F51D2828A + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 00010203 +CT = 6EA0FC340617A5E4EF9BFAA4F19E5BA9586CB4 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 0001020304 +CT = 47B2AE66E5B2DE1026A398D7F9E60C5C19E2CE + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405 +CT = 4EAD73A5055859B504249B9A1E7AB3B3BB47BF + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 00010203040506 +CT = AF5D8C03DE3752BDD2EE7C3C24CFA10D62EF08 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 0001020304050607 +CT = 15E9984D2286CF2EF5B62C960BB8C814B88998 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708 +CT = 23E18C90D64A8080A2DB536AFDE28EC3BBFC9F + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 00010203040506070809 +CT = 042C264C298EC528722C7B0378A081A966C5CF + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A +CT = 938EC4272DC2268E374FFB6F2995C537F01DF5 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B +CT = 10BFD186013955DF2AB32DDF1D3BBD8BD196C4 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C +CT = E4EB4491D9694AE69F22D8C6F2F69CEC90CE52 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 4735B0849571B0A0A2E1B563B4CADF69F5572A + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = A0F6617388332C8A6374BD1B82951CAE53B09A + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 00A55539719DF863B3ECE11E281C0C003E0F83 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 50FCE4D2DA342E44FD3A028D8880076E9CDD30 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 20A63BB02241445AFCE19378B5E74220A61C66 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 80420493867A07922654DD5BF2C872D9941A28 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 529419716F77C765E7E86A6ADD0DC10938B710 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5B6465CDED904142D8B6BFCC5D8285EAF6259E + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 39949316CC0E9A61270FCCE64D6BBFD79DA3BB + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C091918E211C7D06CFB9284840785B8BFF6BE2 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5A671FCEB59C315D03936E9948E69FFDE19E84 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9627E0B3E69BBD1B80294C19AA8F5EF4D07F11 + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = FA96BB6F95BF63F3386EF62F7871FE9E609A8D + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D10E85B2771579679BCC33CC3BDB5DBAE94809 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 24184FA6047EAED4795F8B7C608CD8C5FA4E04 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EF8865C8C9A4386D29EB5F4D5C58F2D9A30B5F + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4842C1618F86183E6A9BBA9CEC0AF45A4B00EB + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5B345E5308DE29CE4A7DFD7D2264BC2E4D5148 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2C931DB11D4DBCCC0E9755B43086B22B96EDD1 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = +CT = D40A4B1141F108A1B896DFE81024C16C8C52AB2D + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 00 +CT = DC141D9CD9A47259789C085F8A048B1A37735E0F + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 0001 +CT = 57C00B24CFD8C8A640BB356FC5D933DD61530BF2 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102 +CT = 6F0079FC8DDE59FD9354668F0179AD5B0F0F51D3 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 00010203 +CT = ACC222076F6C23C6934D76DAB046821B42D6FBA2 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 0001020304 +CT = 0AA5A1422143CFCEBB5614100594301F9D9C46BA + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405 +CT = 0B93C93D524BEC4CBFA6390862B578EE0A9F33CD + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 00010203040506 +CT = FFBA30782686ACDB48DFFA5D9E1C93CD6F1AAFA4 + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 0001020304050607 +CT = F474A623EE765DA1EAEAA5838DDA07B529430DFC + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708 +CT = 8F298CCD071DE0FD434F620AAE69EE2758D5DC86 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 00010203040506070809 +CT = 799D733648FCCE075F991F3F73BC1FFB3D8B957F + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A +CT = 109FFBF70F3C9D72247D10A82398980F600ED755 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B +CT = 3826B619719A1621E8FFB9156F8233CA90F45DED + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = E5E9174A0A929FAEDC2BD9396F45ABE05C6C403F + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 6A44DA6575CFCB9B7D1518B71CA9EF4ABF872765 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = B8A27B8B09764D937D25F6980A978E379D8946DE + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 106FD45D3953F34FE649CD7FDE3B93146484EF61 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D6C3DAC061BF10B6E5F285FF3766F103E783B961 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 872CDAC4BDC456626047A4321747EAD16393A1A7 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9EB61F2B366DED195E11FB52CC270FC6A8B1BBDC + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6884A7B46EB5EA6A021D7A35BF3099E3ED3A3E5B + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DEE8E6C7E54E286FDA055152EEC9953C09CC3AB5 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FCF6808C0FC27A30B389A2D95A4C1CF9BE55E282 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6BF84BF53BC03F130958B6BA6EABE36173EC8EDB + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 355A6D58774CA97E931FF80AF17A1586A8B55660 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 151AA0F6FF73A4224DABF4181BB4AC56B1F0A872 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AABF6743DA32480BFCA88F4BE88B7B6124CC06CC + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4765605A1A8049328AE5A78481F8122535C5A0C7 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4E1919BA63E7F619303B472D433515E41CC0A1D7 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 76E5E86645B58250066A7498EADE8AE9D294D609 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 92E67E0C83EC936F752EAA9DD367AB070EC9A10C + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B34A7E8B8B5491B43F02E863BF53DF6CA8DA66C9 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 4112446371C13C1A4C4DCFAA2C07D2B55ED97003 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = +CT = E53BA594728F0856DCD8AD2AF185CE4913F94DD68F + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 00 +CT = 67F121E88A20E5B26463E4B594EA35D6FA97F2627B + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 0001 +CT = C66A200B8503938DFE986D64A5822490E9D8DA5B18 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102 +CT = 239B6383BF63CCB3EDD789E8507D32D5B4EC3C05DA + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 00010203 +CT = 8B3765C431325B699A88849B7D5D14203D899C8889 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 0001020304 +CT = 4D3692C42545AB455F0796F407BAC98EEC216C0B7E + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405 +CT = BECC6C4993BE15522EF459B1C6E73E1BB5BDCDD9DD + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 00010203040506 +CT = 10B71020C508378CB725CBDF96DA64369E5ABA169B + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 0001020304050607 +CT = DB127DF4A182823A0E7207B822A94AB51BCC580849 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708 +CT = E370BF8E18541A7DE091AE6A445E672AF6A6F64BA9 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 00010203040506070809 +CT = 0BA206C83BEA9BC3B642AD2A75480713BCE9F5E761 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A +CT = 820596C62C6BDDC942C3AE7D5477FCEAAC47AA2CA4 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 8D53816CFE0E93322ADBD2D8FE6659F89CE5245BDE + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = E10357C9B4ABD72277E490F83479C4BEB234E337CC + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = F34F696A0FBEACFC22071AFE5B39A291ADAD54B8F6 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 31BA53B4851926727B021795553DDC4AADAF4E5AC8 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = F79A322E57DA79ACB19C26C36EEE122315757C8501 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = FA498549E0AD3EDDDAE1B064A86AC6BD2808BFCFBC + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B7F1077F02189C27EB2B7180BD24FF4B02BACE4882 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D38173A5B2B574B044C6FFF20E4E9A472EDD6B6FA9 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7E0CD2D9D3E447E4E0CDF2E51B1073B37DA703A027 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 806992DADD9DD5B77994506411537565D97DE80209 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 343E7C80CE95844A47ABE91ACDC43E8EBA5585BB0A + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9D81FE468796C55765CFDAD0C30A8798D8275989C6 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 54B850FC9EB402331D5EEFF4A8491B21DEACB2D311 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CFC8C67E88A5AEBDCE6785EBD7BA4A5AC8A65573AD + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CEAC07E588085996A1CC709424B001758E698F812A + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 41B0973851C8B7C412712208E5F7C946432B7FDBD6 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5CE236352CBED518653CBEF78BB58075C84138DF54 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 88066436FCF6EEB0CBF0630CDD52FB949E2C0E9307 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 45EBAF49745D54895F413B549AD1B77E37EF54C030 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0CA28956B3C674BBFDA9DABABD1A691BDE754B199E + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DC30FAC3111D66F50B2A56B66B2FD40D6852D4460B + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = +CT = 23D23672C621EA633B7F5DDBE7AF7169B165994FABE6 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 00 +CT = 340E60A2E2DE3AC2ED11F6979A310D2165088717E343 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 0001 +CT = 659D444EE1EA2CB21FAD525BE19673A9CC401AF16358 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102 +CT = 595B70CC60C2C70D613692FE781975299958895BE529 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 00010203 +CT = 8487542BCDAF548B98A9CE48187AED56DFDF3B199F09 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 0001020304 +CT = A6ACE31F2DECBB82EDE341AD0FA14E2F91322D86D3EB + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405 +CT = 5EED41F0C72967873F0D175C930EF60C943871A278A0 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 00010203040506 +CT = 6363AD9EFCC98EE7DD5D95FC0EFC243E81157B175322 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 0001020304050607 +CT = F4378899F011A8BB77D32020CBBF0B3AE22688CC4D11 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708 +CT = 72BEDBA173092786941057EDCD2A5AF34415924E879E + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 00010203040506070809 +CT = 9AD09DEB2740CD6B0C38FC98AC35C3E356F03F5FFD61 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A +CT = 6FB82D2E5D6FCC726A728AE3DA553485C46EF13E6441 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 9D96FFDC2E36D868169E05F9F9CBDFD0994BAC2DBF15 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 12B47986FDC5C0657C8A2BAC6E1013D981D86C7927EA + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 3D964ECE39E0916A524808D1873CDCF54989C252374F + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 26EF3FCBD2F0984E4048E436F9DE0B42CF8AF7E4399F + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = AA8E7264D4816F97496329295327B071D669C287E16C + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 75587BEEDF4A4745513A6BE1ADF35D2D361092581FF8 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7567C36D6BC8075C213270D99E59ECE895AD58683743 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 551B7A7003B305E6F5DD2DD3D7C2CFA7C5ABAE1B4FC2 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F5FB1F41095261A32F27E9F45EE48AE01BF852E76D30 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EB75603E0D50F4B199225D12B1ED3C2035C7E780C6E5 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FCE26B51D4E2A8CDC7B067859B0C16A042E7BB0EB67B + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A565713FE362342BD85E64F0BE1EC891392E34B153FC + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = BD441D741C6B1BC331CA4DFDC9C1D86E728154D9A1D6 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 535927E0CED8E779F5D062BDEE06283BA22DEA34F48F + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = F35E24D2E9A023481A916DAE610D53427BE8E67B1524 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2FA4AF66043FF68F3FA10BB9DC8E666760315BE04E51 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A64ED97F9F0AF20B16BA1BF5E00AFD89030EF411C502 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FB1C3DEFA080DEB2FDA7639F887CD0DB935F785B589A + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E6B63AFA34D6140724961B322445DE5CF72491E148A3 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F971F1763F18382F13B2BB29F669299E977666C0A140 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9F627658C91BF2CFE1F752B4FF924AEA40E3F2DFE359 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = +CT = 20EEAF7858F9A8F0EBEF1FFADE91E93AC660F4B8146938 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 00 +CT = F5D1A8ADBCA20A31864D7F9F335C2418A42A10756AEE1B + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 0001 +CT = 2464F50F1D19BF35644484E1F54DF4B13942E3B0BF0CC8 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102 +CT = F0C154AE15C4EF13A01107833365CFF796C03FCFA0B575 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 00010203 +CT = B508B75492DDA50212121DFA921495F65D1F06F0DA087E + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 0001020304 +CT = 84DE619EA21635A14C0DB5CCA88C7BBA16B0A882A63FB5 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405 +CT = 281A0647D9AA50F6E62AA2F5DAF1FAB3E4327ACA847B95 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 00010203040506 +CT = 609F354375D42375809707166AFD214F13956B9D3421F0 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 0001020304050607 +CT = 16A9C9238F1111483682DBBDC383301C93531E67750DC8 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708 +CT = B5542F17261AA294888A4F368396967AD76E336403D1D9 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 00010203040506070809 +CT = FE0F8F97095871391FA24529C1B8EB1E9550E40E353AD8 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A +CT = 82C4DC0AF47E80EEF40AA865C6EE75E568154A1B48CC09 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = 6FCD09C52BF129865D176F8C7CE0212A9A542040FB1517 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 87482449A35D8941289DF8079F8A33B3EDB02FD15139F2 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 2889DAA5E4267BDC0C6DC9C1D2EBDA23C1FC4DC4CB6240 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = 6058654D68E78D04B20E97229D330C2E1445405C57C985 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 841224EE0E59DEDEAE8CF4048C24D8A74152CABA081714 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 02F061F7C6CE297F182ED0E20B4843119A49DC6544A262 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 550AB3B50B9681052BDF0338F49E70F4D880E23A6DB243 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B5D250415944921524947B25FBA55021DC9074A152029A + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6C1888AAD7692D0428EA274E2E2323DFC542EEC226C87E + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7D0299BC05DE1E95043159A2C4F096BB57A4D9F47F4C98 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = ECE57CF6FB450738F4626CA4DEEBE9B5A3D36AAFBA5AFA + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 33608181DDAB8BCF98F59CB2A0C0C523DC764F324903EB + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D7A7680C502C333BD098606D7B6107E3515016F75911BF + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B8AE7D28C3D75D7368BF4A6967F02735D52475FD45B6F5 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 93FAC4464EC4311B7B4D4E1F385FE0C92455D5ADC629A5 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2603C566FC9D73FECED712177D41A1AE406D1D88B8ED61 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = CD9C0894C35C88DE7E8ECC60676E850DFCDAC1F2CF3D96 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 58864F943B21F56B464E8991D643DC10AD30527F39FD77 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6F0F23D86D7486CAACD5C09BAAE52D998A2711461E7A07 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 472BFC4D5B80822B46BA4013B9B11E198FDDA64CCA957A + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5E84C1A8771E0BB028300BF208F8764820EF5368FC6D2B + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = +CT = B055EF77BBE7DB2CAAD152ED1B947D22B199902BA129E44C + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 00 +CT = 55746D69D31CE342F9E10383E732A0D9E900831B56E58B8E + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 0001 +CT = DBD0CBF0302443F9FC5C32F3911191EE28561F04D2EC65C6 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102 +CT = 46F5584322823DB63F942DDEB76A3CCE3A16A0AF62C675ED + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 00010203 +CT = 65028FF82769E836DAD4EDA6DCDFC7592934DDBEF06DA169 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 0001020304 +CT = 4F0B15DB7769CECD43DBAA324D3440FC0B98483D44BC396A + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405 +CT = 4481818336601B08D38037FDC643283950B2788C0578FC7D + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 00010203040506 +CT = F72992C06519831C13D2E4F0F53941A00D9561BAEAAA0DE2 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 0001020304050607 +CT = 867A7AB4D1C55F5AA1D7F7BCB15673697748D8FCE3F11667 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708 +CT = 97792FF815F8D4EF43E089E529F78940C228370292F40BBC + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 4C2A442817FD54D6358B19E17D0EAE20ADECF6E141D2F3EA + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A +CT = AE0F54A5AFD0836AD1E2BF0BF3BD1A5DCCAA15CB5E79B7A0 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 85CFD0690002954799D76A8FCCEA15DABE11AA4713CBEB3D + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 3EA0CAED6E4C88C80FA2EC7AF3C02B9D6DBDE79C78D51BFF + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = EBFE915EF8EACD15BED6A880BABB783D198A7D6A709C1403 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = C3729846F306AF738FBA4EE9BD544A318D12AA4D156D2E3C + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 4C95D4AF066CF8834A44BDCA1FB6165DC6E7EEC05252064E + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3E14B49AE49A2B4CFCD39A1DBB6E0B0890BC5B936B060B9A + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 28EEC9D641B88571597549B08F2EFAD2EEE31E67D60FC699 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E7F2479AAE6DFFB9A7001DC3E6DD33B7C26FC4D612F81714 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2FAF1896A6A2159B4F02EC66D715D8143E3135D9FDD9E1F8 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B818B07AE16909CC50BFD5C56CE210467076779F3918A4B1 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CB4C54267F3C6712D4B33F787FA0401056AC9D741F98A4E6 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8B8BF0B16B1398F0394C3D3ED208DBA27D2BEAF1C8231E34 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 26B04F41F1C4FB6F17812D226708BFCEBCD7DF1E8D2C212A + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 24A625AACD7937C19DB88643FAFCA4A2E866CB460B352CC0 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 790203C65DB09A718DAEAD881ABD9098F12909EA60D9B6D4 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BE0DA3C722114D4F6F9E8913B53CF5D14A0266810D2FBCF8 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BCA11719A273B262F387EDBB7EC4A37B3DFBF99C81D5BFCF + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = F890CB56AC2AF5B584B49929B7214FFEA4B082478BCB7900 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C7293C318480E544C16320D60CA69218537DF0115F2AD85A + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B660BCCAE329F4901EE021AD0329A6C4DDCF7D6A7270AAF5 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 23644CDF0C5791A8E405EB8B9BB9E3E771373AC3335FB93B + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = +CT = 52E5A65A124F84CC358B9186A7E8893BDCD3588B2AA7AA5479 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 00 +CT = DF22AB02F11EBA1DAEAD4EF631419A3D7ADD249520F9F5933B + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 0001 +CT = CA64D3CAFEB1440D7B62F3ED2EE1ECED98B183EF85D614F6C6 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102 +CT = 55959446B9426393ED2299F54FD051F89568E251D715760154 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 00010203 +CT = 06DE24D6EE22DB3352984209F9AF646DFC12712B553B4E89B6 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 0001020304 +CT = 865690C75BE7D9E3B16B75CB688302B1A94C16E2ECF9BCE09E + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405 +CT = EE1B08EAE63B503847243821FBC70660CB38DE060D8F836051 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 00010203040506 +CT = 4026796BAA67209261A8D4E7ABEE28F8AA3B73AF62EB157D36 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 0001020304050607 +CT = 27AC747CE57D2B241BE3FE9DD8AF6544F6632BCA6C50A7CF51 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708 +CT = 2B41FCDD66BF7603355FD785354C29656CE2487DB8480DBE8D + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 8CCC087F7E2EA2B08B23695751737C322EEA378BC1C0C4E71A + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A +CT = CD0FB38CE46E073EC1117C55579BF9349D01BEA7D74B66BCB4 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 56F5332B835A536764C1D6E3C6FECDFE7B5599C6D4DB04C36D + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = B8EBA6BED3F38747DD16782D39422892B2D53056980694EE95 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 06CB835370582C46DE612EEB9E75E792D5AD8147F7C87DC853 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = DEFBE9E014F4EA1F77736A3B347454BB437E3B1F5E2BC40BE5 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 02300424C0F65458F08E82424333281ABF06B92F8A496A7A43 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D29F1A2A154DA2360B10D4B840FC625AD7BD838645397970F9 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = BE9DE5263B4F6E2606BB6966F80C1FE07BE2EC30EADABB96F2 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A2682C077643DF989D40F0E69580819D9AA6AE68504E735DC7 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 11AC5F896F099DFD894A3E830D87C1807E868C0130B9AF68BD + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9CD3B4807DDC3ECF065770BC0B0BA92DBB323DEF102CD13706 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 86E7BE28931FEB158CA63D578791591AEB67D34A82F5992C16 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 16463759483476245525635F25D92A6A416C6C7BD9BB06A403 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7AF9AF625EAD564082667C714BED16A2FAFBB3E7E9F93F1F5B + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 710B4B91F696A91BD6D409637938C85A208780281ADB500CC7 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5DC26C74A48D63FCE3328E39A69DAC103DA4FD701D820F85EA + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C167EDA706C4D3195BE0090596F647FB70502405A92CF84625 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = C6AE1C7A6EADEC09FC52DBDE742A404E7ED59FEACB9400BE48 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 88C44407C879706E59B46EE1C1434C6CCDC2B82EE1B2158F30 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1859F9326DF7BE549D26855A841CEB5E4108ECFFDEAD90ACE0 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6CF6813A09AC9333996D390291214C5BE66C2185AA75AB80DE + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E301AD1837383AD0EF2DA36F0EB47B226357AE7DF0420374AA + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = +CT = 549C9352148022CEDDF4BAD87CBC140B49A21848C070CFBF846C + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 00 +CT = DF7388B7C179DA3D22E43662A30BBE723EF19D7E16BF13E5907B + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 0001 +CT = 3F6EAD4A906CB81BAC94B524588080BBEEB47D3E988363051622 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102 +CT = C034CC9AC6CE8FF7A5D1FAB749A05BF3C0D2F02DCA3873ECE23D + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 00010203 +CT = FEF5AD77AE86040B0C1B61816B44F07B3B1700640FA19E7EBFC3 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 0001020304 +CT = 651D84E3C978D814388ED9DE72705CB6F298B9485C9FD6D620DC + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405 +CT = 6EEA31A966A9A5A74EA28E6742FED1ADF930A52C186551109C79 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 00010203040506 +CT = 39E694A18B9F3A58716AF8A94040770779D355A06A47DF589330 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 2E20D564AA0D8F10EF356F60F6BEB5904E6710A5BD6B82938E1F + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708 +CT = ADAC5883975C30511948E7A72B5CC56501314CA9F08F1D148709 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = FE455A16F8DD47BF28A5ADF1E6304BC360DACA7D7C2D040B93C6 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 4338DCB059E9066562CCA9EBBD664F99B7371B9EC13797DFB011 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = DD432C33B192F363915492876CA1B1C3B68B50E69025FA27F071 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = A7388B3969626E0E39165043F2057F56DBB7276931F0DA149568 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = F5F4E2ACFB4CCC7DE0DA695A32D9A3A7AD88686EB8B678C26E3B + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 9648EF88BBD12056A4D79BFAD58E5A4F0655B81CBEAE463CDE05 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7EA166D90222290B2AB7920AA508A1619847BA6D003802171AE4 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5039C0DDCA844ED6083CFC35FDBFF36E5DCB98EDDA2BD49148B8 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C78CDC68246FFD74E27D83E0573D6EBD880095DF2F127CBECDAF + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = AF9AF6F134D2EE31CC80BDA57A76C8248DE28819760A9B398FFF + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 083121FEAE252BA47C258614E826A19FCA24BAF6766957FF989C + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 151AA3B2C8EC587EF6A414D07045FBC28C09801A43DE188A6598 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A0AFC655B741B8AACCB9CA261BDEC2DA51544A01FE24E11931E1 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D300200C2E0FAEB1EA997ED433772F4963868A8E47FBFAE32B3A + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 64E7627C9BF85DB87DC43F5B14522C5CA7694E2B56654FD91A09 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C4BDD15654D02ED030DC6187F9EAF1771D26C5383FD3947ABFDA + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 545B3115532C0C72B673EA97143E0747CFAC628EAAD4773F9F1A + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BC9D0A93B689CA502D539EA258B624D9C2250BDFA89EFC8F0184 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B24EE7B97BAAD2ECADFCC0D9302F597E1D6D031E0CC3E615957A + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4BE864A4380171AA1C2C615D83E32715CCBE9003986C97171CA7 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1B37AD7D34320C3097518819335594D9B2B914ACA931CE5F8F60 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46C11113A1174A9922A2C2D5773B685353B9AC2027E65345A0EE + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F63D5D4924C023B8617DA0459C9385E7DABB045C6D6BE74AAEEC + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = +CT = 35FC6027021DB701394CFDD82A2B67201B17C2693738922ED1C2CE + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 00 +CT = 68A63C647C4E3A5176200A3EAE775226D9C1AFEDFC9C30357E5C71 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 0001 +CT = D00303E57BF658E2FF2DDC2A8DA1715E38C18972C7F819A0D87002 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102 +CT = 7E9BBF16045F04A391EC3985D4394D90A33E9FDF6F7FBBC3E5C6D6 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 00010203 +CT = 2EDD982F1FA334580F8E850F061E746852A59E2D91629796C94061 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 0001020304 +CT = 739B7BABA15E221C8481E832165F7CAE8B629D5958B928697BEFE9 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405 +CT = B4A202F1F690CF77EFBBB1DDFB0ACD3E34D67C6712754E243305E1 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 00010203040506 +CT = 21A2D58CDB0C1828B69350A2B9C9D82D42234C9B51A9956C477AC5 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 0001020304050607 +CT = DD9D1242BE70300B8F438E6BE242F5C4F64FDA3593A39DFD002DE5 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708 +CT = B8D0827A29D5A3FB8544E417609F0AE4CB3F5772E1D89AB01400DB + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 33840F770965AF999B08FB74EBB058BB982846C13E8DC2DF8EA825 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = CF6D644102248A48846CF20022749268DC7ED81DFB588D1AAD7924 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 7F50A824DFCC07F1CDFD30CA29C6CD63C87F075241FFCDD00642CA + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 6B85F3828B192B55FE21A28A404BB84FCACC2284D0F7DFC9C67F13 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = E7D03368E2F25B5C9006DED2B1D6B395CB6509920674673A65BB95 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 2B3741896BF5AD764D1998E9DA20EF79B0585AE801BB1EACD93CB1 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = B8918DA0B370401DDC840C8DF0B6B0F83C29E01D72F45388DE0567 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9AE09BB5415086C541211EEC96BD15D045338F6959081685843CE8 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CF486814F7D1FB6E0BB74B18C70F53684476DEA6E1FCBD03EBB049 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5F32493697CBEB0D074F35E3450264CD330E4F7E506908A81ACCC1 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 36EBE08364CF9327BD2DAA163D2300E7435194A9F6BFB91FB0BE08 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5788F811C92042D1B639E6B8B66293FC20D7620CC02BF7197CCADC + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 196946E32373CA520CDDC36BA5FF7BCAF40A0F30049A9A7282FA6D + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F8D322E0DCAB7B6CF25E5B9B39BC7AFBF470A0E453B84D2844B676 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B57050A0BD6EC8A3B2025F5CCA4EFCA3B330E183AFAFAECE860A14 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FC2625665693B86CEC47B6484CA8BB9EDD787EADD6286A9B8F190B + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 6FE134FBA45EC228FB1F705FCDEDC6E83D13FFE17A21A4DFA56E7D + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1F9392560F77F1DABBCC6FCF6FB962CE721F5008BC45ED5AFA46EF + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 92CE51D5A349AA339A879B5260FF702837FE57980DF53D78934EFD + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4DC5B814B50F3B628C6845AF22D252E13072641B5F6F190F594FE6 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E940259DF60AB3C5CC34C818A570F5FA8B093D79C5D369D6A6D0F3 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 694B1BC359D262FC58A7C02C2CC9EA79326B98AA5BECE6CD803FED + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 81291197B1671AECC7C8FAEA1D603CD6245B4F01D75BF099B7C685 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = +CT = 710C81EAEFC2794921F791543C02CEF44655BCAA08349CD7FBC500C0 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 00 +CT = 97455A31A07628DBA6A8712A8C36E32DAAE2C58D57783A5FF85B9AC1 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 0001 +CT = 9385C1BF410FB9CCF89120035C199FB60055F1906321CA7847CAC860 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102 +CT = B5E389A19A5AAB16F696B6FB988A1353FD8374806E239C0587183166 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 00010203 +CT = CA9A1F651CE535D5BC49F43C310B8AF874A55F9BCF308CFB93FA449A + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 35F53479B700FF85F54E5733AA8D33D2E89695635D047454F0CE7FDB + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 21B52F4D32A22130C26491BC8E0143F22D522AA68783CADA06A7B35F + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = C4DF30488AA5C2F6D7D89004561CBD084353F26FBD992BCEB85EE8EC + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = BE443348A731EF806D90FA749E13454D564698D3A6509EA0269B79C2 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = A24252291C7E77F8A871273A625A0A0BC05ED90A5A0A21537D66D155 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = FDB95CB22311C6CA62B3D00857933858AFEF1DD9BDF825A30C5D6E80 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = D4ECADCBF86844BD3073FA68B00E98AC95991382540EFD0BBF5B9182 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 003C4ECAF96B124C3E1819AA92A140B8D4AEDFF8136DABF5E48C66DB + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 9AF94D093F74130BD0983CC3421C310A40C3EDE836F2C6688D4C0F4E + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 7CA37C9FCFFF4E6566274F96A6CCEFF1CB84D85970EFAC6A14BB10DC + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = DF34B05E2D82181F45F1149A64130F2F4FA46560132CDBCC10313D3F + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 19E7A98518081CDB0C2E2A8EF7FD468DC524D70BB927A32730DCC171 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D49830024627895F241E35BAF790F4E0FF2BA99F36850FDF65A24784 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2B7C507C35733F609F2ADFC0C1E26EE929835BFA17EE73A061E2286E + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 078072DD69E0B0B7E8CD698D3FA3326423B34834CFDD298D0FBA3595 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 32DBD6FDDC516CEADDFF1740E99F475700C7B8F5376249B892D5BE35 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 85BA943A30DC35AC8180B59B4048EC667567130D7DA6A29BABDFBC58 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F544DCD9C22B72CB5EBF758270FE922DB3ABC739666B54980C414EB8 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6B413B17B13CE4876CA4E9B888F3393C85DABADCEAB21BD036120D09 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0718A51545129CE11AF01A5B20287918E25B1C6695D6FFB321C27B9B + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 209150EFD1DDC454C36EE2BA686CD063AED4CFD8113780254B2244D5 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 35E4D6ACBB154DAC6C8AE09897E2CF494D2A26034C2B84B6B51DFFEF + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5A4B4BDABC66B0A2956B3B35AD54B07116DB0D70C5642BCF65E742CC + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 211FE5CC3E97A54ECB909BDE4501052CB06726EE58DE575D35FC1090 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 784A9933976B0B744281F3C2B524EF3285B888EF23DE023DF01D9F11 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = FF1228A98B0F7CAE80B877CE0A121C0312DB7367A3961D6D3F2C0A48 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 00F1699E173C680246D2459D17B2C4634B5837EF16C8F1E0DC1F3336 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 1C7D322993BC9353ABA2F20B9088FA4B4FDB8D849C276E507B75BF41 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = +CT = 90750B6892625EF851205E0BF7C241E8FD412AF50F7D13AC33A20C8FED + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 00 +CT = BB654F9C761F423896F006199DDF0408FC237D0754DF242E272A5F1164 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 0001 +CT = CBEC1A2B99A0977AE3233BCA0D8CA52D42C39D7698C6514369F0C872F9 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102 +CT = CF3095B7352958B4FD23ACD1F61F2AAC049A2229A83225E29A762B393F + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 6D405261567D2BFB01803954670FEA7831B66446257C6EC71FD1FB2DCF + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 075E3ABA6B0894BDD398752DD84D136EDDCC741582AD35698CE114997B + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = C9F656940CEEC532AB8434B2B8CA030DC4FBF891D70AEDDF009B2777DA + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = D92693BFEFCDDBF483B7E33C598BBFDC3B7AEF9C8B3DD222FD6AE59B5E + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 32590512BF51FCB44EBF75AB71B2E33A9FA6EED07C0A34BF7396C93235 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = C26FED8FB4139D35D8BBB7E3B13FAB5B19610F55FD936D4408FE0F15C1 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 6BE53FA48263E7663B66B490E23DED2D0F8D7DFFE7391CD5EC261A1D8A + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = C95F48869E616DD5238943FB13A23F70C044681BD5E1E677628A0F87B4 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = D44A59DE89FB2817F8B6022F348C18C2DDD937263CF540864C1C8A2D11 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = F12EB2DF70B31D1932C361F873861988D6789BDE07C6FDBC686BCC43BC + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 529173F56C8E7EE7C2CA2B1B64780378D2862E5FA80593FF25D42D50E4 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = 8E7754F5AA0D0E37825233E1BE8DFA666D9AE7907703142AF2BC2F753D + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 6D3C5CA2ED8EB555C4F99E0427A95435CFAA01AC4D6B9F7268D18B5EE1 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A48BF53FBC343B9FAF405C06F07DBE35C198E85DDF777E84AA8C0BA29F + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C639158FF11F2DC0624AA30AF4763DDEC5DB436090C702D5E5118CF65D + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9D0014FD183D6687EF5FF3DEA613BDEB8B8686CB213C568F7F1CB44FF7 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7CCFF0ABFC54EA408290767C82C94A01468F0EA840DB3A92E6FF6660A9 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F1622935C9EE9C25492CEF9AACEAD5EA2068348877D28E9904E68470EE + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 74DC7AB2B8115BBD28AA761CDE06F6D976F05D8F8867CECC11B5E832E9 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = EC859B554B7C7D53751F0E809AA69BFB09D4CF26F8317D0F42FA24B70F + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 43CD2168BBEBBA21E4FF49C25DAE74223240DC3BF8883389BD4898F729 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = AAED57CF635F135636905EF7AE84C17A0062D1919AAA12DBFDCD3BB064 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9C737BDF9ACC7445C52B2532F9AA62AECBD41FC7C38689F38EB239BEC1 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DBDBF5002BC52AA396F30DC0C395578EF3FE6FF4CE4126F802A373C769 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = CC0B9355A25437B949BB394D404E7F82A0D43887AABC729DD5E95D83C4 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 430817223B3753392434F1F4EF48071B859775720F6AC7FC3C7915DCAF + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A9625E0455296B4998E5DDDDEE0C545DC8B81980BDFFB53EADE23FC957 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 194C2E12C916D1929B8F9AD1EFB87756787942F1F5A57C907074EDA07E + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3A34CF1714BBC1DC3D4BF3CD90C0F003F987013F191963047983772B15 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = +CT = BC6ECE05EC221EED37DECD3B3DF234DD146F4EF047857A6C44BECEFA201E + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 3322100F12E37BDEF5EE9E0E49D376B5E494E8EFABB4747E0408B3381CF6 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = E28557E70FC0DAA163A89E21BB4000C5DB3CF25D7A01AB104D7C082A7732 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 4C9CB1559C0BE301B3ED3F1A790D652C2E3E45D817D74EE5E7C6192B53D7 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 8981FAD53A9C916200119A5FB82CEF425C9D122EBA792B3B1C677DC63301 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = A7845E76B97294529FE364E9FA82B440B9449BBD4820E2E6E3EDFCF52279 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 51AF7E8339E7554523CFADBEF038BED05465002776BB2AAFC4718FE2BE3A + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = BB3CB72A1C484F116784D181675214BC2835CE56C1104F9011DFBD03C070 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = C096FEAD7F7FE1E7E39B8D8F2AB4E309AA8FE11953CE25A9D42B499DE6AE + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 8B1317E6835ED42CA4DFF3E6984B678D118DCE2AF241AE4F0723780FEE62 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 684F15E2A34F0B4B02626DFD059EBF6C989A3E6A62D8E23F305FBE67135D + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 5D6B397DF2FC4E3572FC473421C65A7DF88133314B5AC03BD6654A032A14 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = AF75A493942305935D3EE0727ADF142B76DDF5DC2E9F94082C3F2C883975 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = DBC62530FED70B01DDBD54AF8DAEDC106DF39EF1810679470D4D03D138D5 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 36082FC563D034433EC5350A0E9077329400DE4E7775DB371FB2E4CD8F24 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = FC81F4DFCCA9278F300788C4093CB8DA3A45341A45511BAF01421983CA48 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 72A9AB6156A2C44B5FDFDD8980E191B63C7524054E51F5F89310B54B9470 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 2CA1326712A392793B60F3C0CE274F6AD3A795C764A0144884A4B60AF796 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A9F45B697EDAB559E6A8D1091A0E2DE0D13B3CA89BB113FA2649192385D8 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 17171CB4313884FC246668197FCDAE33FCC03B274739452E7CFC9A33247B + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 97276087EA5C1F7334D7A72EBF53AC097B61930DD62DB54650E38E6946B5 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = AC026443D20136B484404AA581E63D058ABC3AC0A893889E3106DF472504 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C88CCBE42CF2B88C9C99BD537558EB0BBF710BC02C1221BFE2FED17263A8 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 01E21A21A875F2B7B138243538F3FC00119F3A462CD9B8B0C520021C5922 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9A87032E7DF62A5FC9645FA97EE0CA46634F9760712434D2BFCECFF6BAAD + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F6AC6C5B941095680D7B735B3457EB27A56823AF0B03E2C195D1BDED6548 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D43E6ED537BFF0D188F6E92772A55127134BC5619394B348D39E33F3035 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D186B4B679BACA868E79760E9DF7D3AEE2D0E7D50799B3BA60455E55B273 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 27F2DC0A22AA53390C1021100B7BDECB5C5E0446A1246DDF3FF27D0A0C5F + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D1D8B7329A93FAD776C29E1E0A42B76AB60983913625B7A450938436266C + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 06E9B3080A24F5807E8DF4A9C46B6F15BCECD0A10F1F4320B0E6AA7290F5 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 93D9594250652332B4D68892D0C26F6149815B6F40DA546052DB3692F60D + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CA441FAE25646CA686776754FFCB65D2BB65366CD6D4D7462005624AC659 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = +CT = B805B13AFF15D9AD692EFC87B8D174FF99FFA8FABFBC82A71AA0B9E046D92D + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = B2F77530F4B65C6FC299C02CFE78E2085A6625CAE90BDE252873D978D4EACE + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 2E9E1A49F2BA9419E2916181237ACA1D22E16A3E232AB1F41C6525CC7FB9C1 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = B5D66F595A0AEFA0E6F8DC3CE16165D0DB5FB83E0B0E68A3AE8DCB4D9E716B + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = C32AD7098272CACE273511780D16697691B305CFCFDADBF66A3A60E1555515 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 0A8203B76F1A9EEF5DAB7105E9E381EBB82C9C725D2C083D398986A90FBE92 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 6C6B4FB6F8CDA530849CC979D5501245AB0B0417DAFA73F1B5191AD23797FE + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 590204FB78F60BDF86C7128D7F40509FD48200DB3B3A6A85C6F046FE84CCD6 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = E769D6EA4E166F530EE2314714148DC5AE768FC1A45340CAC0773EC44CD4B5 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = D220DCAA5D4FC01456116E9CD9B609290492BF81C25EF3463C10D027DFD303 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = F27D18BB8EEF9C2132636BB0F6F89713D3D0187D771F07ECBE789CD9EE0247 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = A7DF3F2C87A4CB45B0941786F8CE8BED366C975D31AB7C2DC08107D6B7BCB2 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = FC00B0632CDBE9A7760D3DEEA123DEA4492859E52F4861FB2A3C71831B5160 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 1036FE4919900C1AF6ECACF63E8AEF91C18BC8E7867B01EDF125FAFE681962 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 7474CCC0FB463328C0CA8BB066D41EF0E33A582E5DD6E42970C6740D0991F2 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = FE30C984D7B441C6407C128A23EF18C8EECC405AD4F573714C2E1F1873159B + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 647AF9D541E46B49A4B78ACC56E3FE9ECB1F61623937E817A4B06AA60E2F7F + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4721E15218081698DD26207B9FB6B91ED5E0510F1F63E4160D844E5C1BF555 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 406A329A549CF54EFC7386972AC62DAC3C5BEE337E313A141B25BF9A9C384A + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 960C56462E0B5FA07CBBF92915573A07DAF8D912A0F03DDDA28D831599DBAB + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 55C3C4BDB61AB5162F73F99C4E20A97545070F5DF589A8CBC745CCF164334D + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7674A7CF9ADE593D0DE5259A4B19922B455111E622DAC3A1A3B31156CD4CCC + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 298D73298252BB3B90DAEC4602920EE503E6B10976E6A6FB091A6A9D02EF4C + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 43C6A5A5E690C7748114B053EC0D1946736EE8B77A9756206FB14476EE214B + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 94C57ED92E5315D0FD679BB70F44E3253EC43A4B749608858FB8189CF9CE5D + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D878524E092FFC7D7FC9AFC70F15D02D3BAD3972D9ED8559E77727D011999F + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D5ED027BAA8866985811BEF0B543F8B336570DCB47E0786CA1CADF95F2B8BC + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 480F5A12BDFE026D5FB5482C7DA6B6FB4998811D4640D0B5851CF350DF55D4 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = CF4616963D328AE89384B564473B1FF3AD4DEAF030AE8E564D35407A02DC53 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 78A6F897268C551C4533E5A90C6760B28260072CDDBABF835671CC2C2990D5 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 04CD20EFC396CFA95BDB3F667AE002891F51D869482025335B1DC9D5895401 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4DD457F11C9BD0BD04F1C07022F393267FCE61DC7987CDDF8C41D04C07A90A + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F6A8B25310C2F6567D2B747AEB34A73BD066722D10A7A4426D6A3D804698C2 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 1969B711FAA9AA531B2FC15E26B09F417458D0E3E39CE442E087315A4B4274DA + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 0C4E9DFFAE8C9BD206BB9B28BF6F75A996B9CB0760CCB8030F6EE81A299B0881 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 55B9F646E5501CEC8ECEB9C0C352D3243169B908ECC7EF92BD83214A98076C5E + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = F619CFEAA62A7B73717F62CDF807D328651342C52BF71FAC3D221FAD9B478C2A + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 1B7EE7CE0715434C9EF6EE70C9EA785E66C648079550D0CA3D641457C9C9D160 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = B79780D690A382A9D1D55EBD7B624F0E492FE3E96AD2E159F81883DE7849C65A + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 6350F7A015F2F77D5DB036D4B05A4B527CF49440BD74690F819ACAD3CE688D32 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = C29749E13DEED56D97961B7D795BCFFA37361A2A10B9A60BED228A2A3F862198 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = F3D3C74AD833B356C8F2F6245E43A75F87177422DC45E960C82DE2B8121C0ED5 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 61C1789E3EC8424A3EF0FCBFAB3ACCBB2465480BAE5A5120E85F6BA91029752D + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 33C9693EB51FE89151C8327CB9D80DEEB49CFD931B8CD302BDCEED3F243A7226 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = E44D1A9650B144D38FFDDB397F69F84EC62B2A4532914FF520B5DEB4559588F5 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 484DCE9DC54C871BBAF08971D0C8F2A8F8D6CB0360F38FAE6E446ECA1548D294 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 0E28689814AE026E8D97BB6E23B385AC67D3C491D11C24CDD7D069E2AD27E69C + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = AC77778EAB94796624D37AC90D0C944D47F1A47CAEFEAA7F69B6B56D1E38971F + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = DA0AFC31F6142E108C9FD5DDD205E141A42A58834C401E2C65A2843119E7413C + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = A07417BA981A4F6DFB790C546112AEA241E3C08E5708657550E8D78BE11B4E02 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 08FC150E1EE99B27C231F87FF8FB672880FE78AE1C204690B8731F385DCDEA79 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 269C06FA52CEDFE798468852DF31229BF4003C13068B569C8B43A8D6C9106D90 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 91F76B51DBD93259B00F2594F99EF80948C51E5F37DBD24ED73AEE46D6A9717D + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3D1C80EC594395C0414B2B3A12A0F9656D9501F31790DEAE443C1D61DD90FCF3 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = DC13C339BBAB7BD1B66FF1860CCBED9CE5FF5A7E9079F999E31EEF0C0A82D6E1 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 0E2D470512E22BCDB9FA8FE938341D706DAC872C839C4B7F670B65E13378B024 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5B131CB1C681014F1B9D23D86BA35083AF2E3ABF59FD9C005205F4A4E655FA7D + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9403BA0186A47E847B647E591B134ED2D4260ABDD3FC7040127B82B56395CB7C + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 17952EB8263DA842F6C57AC888B6C8A55705C4F016EA0FA515B65455667ED853 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E6599026CD0867FE36D50899D373B22431B7FC204EEC570D3DE7097498835C21 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9E7FEED2AF6FFD8DFD89DBC1FAFA367F4FF5BACC2D8BBFE069B2EE2C63298D4B + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B718B6FD95C03606BF5C28DE602881B36754A7B22C3E748C088282B1E9CDD871 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 278678BFAF8162303EAB20946F2F2DB040970A1C6567457261A1F9E588CE8407 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C8572A8BBC2E348D791D44BC2F3AF45CB67F39D7CBDB41D0B7CE8FC547426D97 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CF7B5995D6FC285688F06174EAB4A4C380F878AFA7AF44D9B7163C2062AD3C5B + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5520D409AFDAEFBA9669F8236E5C991F2027759220B0244698CFCBCC10614C41 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 2D7ABD964725434B17D45C6E73ED881E1013E7801DFCCAB5C8682225A646BB6AF6 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 832BBE8270E4B9465050DEDE854C2778BDCA68DFE93D899367947478D22D4021D3 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 4BCDCE16C94FFE4F7EBEC861D0AA7F1FC9157C6A5A76C85C15FC8B4B85E298D2EB + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 5CAB40C9A8C8F55AF407227ECD42EA7E78AD2FFDEF6F30FACBB6F442F6C1E6877F + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 916452BE95AE3D50DF6922C3066F93D338F559C8C1B5FC42D4434142815DC2045B + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = E092AEBE20AA7A48A820C79CCAB7B06E2607066155A6045B040D45832E900A4863 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 9327D4730BDBD8453BA464B5600605F3EA7DE8991EB91094FEB885DF5EDEF62C6F + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 896E2A859982AAE5DF7313245C49BE48B6884BB20DC0373CC2DBB4023E63D8F24E + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 4EF5EB221747A52F20B54A960D5F59B2D10933B3EA808434FC75BEA94E18A0C3B1 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 60891105C72C35467B41CF167168F11BBDA02E1852342DD7236A9632C4DF47EFA8 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 28ED6DECB3B8AF7CAD39518FBCACF669BAF4BC04C6C116BBAF41F6DAC3B645148F + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = BBADF17265148DAA63C10390C4489E4B57B6ECBBE25EAFDA14F32C96C10B06150C + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = A25FEEAEE7106E7C925F4582C89B28FE0CC0131B967B9C3E560CE254090A05D752 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 3ADBED795D47F0E228BD81F34A07DA643A6BF7AF33148914C327D07D68642E598B + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = AB7FC416104A020A9CE982DE896504800F2AA2460B0FA8F60072A446604738C29A + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 61BD69A96100FC4376A17302B7470751F2CD434F329CD64DB59529B009C033EFD0 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 67D435958F96F3A675D8D78F30307BEF9CF1F3A072FEA6693304EF8AE38684622E + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DF08CD236B6A3E38E0F286A8CDD20B8D21F39450FAFB2F166180CA69B942C281AB + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E424C134C10B4AAD52795F2D6BA1FFCDFA0ABF7648919B3B63D7D96609A854C38D + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B6B15719DED9B32D4D4B19322E1F63DA0003970BA223F14C35790B002A2D827196 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 148AB4EA86AD68E29CBBFEDE44EA75A1B8953EEB989055F90C5554BEBCF8C6DA8E + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 14E7D22DA73830BD970E02F9BB7EEDD7B2A991AC90158CBE84BDEFEC4C4B1F2560 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7418077C9C1D56F6AE1C1A8DAA3F530FCB941E116B37D9E9EBBB2F6C345DC782E1 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7CC91209140D376E5917060550041997B115FD36C3FC71177AF3C18AA716DDD3BA + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A938552DD112238CFE43C02FC0CBBEF2944331423AA72842558C99CCDB50A116D5 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 27A8239FD95CD7D8C855C686CD7B92CDF1940AEF943A89A6E36135115CC6014E58 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 657D3C8CBF42D0D1A109336A320864C0529CEDB80741ABB15DCAE5303B91F48E45 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A216BAFF34C3B9A5D07F01B54444B14B8FD875E6072ED50BCE3FC5551D270680E6 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 793C29F936B28BB9AF487AB855DECAAFDDDDF8580EF2EEC8B32B734E4DF06A7AB3 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = AE6C51ED55110D232BD4722CD2D9E804CF67ECA5BCF7FC4F21AF39F8C6FECD0EED + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B6838ACFF26FDF2A4BEC9E467B205675D79E182E4779032F243AF975024F1C49E7 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0C2DB33555289F1D87CA273BB0164B2296E53489C8345E3F37F08624C8E4168CC0 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A8C0C787C96B7B496926F85D498D9D0F8C9D996AC721F590A9EAA239CEC9F91549 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = D229C13B9DF95ABAC82D1F9A533E6099D4B637E30581B3F186C72920B8FE6B54AF69 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 53F7616906075F44050C8A32F3E2C47887A5973615689DBA29F2EAC9B390011C87A1 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 2A52ED379A6CB1A2909F2956A65949A0555BF79EC0C5A300BF0B7F7A7DC8F0F092EE + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 45925A20CF183B603FD248AE7115A10FBDE53E8449AF0D7C55E810FD790797607206 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = C0F1F47B548D85D3155675D327698454CD132F136E539AB81B8C5919CA9DD32DDF7B + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 0AC2751E003EA13285E7E39721A11D04DD31365E50DA7D19B71ABC6A9FECEF94AD81 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 7F83EA7802B594A0FDC0CFA5CAC1B9FF71E6E9EA244B693E3D9305A4048F6FAF919F + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 3616E9F07B2943550CDD6F06D9DE3EAE002ABC4F0107EE78F1A6DF1936CF4E4A3CDA + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = FAF9A5293D8D27AB736579F528CB50A98B5010CF04A8ECF0979E9F5101F0039BDFE3 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 53A633B72850C110B1F8E39D75E009801F0276E87AE2E0A1300915EE34128C071610 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = D7D117C8B98737B761DCCE1FA5E0753C0114813A25E282D9814748741ADE29E49B41 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = F9F1193A95BD5A504AE2D394E073EC955B8D1D5A2FBEB2D8F005A546FB085D2EFE10 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 47D5528E657265E5E2411C1738EFB552661C5A1EE08692DB23DE9A77AD1E93567543 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = DB3BC8B991A356513FA2268DB046AE1C2BA99A991336829F3441D3AE3C0648051079 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = E1537581BDB3B49ABF7962AF463E59B1CF73A25B8B9998643EC80D4037E0F9D5FEF9 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 44A6215409C6E28722AAE616B492E58D3D94DA86BFBF8DB00200BEFCC634D5C14F96 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 1AAF1FF2FF1EAE73BE30F86DB5101117CC47AAA8A7CDFB0E556503B734D932ED0C56 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 47986237E8BE078EB773B9A69622C389F3973337CE640415C3E8D6D47D1A5FDAA9AC + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6537912B6578246E14B49482BFF15DF3BD09192490DA49A8764EB939A71DE7CFDFEC + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5121B3FD41C30A1FACB7B380F712D6ED3D2471CEDB779E161F94768D21E4CF15219C + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = FC6B9AE10A6F2F710996A265D32FAA62C272BDA002EEFB07E1591D36D61F5509A218 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F80B25CA2FE25812CFC96BAB35F546112C7BB8A046B89F9C1B3BD82141103E411FB4 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = AFA47087561D4F0DA14877709A3ED1EEE7FD1E6A6E729F8E5D4FF3FF19835539D684 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8597F3473E45ADBF3BF03D44963A3D8B28D20335B10667A108D25C67CC76CA7D0D53 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EB2960E1BA58D000933556D366907FE09AB71C7BCBCDA0CD9F70B0448FA3813D4109 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 24101C65CD5D127BAE5FFD51F417A3D22875C50186173609CB970F16487BD170C917 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E32C8A412E524F0000B000B8CA758D59E29E7B8C9212AB872B8C7449599E2D07752F + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A9CA861665FE53EBA5339A7FFD82DCAFCFC3C22A3AA58FDC12B657595B066AD48F1C + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E320A9CC0E0BAD490541A7C5E29B53CC53DED0D8A9FD13A4E339CF6B4F8C27496D03 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 93CDAE603B6103EB7099981B4B59A204555296757F977EE3A9242F7327B6D9D4818C + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8871F24A21F247170402592759DF6D0A0B2DBC4970A96BEDDCC213787ABA56611B7A + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9FB0979FEA4B48D858F6B0658972FC7E01FA3C8859F431053788474FEABD039F8665 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CD335FAD6D04D0AA19743766B57E13C9E0C69BDA5503A4158789881B94E3E5C1B5CD + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 8E89E5E0875B45F1157D6DE789B318112F808E7210A3C51458813819F984FD1C070F92 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = F6AC0C8C2C5A02AC13750A26A75EB56A1418AE578CE753162A26CBE262F888AEBA99D3 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = CB166F9523025EAAD382E1E5D394E594E47999DFB2F303D31DFC8BA45164C00CFF77AE + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 43E3A799F5F37873BA1ACB1A0BD4986D7373D4B1F2E22B11AD6A8577C41BEBC0F0262C + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 4CF9F4B84A779B532BF74EDE392BEE793255A96BBB16355720A2E41D9B9B4BE3DC5D54 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 6848BE9EDF974DD776D5D414D79C257691BB24CA7AA6D3181F6FEC8D6C7891FF9A1B79 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 14CFFD7E81FD2C17DDF3505BF3FEFB887B10C083A0DDB6758AE5636C64CDCB80BF418F + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = A4AF75E9F307E59158814B3B2FE97B499C8551A2BFFA121774A0089350BE442793EB62 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 0DF109756AADBF041F39AC606DAAD3BC2697FA67BEAB08A9CB346A176873C11731B056 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 42623B56A46FE3785F09A6ECCE01C0E1BA3357345284C00F3A3B9FB22A13AC1A721B73 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 5F83714569B2323E8D24EBF2229B4A06D2B134881A262AF8E6B61E5D5981A8F470C077 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 090204C33AD74613A00170E020878618D55EA74632FDC07CB0CEDE17BC6DC63785982B + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = 6711986EA541DE632DA03E5939A05C4B73D33D666EB6732D581FEE7296FA1CE78728A7 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 83A1EE609FA78C03225D904376877DBE4225C02F66164423321F7A787D520370CD685E + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 505E4AA11F400BF894CB8CC34F1FDC6BCFFCF4707CF78E1126832901750B594856B66F + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = BB8271466ACF3CCC08AA9B1978DB748B1CEADE939A6B496728952C7C7C2B143E53FD7A + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8156F7DA9D9D2E6871DB5E3BE4BAE5424D4A37557B4471A0086AFF607BD7005E05F50D + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 33650D5D0D17544829946ED573B25F32C8209A58F1292ED2ABF80B0B36351E71BD1805 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 17DC1DDCEEA288023A7A375D13A31C72F385C27BADDB2F41E8A0F269C76FD962B7CEEF + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3F0D3FD4F3BC51B136C408148905263B47727685EFF38E0910A189C019D344C408BB3D + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 96D25C5469C0968FE7FB2C839CC99644651645AA26F8DFF9E12CE47757F8FD0EE650BD + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EAFEAA5C4010CD8E56F87E2B3A422346E3D5FA696251419062BDCC54DA27814B0A08A4 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4A6C525EA808FB45DE2D29497CC573AC7469078AE89DF4CB69E0DFCC9FC2845FC040F8 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 22A741D5A63A1D560A507AEAAAA68F660D20C2B73ECE458B72228450C0706D2AF659C6 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 15CFB2A91C38578213630F0DE13301FB432272DEDEA13209E85020594A4B46399E2716 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5EF555A691F3CC8EAC54222D1BD04CAB0AD9166687FCED6F4FC01EF1A0DC402F5419C9 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5E2145382632A0CC7449991104F26C40A58DB9A18AAD07A525F2B8342281A93FBF6CF3 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D1B9B4C3D02F70F3EE6BF6CBD7B1B228A69EAB02D3AC1B82A2E3511702051613FFE43F + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1E7B197DB79771B0F8BF44A07948F8B3870670E3E7FCBC9FD96AE07F56E6797848B374 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 40CC440051F3A7E009BF8D776DC55EA621FF3B2A3679D356AC1F2553AC9676E46AA2AA + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 7BB6678A8174119D48A98FCEF61B28712EC1FB2F7DE285E336C1234B0E6CCCF2C70E08 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D99A6A470F48D363D96B7290890ECA5436F3DB083CFF2ADC38AE4F57274D8C07B04A2B + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D1A7B8690F60A536BE11BE6D1C2B38F275065D872BDB4CFAE1D9996098755A8ABD4F21 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 294B3BF22EC0B370E06B5C18CC349AC02C7639C06E146A9019523A831682FD88FA557107 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 02632E1F27A994F6580732645FEE4F9549046530BA9D236123800253B9EA0554BBB6A2F2 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 53C7BF09AB81C7F6C8543B15DAED161A6D0C7C100D8B3CACF26BFC5C5E00F50C59C5CEF0 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = F8EF8C5A5898471B4CE9ED3D95F49058C6BC0D8EF2D286341D6E609EA40B3D99353A1FAA + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 8CDBC9DB86E93594E7C15A3083E76DF4A0356D82C668BEE82D23AAED5FD6DA6E48490FE4 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 1F96657441B1F362B73623FCD7E59927DDC0168D001E88145ACD2E561270BD3B82EBC2A1 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 6DD2B912683878A4FE1DA61BEA280B76D3867F2FE77B3F2C7550CD44D912878ACB594245 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 0C8305FDA9A5A53712E2E0F409AF4EE4F499E843C0F9B97898F6B57638ADCB0D1D10306D + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 6FC390998D5B3B0417D7763D257AAA40D6AED5B64390A30CAD3F76DF1BC2AB65218743F8 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = CACD1B9AA85B7097A9A384ECE7380C051702D1D54A989EA767B8F426E33DCB67BAD5C307 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 6C0152D047F9F8E6CF63B392E5ACF46995783E7C9B6F7C1274888F4CD9AF655F3BB084D9 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 166CA297A6562500D494CD26D143CCEDEFBCC6DDDD9CA6EF2CD5A50CF09B548EB5A57804 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = C451D65DB0397F1504329DA7A3A2607817F674AAA3387F2E543BD76C006BAE005F4B531E + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = D85053335407FB724FD699E7080B4E6FE7CE394D148A33B228D6892D482E61545DCE2A3C + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 12135804215560F9A0E7332D4CDE7F61E3B84E8C475911AEF33F58E4F42A631E660F6B0A + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 7621E0A0DFF9455D6ADA49BC9E9228862AD7D2D621FCB9A3562C53EFC052C8ACDB35AEE6 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 689CD6A2344E943CAFE021B4B7BB686395C446BE2D84D1940F8FD4532CCB653DADF15AC2 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C105C2F4CC944D607ADF4C738F16A829FF9564A7C559A36432EE57EE82EE50B16156A371 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 14B34BBE6C61232ECFB82E544AFBAB784CE6E1734911B0B718B441C686AF6A0F18CF08A1 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 47691D448726329D7D71B7FD074536CCDFAF1BFC55F8BD2B9EC1798B6F856C8ED361C5EA + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 612A28DD83E135F2453248122AC2A71933102AA68DDB3A616CBDABACC8B6452EBE1C1DC0 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 035C6DF4DA36D98881AA87578852AEBC31EC26DA4FF8309D5B4293AF52A07E7A230E0DA1 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CD6D00D64C83D8BE0BF4165D0B231DDF066FA56CAE9FFFC40F3E733ACDF00D99C4AB9672 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 60F68274076ABD71984EBDEA4D6CAA1E68ED9F821EBDE82DC9062DFB4BE493611224DD00 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 843D471CF268C6ED954F3117B069A235F90CAC963EC1C27485F58316079AAFA2151F7C29 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 53840743D3D60F99BBB32DBC8A41CE24BAF8A81D9B4435FCFCE0BDDE31CD31AE856919C2 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D5AD636C6E63943DE449FA19378BFC470CF7BF7C89C260CD8FACBA07DD251515C2707745 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 6654B9DE3757B0D5CA5938D1B7C74E2ED8253FA6E3778B463D9D951B2286CA9DBE89CDE9 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = EEA40D0C747762E880287F0D204A611CD3523CE1A9BB2C9E5D8D8174EA9AA5C435FE6B53 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 63B8227F5802985CFFCB15DA9BA0A9CD92C4F139303EC166614F061D1F79A0A326961C51 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 380299ECEE6052803D95F468D6E765968CF6C507E49F076938F6C672D42E68E21192C2DF + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E64CEEABA556CAB6466AFD1BC0C803B8BD2EAFCDA074FFDD18660E7C0BB8FC1A100C886C + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7FFBABBF68090363B6BB8B664EFD1FBA3F1D6916D0752A706C5A94F1A04E0630F9D607C2 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = A4BBDD88D0C23BC4E6E8C762D6F7CF8C7964A65E7809A8B727000F307E21A87A752E820FD5 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = D27F4B2FE3284B94AB1596E9EDA5C67788205BCDBADEAEC0FCC1C2CDEFA9D2EB61176075A4 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = D85E992B6B8563E99ED94356790D158DEB71F5D42FDB6B926BA7030EDD0D1A66C127D92C22 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = E73B4BBE66EF21654A076FBB821FE1CAAC668DA707E9F0AF6670665DA63A4553D7D5273BC6 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = B68A2F0480DC0D1E91C3A7EC3F8112F0F4DC509F4C095C4C66552195D616475D62A6E8A3BD + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = C6A1D0E21AC06EDAEE9F31C45410E1F3419C13CB4E1600571D80F853827F296EEBE48E6BEF + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = A4E649A53FD14C1799FB9E02268CB375A3A72123FFE4B916DBA3C90A1CC2C80A62DE495CEB + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 67B9ED0B1DBA24CC3D16EECC00456F8272FA873DAB292EA71D215EBCD98343379ADCC4A136 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 93E34BA6C911CDE1F55D5B7BC255626FFAAE86F82571DA199295511CAF2C386934D257E5E6 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 2DBCC19EB827C7D3F3843417DEEF52406B3945FF952CAB473EE72121EC4E00BFC4308F6236 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 1BE3B13E65D6574212072D61170E9ACC2F06B72456F1F4F40E2426B9962F0468B826DA9FF9 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 6AE911B2268C91EE071070C3499C97A3890644E7473E95933C0CF711E482E964C0E07AFAE8 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = E7EE5CB90603F11E0B2153B0AF574B04DC8A24E91C4E3885E588DE6B3132F11F3FF780034E + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = C1E5E6A1AE1BB12B31D0369E6C163F2DFF9CE87A67017974AA0506A7CFAF01524DB7CA2C08 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = EC48BADBF3BF613FD8F088991788931C914F0BCEB53AA521EBEEDF915BB0F1FC7E0CEB0E05 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 08D425BDA3E346F1BE4D4DAF7F2070FC4A197A89AEC7FDDE92F02F4BDD7DEE7964E1DBF136 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7D4D5159E42E9182209B6FD04499A11B2C9146142D8F9F99C3752B6E6A8C19B8EC3865F5D8 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C746E6D535C7A11851AFDCC1246090718F05DEEE4D74087987AF6F8A92939A8F17ABDFE44B + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 4C79D4272C471906C79A4B957304E8F85FF9C2419CD7C3A60F2E83FF9DD9C37092D624868F + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 08F5B6695B9100B8E50DDBDC97DF802640A5D594C776A788CAF5F1CB4ECFA36B11640B5C95 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7A98A407674C4C17F06DF6D230997E739940C191F0452B11AE4EF3EB23A8BE00CE5F1781F1 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1B61B36BBACAE3C8B8B6B4F26C84E888912087FC92DF36976CD88FB15669C31CBFE0FC463B + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C41E694844ECAB982C08739507C3DEF5ABFF6C093895967CF52742ED953A591CCB6A5E661C + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C71D7235EEFA57DB3BCD9D385A725C5202A89F3524C0B6A1FDAE1301461E9390AC69240926 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B4460676B17F0ED359A6E9AC110E572A421BA13E2B493F993C8B37499FA459E011676EBB07 + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 05F5B870F626513E677014EB13000044FD908841254747C9729E6BD937D3F0707E8239D2CF + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A86CC4ED7F247715CD473F40F9B1A10CA7F5814CB98E9F4C748F9DF5516D177A038EE01C99 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4DA05CD99F31EE478210D5B2AD494922F6135AFD3F6CA695891E2C3CCE6961BC1C1891E418 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BC9C2DB0376DA8E34DDD3E4DB67E197C0E2E0807159F70AB292070452090B1D168382526A7 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 12C08E49AC7E48494985B6D4B1D2124FA8A39873873AA023C68D95854A48500987D986BB68 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E6ED7EE2C6D5BAD8A423F30DF7D48B279828A0B0C0E6A2CE65481C0EE8D85F142D42E91300 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F350092FD3E2AEDC16943EF2528122CF0AF7CE3A13BB05EDA2FB94A72CA7F8FD985E1092B2 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 88AFF0499EEAD33D3A0B059934C4F8A8CD8B91BA6361A0739A761902A0D93AE6BCFC97D39D + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 409A4C8115E7B93DFCD42247D0352CBE6521106DAD1D7404D1ADF6AA4B9331C50D0B1C280427 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = AB65CA09E1C511ABCF968FA5F28A89428B7FF1B1464B4A4D75380AD22AECBDB275BA6CCDB64F + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 6A32F3237993E0ADF465489AC1527644CD70B7F3AAB7D0244DC1E42EB9CFF2E0FF603A4ABF2E + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = BFE2BDE7350609680EDFB75086F44733E12A9738234F59525FB6D00C4807675E016A1C9DB262 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 84EF3E87E4B965B748F6DF13D7A916E050584E76A769107156936297B8FB2A6BCC40BF85E676 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = AFB0C3FE71D33BE0C2EE825142BE5737933333AACC90915C8BEDFA27B734EC857BADEE42C55F + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 25FC062BF25EFA80E11843D503A4A36F0C9C6D6007DCC57F769A6C3E4047DFF44CEBBE2A3C12 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 1DFD2AC733C6BE9E75BCE8680A74189BA4D0F413704C3D98907854D2D84405C9A757684A3509 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 7C5EE6871DF45AA11DA3970AE47CA2E689217927981454E39E2392D9D62DF38EADD9E82DF7B0 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = AFF031053B26840F29C0293154938A9F2C2035FA3CD43C0C050A88D3C86BEB4F3FB78D34D726 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = E71533FEA79120F3E3FFB6C1D61EC340A8D0004609A289308F09249C16987333E80BCF940195 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 17ED195D34018020EE5A84FE6CFECCE938A68295CB372E0B4A5F9E7B23C70EFFE2DA1F8F3C8F + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 3A945941076EDA3F5A9F62B360A4E542238029484E4AE0D46FAEB7F14538640500F08C38995D + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = DF42F0533967A43B0347D2CA20C38C49ECDC7837682765681E0F7EC6F82CFF134688D30230C9 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = E63BC357FB1A16BD20681FDCCB58B610EF2BFA806D5E6378BC7A356BB707B7828BC0A8C3A115 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 4AEC9664948F41411AEA2B9749210EED6720EAF3EE3FBF3743D8C8E3E3267F80410E3BD6CF5F + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = EC235E1FD9BC08580396AD273533A0548655ED03DE5E63944803B06CCF9211A51F8753AF8070 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4C01D80A5C7772C2686D0457FD60B27511B9E6DF25331E0E6880793EBB4F125FBE26C3D25D99 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F4C623C560C447F356DCD406ADB17EADE3000CC5941E8307BE090C1381F8D3EC63245C4347B7 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2A3099F6818F3B1C49709E9817CE2357072BF0AD4D038E660F5DF6CB88D6C1AE7F635711AE7E + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E378F54B4B2CDB0B4642E1A406A1AFE35804405DCF6E02BD4E8460B379F65D183E7C48A63E70 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EB5A5422DC2FC68BE251E284D6A8BF57CCF9487D637E8F96C581E1E404C2330F7C5DE28717C9 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C9A227128825FFFC3AC1CE7B04FC4A8F251725E66584F2A9A623FAE6937C8CF645CD38EAEBDB + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C507653A2094DAE8DF7309E8519B0B28D652030B7F82DBF80D0AA8597B0827472A9B19C3A0DE + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 26EA7DABC5D98F7A63918A206192B0C9049078A048B86040F9F5B7564F8EBC646014593B8038 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8ECB1D7C8C19CB05F782CA26D26FC4AC4BA660F8C5A212E0E7C55B73747F6C62E42712415AA4 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 36BFBD08A879AB92498502513DDAFA3781B78ADF22F382F1E45BE68EC747EF5DC6BC042D1A13 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 28E958887F3CC74CDAE34F5727F825A37E735B73C64CC80C7E9DAF14786CFBD4D6A7A27CF24C + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9DD2C56D8BFD4F6B0F3DDEE9F82FEC1B90F4136F1D33CFAB06AAAFD341041D50CE74EBDA34A7 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 91C81EB3F8CD65097CB5A767FD0FA872EDA54DCF153C3C1B9419AE0BE4B443358BB33360157E + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2F4888953422873A73C8E94C13528588BE908229584641CCC9E8522D4FABA0D446C7D2774FAA + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4FC3CAEDC23659E09D2AD346BC8EA0FBF11183D0EBA2D2F51B6A6BE6DD84A3146D7A91499805 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 497F70A84D3CC0A686B759C80579516A52F07A019F3CEB897D8F8FB21F87F51D68C107E5F9F1 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = E881330204A6D3D1CDE7548F0396AB40C55A16BB61A006489788D83C5024BB28DC15A8F537E6C5 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = B96AFCA04198E0E59EDA2D01969653CB3BDB30B43A212F28DD06BD13D90338718C967D6417AD5A + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = EBBB22C1D2B23381E3EB24DDCC85E295E59E5CF81A36127B040AE5AE711DCAA3A3131A1BC10C7E + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 721A55ED6F37073F937F0B48370572BC1F6C5EC5C3E073205D31C1D0A09AEE7C18059B0C924419 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 35F78BE9E30462E9B4756F7E4B54A602A0A104665C86880D9243BD556116AF91766D1826DF2EB6 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 6FC870CBB6B35FD9BFFA703A6B94A6694E80C8982DF96EA6D3EB723C30E5FAF218478339E1A566 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 7DC7AF292CCA4858ABCDBABE9972BAC257F87CC98329AA1B84C6039F93D067520A244BF16E3DF8 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = E3D3E2B21B531AF637087DA044E9CD753AF910838D563192A020D52921A227493219EF60EA5FDB + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = E3E3182A4F35860881C9D961692AC75B84BE7B52DE69F39D82DE6BABAAB1E4F2C2C23B0C7A9B53 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 4B3B4D4EB1938D722DFF5CB663F49495A6425E03596D420F606B7D28C6EB5E18F8BBA8D69E0303 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 655E16C6C2FFF2CB4E30D2237A8499055591D5E39FAC97765E71A1483007C20965916A79E65867 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 13AE8CEA6B96F7BD83715FAC2B592301E24D86D5721CE98DC262A5026113177EBEFBBCED81B7CE + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 5350F2C540189DB103A32A008CAAB925E149AF0EED396B1D641CA9A552C0F26AEF34DB16C0B2AF + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 786B090F326505FCF9794AC8583B5ABAAFB2C6A46F5D3DFF652D3E5F0CBB033EEC9DAEC9483988 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 5741A22FA41EAB242F4C7B905C190C07C0CD0C0364CFE1B3A7C9B5A574AB6901DCA0106F8A0492 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = FF9C1BF4B5CD56512549880A188EA23CD342E7325CF62476AC3D59FF6491780F7A1970874E7362 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = BFD1A2CB0DCE6C97EC89E5EC7E3FBF39520F1D1B15FA3E401CC2EDE0964FFC594F5489228ECC68 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 12BAF4A4C78266FA41B64645C4D9C3B681937D4134397FD6196B9210578FA31E7C96237EF9401A + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DEB6B417CC4C0BDE79F13156B71510EA02ABF84DF9BB84D627C1311011487E942129DB0DC8CE7C + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 8BB55582C0387A5E0CC49F8669507D5493C61B0508CCA187D2E5B9A4F5A1E163BC4FF4588A3938 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8CB3058DB1823A1500DAA698F83685293149F34DAA2D7891B2B5B48263A6AF58E500443B8E9572 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C1283BEE712122A5C4B7A2875DC22592F1B24D2CC05EE5B6A1CA9AEC81EC20034DE8152753A004 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D9C75ABE9F6FE93B10C4E29D336714F5D2EF95A7B9A854B9DD539EC1E48B1AC73A10F1821A2BE1 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FAA9388DCBADF1204FC7AEE3B916FEFAB041647E4AB2FBE5D42ADF87350D43DEE5D390627CDB97 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7F85C4374B71CA490E993BAAC8FA7BF94C51700B83C1576918046B02C3EDDA4CC93970D39B1C8C + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 6704E8763AB04FED9AEB427F631E84DD7B02C7A41E57861E96FD28DA897F09FEEC74FACF46109B + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 04BA380B19FE7500988BFB936C833C38A99B35DAF34ED33A0A6995758F589AE118336582C7BD03 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F069F0CEC21674D58EDB5C31ADB4F11A2B3B6EB90965675D74D1C11C4A204B3573E1A833DEE1FB + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 42C64E8D118F889E859CE27A249C27631007BEFDDBA516F6BB8E8932748EF6387E4CBF07FA70EB + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1699DDB0A05C8B934956D47153A634AADF950B6F5AC997E112D6D35336337EAEADEAF5D6336EB0 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 383BCFB140CCCA8A3F1422F54EE0AFB965F7B8A87ED135535F44DD4A167FDD0D0AA002750F6984 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E721532A64DDB5FA3CF3FA2CCEFA53D4E7D69A77919247CA458565ED8453E2308F7EE87120F674 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 42AC63DDB9C7D6B03B56DFABE3CBE856C5C4069CEF979DA92A283DD71DBD62A6B5A308D5D7D306 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = ACC8C60F8BAB4086A566DBDF2BB73AD5DAD76C9EE6A784B2B80B9734371B2C32853CD7C7B1619F7F + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = FC300233E51945B65125D80C29FCCFC24A9F53A6EDC416747F30BDA22FB7C22ECA41606499BA779A + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 8096E0B20D8B8C15B28C2A5AB331A25F6A60052BA483BAE416E83626B1F43B0BAFF9BFA344B576DC + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 6558E3D6A900A69E50DC7952DC017A6CE7C4203C75796149A5DD0E9E46EA0918D58487ADB776681B + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 9B867E8C12AC713E7D2CE2042AAC825E354AAF8198C8BAD3F28FC671E625F75E240B5960B10E16B6 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 0BAEA1921F2396F09173D885AC44D448921542DE3A3128E8F3529E9BAEED997EE37A0C5649F27C7B + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = D9B9CB05BC6275BF1C91859870A86232C2C4259F8334B59EED781D5DE4A85ECA9ADD3193E5F65F8B + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = D61F4D060A1CB12C0F6B106871FFEEBCEB35F228BC02DC73DCFDAC67EBEB6A7CFB972EF3DA26F461 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = F5240470D6B56D655756AA529E3108CEF3B9794120B1261EADEC441B2842C1A5CD612870CBF03E81 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = FC129D487A1A60ECF6E62011E7229B1314148C8818639C5E6A3ADF521AB730F9CD6BE1A586002A0A + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = B9B7D00B18116009E4A2D441BED8356AD3F3F16270AE9621D1C96F34B591228905183C5DDDC79797 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = B747DDEC11A1A24F2823DE246D6C246F91E7B8CBF741B72FA8230422A4F9B730AEFE17F7E8F4DEA2 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 15A62910B25D604863EB479821E250077110C880141C00C779D78C3583F7EDFB707ED2A5FE58B08A + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 31E9C92934FA130D6BB23691BFAEAACEC03A20442588D75F74BB5DE88D7E93562F1CDFB50D3E7233 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 8EE8C217E34F64EFE43C84773688A6E1062D99BAADABC75CFB6A058501FC5CEB45F825503C412A31 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 432BCF950BCF4CFDE929D8CD81294D7EF354D7855FC80EA42A618BC66236B78ABA1ACB42D203C04F + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 602FB744001AD56FED26FA6C25A1F1C93A381C243C6BA631BB17B7D20A90802108BA5488CD98DF9C + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DB45A32E21432111EB6708B273A2EB00BE83FB2029FBDF62415C245FE5D2907166FC0B8D3712F172 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F80FE4D5584D63C1A9B211464A3523D5B17BE5D9D1DD026DEBB4A8B8EFB7941E8D6DCB33D1B1B9A1 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = BB43AED6A79CE22A32E90659EAE3833817BD31E6FB6EDC08689DE976BBFE75CD385FE65344888DF8 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 003E1F175948205473E2B1D50CB1D2B5DF94090869F6417FBCEB8C9B15758274941B3ABA478CCDF3 + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3DC0EF892E08746855D36BF5214C473282DEFFA7C12379D39A43AA7E663275DA6D4B42B83C5E470F + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F2B97A27E349771D057A8FA7954803991E7C2AC6405FEC313DAAA0E8D634ED074BA2A4A68A94DA39 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4A4D87753B66940F9731A40827C83C9CDF237ED87E910919710D145B6E54C54D1E7BC9472AEA4040 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 834479010E192F6A04B7A521E5B8EC1408D2B23C018DD7844A3EDC205272478708C9D7F5F02ED610 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B8CEF54480695F000569774C4AAEF9E1C7DB84694CFC4CDD6134EE6C0A2A9E0D2EA778B6FBFE1EE8 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 41BF81EA5AA73E5E573D3A7F0A6AA4FA5484FDC8313685B9BC32B69F3CBDB0AD8FE669BBAF9E73F3 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9BE2E62132E83B941038ABB2A61F88B16986C91D2A976DAF53EC9DB68AF5E77E6C435446D92F5117 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D5EE41DE1394A3DD9174B4C506D026C4E381612D86132C2354B98BE39C50A4731E64D5C17012D21E + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 96D6CB9D2978C28E0090DCA2D14BC6907DDA9552B120B6E7C03C5D1A1D4FA0B54BB17F57E69DBA3A + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = BF92B0CC22F2A7F807724C61868F6DD95CBCFD8D29A70C7116A649449ECBFC331C26BA9A59DCCF60 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 38D84DD45153BB2DBE4AEADAEA73D37A5304E236D61EA870FCEA9C019A24415EF77150EB571DFFC9 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 000E0A5099A27A36E252B00640C54004E8BF58271E5D4A4185418CA9981C01AFA10D2477B1741D5B + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = BB0841DAB4566A362340E4B60FEE6917B6024974AA037AD276CAE551C6A1CD37814CBBAC352E1C5079 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = A929DC6BA33C4A4E850ACBF807779E05B0CCCE4A596BFA7E36FBF6D05AA43AA2AF26DC923E2DC7F55F + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 5B83C91B8AD01D3310253D522F0C70315A7FC9C82D3AB48CD3D937171702AC150F0352947BA52173AE + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 7EF1F0FA3755F89003FF851A2BE2843879870EDEE9465E87B40862B12AA44E48BB35C28E99ACD2B2B7 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 4CF7FC346C3FAEB6E0B2523E23BDF384D39C6309D2D72A962B8C37B296B19B5029F7979A3007C0BA4D + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 615556FA9542CCE2274ADA29A6BC0DC09D46069CA48F5942B1E3F505902B1EFA2EB2C7645F72969FE8 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = D4BD8A9D56FB5925EBAC0169C3FF58303B4ED7DB03F7080B0C023A03CBBA92CE6D48A216176BE7B85D + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 56B4BC3E88B441364C7F3BD6E54A1F22656E96D878BAB960F64DC9441617DDA7B9DA2B9420E4B0A5B0 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = B2486A6064246CBB16DF3F20D69AF92D7CB3BE0939B532C9308480A145D9FF4578B029F44B32D5B703 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 62BBDA506069D47F462B69B083EE25FB1ED99B977769F86D95B6BB46D22EAA322D0A2EEDDAFAE0C584 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = EB37C9AB5CD45FCB3B922EE79E99459368CFCCF434D242CD5E1ADCD32CFC25485EFA6D208D3FB8679D + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 173C9C8AA6C33C69F3AA47E988461987EECA5E2AD95045652AA086035ABC318281E5AFC3E1D1043D5E + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = AF56EB617817ED4C8DA071620892975E3112724BA9B528957F459C58004CEA821708A0673BE5FB5E06 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 955A941DA91B7E16D7155640F4018D4A7316D100E03919FC3B22075BF952961257532377F3CBBF9FE0 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = BD9BB59C97D3B1752DEE24A2F8F1A45A87A1CAF00525163CC147A837EE62B016D4839BE3C6C77FE52D + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 795D4C29082C9E2552991977FA4152DAEDEC1B98FF1E4486A6E0B45C16431F79D62F24F7FFBBC878FF + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 69E2BEAA0822F5046B8409DB346C897A558740471F8B89321F9C9D32140163338D5669D164CC6AA23F + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5D73119ED51D7DD26C841F1A0C1874AF7CCD9FE8E0267BC54E225CD1F0D15527A7759C9EFB92A5C544 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7B3D2CE92FC13E083D02AB9EDEB3806883790927B45C2CE429AEE1F7E1994CBC935A9730479DDD4DCA + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E7C61DAE15F214DF74555DFF8E867BF83C9D5DA89A88F53577F737E4B31161ECC8C9006A468B08A630 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 777B518C3FDB63F752BA966A7A26BB3A3BA3833EB4686C8BD13137A786AEB50E35637F615DF3A46B8D + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 63EC1119B56C6FE37B961096E2EF3C83A13CE9F0AA253AD76AB30F1E74AF304A69BF220BCD82A7DE57 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7A1F0F7099AF4C466DB2B1DB2098ACC36A7FCE0CDD1BF2F2F5CD7EEFB82C16A67D390302176A0F6BFF + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B79D565A399F232FA91C04E2490EF065C26D4B4CE820697461B54F1449E9C9D23CD0606C15143E154B + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 370A1EDBF61CDDD5A70125F260C21F9A27E952C3538F2F452BB4D0608193BFFC5D6A6F4E2172E72557 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 60C23F6CA04ADF120AC95E11CB6F55A5B345901EB709CDA3D3CB7BC83C9AC116F9C1F9C9A9B37C48DC + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 189CAEF940469164744CD7A011061CC00DBC4BC26EFB8B44AA04DF68BFC176B2F62938F8CC6FF2C46C + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 0CF11675B01690ED3A63F2CBB1B3776E48F26C5875B5CF81371DCC9405A29EF7813361493E6722ECB5 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DE200E56983D7BDE927850817EB74134A1CEDD8AE02C520A5FE38049C58DE1B8CBDC71B473BEB87E21 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4BDD32D5E97D27D6EB170244150ADE5076F8E608F591E21ED2D61C8016603E9F92E5A01CA09E6B0318 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4408B280C872E090D77E71CF607EB634EF2526792B0C065622080C2BC799CE4A29F80E8C2746862AA0 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1498FD5FD07BC0156252DF7B57AAE3819B2DC070D8656E0CD481F6E9E93BA337BDF5F5091332C9FD39 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DF8B67C8C49E55602F48A5F616FD14F64F9B526483F68F907F4152F84AC6766955A779EFD3EE493CA6 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = C759CAF134FA9359269E8D1E2B053210292F23A41F14970703C77D9490D31600F939C6E61A9A55E973A9 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 949E816E729B1A78D8E707597AB5F5E1F85ED44F397E7C14844AC0B1996CC7A5A82601064B685F00E1F5 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 0E4C270820DA0EDF834E8ACDF392A697B3DF56206B47EB4747154B12008BF2F724EFB772F45DAE4EBD06 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 092A5FF2C42A6B35233FD3B32DC19A26AE9242FD3DB34775296C11FF0B8ADDC934F0A81D75E1E7D7FBEA + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 93A4F14BCF98743544CA548C9EA92AB14CB3A5708962AA95C2150E1E831CBE767852387D8D6032264AD1 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 2668AFAD212DD030BABCC2D53CC434CF246432955B21E53D05DB5A14C58A9AA319C9226BBE4B981EB716 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 7D4BA08C742766A4130ABFB63C851543FB29794091B3D5787E7D0129C3FD9B9C956045FEEED5D69A0151 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = ACF311541C5522706BA3FEDC96FB157CD6DF7F219DFD9E917DB6BC951D8D2C106AD0358112871AB41866 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 5488B5CE7BEE741D7BDF14E49237BF397A37D82692D5CA1761B453B7268FA00E180C81E0B2912B3F83FF + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 9B506246E6BB0796B6A52787056B312756F70E202BC329461C3F18AD58326249CCB00848A8E965A00AEA + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 50C7078B28191A7FCA8CC9FE269CB7E3D4D6BED9EEC40B7D0E89D28D38BE1D30518AD6A247B8840A45A7 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 68323436A11F78A0C2453F696881E2DCB7A67559F9CFD0BED4CF06FCF21CB73C9846DF4792AB8FFD22BE + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = A9D617F3DE777CAAE476CA0AFA6205B042E36D44E6F878C07366498234DC121FCC99A62BA074DEA4FFA8 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 605CB6057ED8EF530012908223BA46FA7068C7D0F0AF885871697D03B8EEF94AAA91994CECEAF1BC88A6 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 5BBE0124D1B32A796C11FCA1042E68BDC7061A38A8100FDC11176126109872991843C23B52EB60C3312A + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 37D5EEFA0B0DC84F8709581BA68C3D57219B84EB8EDB5688EAFEDE0F699B2D3DA2848FE2A1B8B74EF4C1 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8B67207DA32F6F095DAEE4E7B6AF3FBCB7AD5BF1F2C6A5460868E5826599B67D1038A61E992B64078295 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 520DE0A3BABB922FE9A6903D68DBCA1D603196603441E28FA0E6E41C9BD3C4977EAD6FC2444030250F75 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2BE55D58808DC66B65BA4AD27EB0D6745DD14647C983EC665355E71EAA8F4273AF03A86EC6376C01CEE2 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C5DC0EDA7DD57EA7E5A27231829AF12D1279EA1EEC0E94CD196B26157A1E585E00248DA5702286550750 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9FAE6A31971A84F8274A2D41897156FD83860C9F07630CFAB0471DF7BC0753588670FCB48BD575257ED4 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5A2FFFB60D2E335279D17AA0861A13D900F8BA901964563032248A1BAD70301A6B4D7B64E25B472FA3C2 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B4AF49E0937A41EE435CBFFE300D8861CB614D303DD027E82EBC2C571170D10F8356CF9812179E93E5FB + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1DF9DD5B04438881EA8334A956ED8BCBCABB4036012DCD6D57D36B035BBA0B32380E22B6A1107E8562AF + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5C8BE3438710350701F811255AF0720C94DA9CEDA4D34996A20BF808291523BEE53C76D2E3C1C01FC4C9 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BA9DE8E758A038C8A75B0E4CC58E8443F73413D41F428015B0E9E02BB1F1C820A5A90D05020A756247B7 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 48536384ADEB76A347060504C47C1CB50E321EDE1E51C5AF666ED075BAA79859CB6C8EDB700830F65F21 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 48B09628D7DD79C5FF1837FA57264CE030B082B7A3B863147D0995A2B463DC653FEA1B01F4592B8DEC94 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5DBB24877384C1B41501F06A20185C8ED9AD1A83B75384F22A02BBA07273468A69A2DA0197FF5A9F33F1 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C7BB648DD60715F3C05B22EFD8AFE2211334925F11491C2A7EF78C991277B3747B7A2457336355DF3EED + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8F2E210E58BE0FD432AB4A2D978111E920338A02D8F228C10D44382047642537E428F268D5B9C27691DD + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 32E7CF80B6B1265FD205F610F134D8B4D651843AD01BEDA80C27493A5103CF0ED7BC8852FCCCCCB7ADCF + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D00A30B791103C7945B5DC151FCD80F93A0F98BC72142FCD051E66A7DA1B083459E84E0729F3544CE225 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 8C4779536E52A6E38B516F146489FA5900F0048851BB0C6C5D33660BFAFCFF66FD8DEC70C0829895F9786B + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = E9DA94CCACC36ECB5FC504B7DB0A817004ECD8F70BD8124EC6DF25975A0EC7CC8894A4869304CC0B47CD43 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = BF10DF8F5C5BBA1E832331E89BFA8F0C3C71E6C97B0936125101E9731526EB824538EA7A9C5919241EA3AA + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 3AEE6318350617321CDD3B248833C82DC5564F097DCEE57D674222252E811711DD262F846A1EDF55091D78 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = D28828DAABA0A32A45633CBB5E6F98021167433FD222924F69483F2E85CE0A0154416397B082164D28FA38 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 00E90922645056A0CFF9014BCE4447C48B9E18CF0CFE0956BB908492E941CCE96F1246C4E91D53B768A568 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = C074B3DC172F6893EF421DFED0C12E680015FFD2AEFEAA97FDC5AD9CFE1D915894F912136EF54AC17E754F + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 78E20FFB0DD23A62E9B82CA33AFFD20BA4CFB8CB06BFCAAEBB193DD439DA31AE367AE74AE5EFFFD96F0B17 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 007A92D9C6C5C33B8410F415F6BC38D5C8EA2210E62C5D8C81BF595A031F134CCC7675CDE9DA281E6BAFE2 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 82C25907574F93E0A69AD8CA74B645EE52E37E908DC6DCFD6C9BCF81D9877E9C2BB4C2B35943225C70E053 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 2ABC7F084A98629BDF379B0116A70F2FCD4A9D140E9CF910D161F8DDE10AE804662B30FB3FA6673BFD4990 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = D9A7D43E92FECF74A16ACDB3C7F6800AFB7829C2AD10606251B5D202281AA1E7BA996E263A948AB0BBEFED + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = B57FA7181D0526E558CF610150A6DB517821BA26E44E6A671264F574EFA6700DE4D51D7C825F1CE9856328 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 6FB5EA410FBC837325C640209CBA23520D8E3BE9A4979C91332F6F453FDD5F7859B2E0C3A04E6ACB510424 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 8331B23BB529624776E85504143E706301614B46E5A2B674B6A43DC658FA203E960608C1DEA303F2F076E6 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 86F28D5D8772959466C47B1AF010379F7164A9381C9807FCDC64BC7B60A2EE703D6838851F0D58831AAFB1 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = A995B824CE465F04E6B44D3B8484353F109C934ADCC5887E07E413E1DECB4B8C5604EFD912447FFCAA3430 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 138BF7F073C33DD01861D489051FBE41D408DFD776F061BB6135FFD273C208F96513D7D52890E25B6E7129 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 77C9408C77AA0E3D90FB0122323FCB5B299310559173C1AD1CABC3E233AB917306A16916AE19F8B87DD991 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2E282A6B377529148B26802A1DCCAA58765CEADE041F407AC9A2DBC08CCFA0C683846E1516DE863DC449E8 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 55ADF62BDAF9A7FF3FFC047847ED267DF544D61B0F232D6595A5FEE036FAB58B80FD6E5FD867BA86243E8E + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CE501B98A723C23C16B46E0315747FDC2E811A0990C5FC4212CCB5E4DDC8A1CEC0EFC854AE3E29F364ADE2 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F604DCBCFB5E8BC28C8504E03E35DAF038B3183AA969ED36CBBB9051C7E71BA3E56FCAC143A3474F219842 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 66FDB38D7642E7782E3C9E97B68393D890EB57CF4092878A867D60BB05910A7125B4E75C8956E375A456A0 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F1B68E6E720D0E19A7429064676F3B80AD8BA60AF861B81D39834A9CE16852EB5CB12F2E7C4F73F119F754 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C4277DFD0C738BE74F169C2842D09B9F666C53167C76339BB5C013276FE96890C3F8DD93B2C967BFA70A5C + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7AFCDAC865A901C9842156E9785F32F6699B704B4A73EF1F15284980EA789ED4E284C76D1751F208EC66EC + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 664D086D12DED1B75B9EEA2DCD7012B1030D8EEFC4AB93A90DA57E80A54424C359D1BF428867A9849B9F87 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 76393AC28A7593F37353D425984576D03F2327D36678CFE51753F67CCD1D413F61937E5AEC2231374EBE23 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 31EBAAB2ECEC1FC8FC75E611E19517165107D7C3E01B5D85B2578FB36A974D1BC2388C30CA7145879F4EA5 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C2873403A1D285B6396DF046F09C6EE4D92DB9FD95EC1F6F6960BC6DD432B1EA5ECFD9697A0C41ACC15398 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CB4B2CF2B9105B7BF9DE3EC59ACF4C8B7E1430C7FCDAA311B936731956AC02177DD515059B576BBC62270E + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D6C7B694B7F7548060F75F383D6D06D98A116BDDCCF8F2DB09387704B0FCC65FFCB291508BF998B3E09878 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 15F0E5F35E1DE1AECFA3B0339BBB5FC629F9D0ACAC160983367D1558427BA8947C6CABEAEACB3882F38205E2 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 679B40F40A6995ED18FB8E1073902AABC5C7405A2A3CECCF54D8D7F0CE105D5D34533BCA750254D431B94D4E + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 79E7440B29D960B1E59CFB05B3353ED06390F56B7BB75065A6C0D37E6A36DFFCC5512C8BC8D7E01D1C428F6C + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 87757AE2E2CBCD5802DDF5885C80FF9BEF24080E3144E3517EA7E8530B86B84B3D1CC95967FF3B704E18B1F4 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = F4EF51BF94CA2DF1039550D0696E626C35F9A7AA69DC517528AA2529A91C2E6883D1057FD20E1122EEC157EA + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 152FC883B65B64F363B44EC713E7AA2E0F85DD47532ABE21746C54DDA73F674113C54AB1DE88247411B5CDA8 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 33F8FA87D4FD3651607EBF3DBE21C7DFE0A87CA079D89B67B5E3B8FBE369EEAF555A0CE817459BBB6F83A39A + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 91CCDF7545FED9F4C527CCDFAEE2746A47F34AED9205D15B90971E90FDDF9445CB9BD154E5A66D71199A28F7 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 39147DEB58BAFDECC796EDC377C19E52CEF8C0E366E5A7355F5AD6FC03B7C0FEEA1D9E40128F8EFCB1A5ADD6 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = FE72EA64FFF52A81CA4015077F689B4487C63189D899C53E136616A99EB78653D0D56EE7221DFBE788742719 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 93747A15D829262CE5952644B5B0DAAF186A205467DC6EB379E1C226FCE7EE74D9AD45E46C7C00288CC21C6F + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 0586EA22D5BA260E52FCC2E23B0CA6FE0B166B4DD010F439B63F4EE50E03FA16AFDB88747757C7D0F843D0D6 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = D4708DD9ED6A68E2D422F5C793FB02080505179C475D51E281F1C4A99CDBD3FEA3CA3849CC704C09AA43F0D1 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 80A99CFC19D0B6E49B1B065D058AB83F4F2645BCA1217B2C72C15B773C1C7B8086FA97500DEF7A3BF2AA43E0 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = F222D75452D36A438B412291D48B33A7878283B3239E176DC844D73570FB2F9E65F4EC1023FECC24D0807CA8 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = 15523917382ACB1D6E8FC3F4DBD00B1CC988CBA494D1BBCE7477BA8F9E5F9DB038F11B02A0EE17172DD62112 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 1CAEE1A8E9D9250B87BE6B30F92BC7529F8A39ED6F4A1D84B80668130ED9D704BC8B10B50C5F8EA12CEDF689 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A8FEDB0791CAB5C28ACE7CCEFB562D2FC0B9994F3F9C5FB307DEC89E51ED89AB741C9DA2E0D87217D7A62F7F + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C2B569EA733E24DD8853A8FC7A2EA4525330C493EB0D4B4F8B573843B95273D75E31105FCC4E743E6BC49CF2 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3EDE271C48205FFCA61617D670DE60623535FBDECA6A5FF360728B1135C2C0FF94D0EAD2850F512B811ABB40 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B704465D11643710055C9DA10C3219EB37525921AC189BF9A6166111719FDC159E11A3D4F378DD9BF049D4D8 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7C846DE54D56347382A2A7719BBA2DDBE20EA28028ED1CF895E83E59EDE619692B3177806919C3B784EB37ED + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9AD29C09E507B07E4B5CC8D41B0B03D30BDC0539E25088C7FB5EF13B6ADBBFA535684E8C8D58C4095D01A451 + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6C10AB4F0022D6EA4B1C25319C6B583EDE813B318DC39D86790E6F1EC298522F267579B686F17CA5372211CA + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 42D27C13C02E537A8143B8C24DD965222CCA31ECA8D9FE4974625119585A6F7605659770F3F0FB8E8B9CAC37 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A12BABD2879BAE1965E5902B19EF156DDB6A00C8918E845DFD8A980BA44103B5488FAF9E42A5A8C081C62FF8 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AD5F7046341FDB55E9E0BDE0FEDE2BC100B2DB09613C7144B1D988DA32FF349717C2F12075AF50A4EFD2053D + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1C9BD71B72922A3E95608B1C8EE937DC0E94640652CA74CE0C388BB6A3F3686CB2856AD2AB4B4EE2AFDED03C + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DA4628F9C72970C6A5CCA5F456C966AE3B552F4B9218617C82785EFB42776229901A04D7A5E552C5F2118191 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5D5CC7D8745D90C2D106CE52E12CBDD1BE1264A4787AC6D3EEDD7931D9975011C413BA03B6398E60E09D11B6 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 30EC0883038BECFAAD20AF7EE0D91FD365CF533C27A828A4087EF62B3A857D8843666AB9256480A9A33D6FBB + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 3223E0BD9E4B37A65FE348779FFE093AF311D08196714FAD8689049DCF4F66E912A2BFC5605740ABE7BCA1D6 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 62DFE5F0F83EA31ECD495EABFE0324B2E1A11CAD4CD97A8B2DD832DBD5F5B021E1155EA23F0E4904C9EF41E4 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 32F3337B9AA6BB19F7634A46262E4DE955819A22702A6A233AFA1B9FA4B7253803BF83ACAEFC7784443B8C34F7 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = CBDB5B98B3F43B6828BE4AD4F7B0A28D3AABAC6FE585F1C0CEAE7DEC17855E70F58C7FD47AEDDFF5C9C5851AC8 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 514EE12A763917E262307FD63138ED881C30063720F35330097A3EAB6803709ED13740D149CDCF54029401FA52 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = E283A14E34C650AD956879F65A462A1BA42F2736CBB0D32EA4B87724228ED77DD87B917E45B778BF2BD2CD2396 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 2FAE8CCDDF19611A7BC5F46E9026CC2362285CE2F862DF106E4E06D66FA77B2FE8DBFC76685C17D24EE5707C67 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 03DC00F1022824A8F8F6B2000B9A2A652C394E7BC7AF51CBBB3F4B9C72EA3E486311C264E202EC1AC51CC92C97 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 66A48B1EE9EAB87CB932D5E2784B7EA4C31710DD3C8AFC48073B2635CA90649CF2663FE0F69FF4E609A42DAD18 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 182921700836938F9E7C0F566A8F53253FA38D1FF7C02FC167655B176A45A8EBBF718CE114AE81B6FC9C932330 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = CD0CC38C3D2D3F57F6AE0E15AC091C5BEFA9204145FC0D5F400AA2A0498158F78696D75C3200C8A95ACA1BFAF6 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = D4519DD7C7F7050A27E90931AC638D1593CAC4C0296309A3198CE27DFEAEBA220B4A8CCEAAB2766909CF194B40 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 8D4AA25C8E6462F3741E88C28411765CC273712901FB167EFB4F81A377708DC763605C8096D7BBCE5555A8F20E + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = BCA070048CE225004BFFB5487F46BB5774003008855BAF767BF67BC95A9B43E221045424E5AAB9F87A356228C9 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 8ABD7158F9285FEF3224FDBC1FA5EAECD372126DFD7A101BBE11BAB2AC0D2DF63F33635F67BC203EDE046C5CD1 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = D711B2399539890F3E277DC9ECBE00A6C15D748F8B97AEFCF0268B58A0E45A2D954A8A13F8FA0015D1CE0EB403 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 5842BD2EDC347FB477DD62E5578790369E9AF1ABAF3C130B6336894EBDC6F7B047D5AC69F5A816ADD2BBE25255 + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = E35232FFE5084AC76C059F0A43CA5DFD5B9380EB531B44EEF033BD9A4AFCD0FF3FFB1AEC55AD2C0BD39E391785 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 8AB93EA29D7D708350B55236BD4210E8AA9146775808CC072EBB62C659B362F12EEC13C60318E1E51765D98B83 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B1EE72B4E8039E1BEE1A179AA14F4945939C52CC91B75E951F8303FCF9F8A49293C9386E4A5DD3A201B93825EB + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E5DACBF97BD02446454DA3F805D45B35798FBBACFC172330FA07314F07EFEADF0EB25AC4C943C692CB5E3551BE + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = EB4D2D7417A1C425F4F06B5A5FB82855C0C37A25DD689315E869163EF3CB05116F0EE2C1C7907570201E59C759 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 59F10A109053836A659AFD58E5BBB8DD961316C34C89A870422E509CEC114BA5CF47A1D7C39F83661B7C2ACFD5 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A3C363828BAD5AF6CBD6BE634B91FB25408515592D2A7E110188AE442A88DB55384485BED4300504C12AD7374A + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3EFA81AA42E676B1CAF37C147F81671DA2A691A12A2819697C061EC4E67C8E6B3FA08864A70D3A72AFBD1E8391 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BBB7F2EBD0F857E2B429F771C894423DFE76D05A4CD496B657F489B8FF56D9BF2EBAF2C1DC504AFA2FFCC27723 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 01983ED8E94CE039173391C76A250D487C5B8AA23EFC22D9EF8D4DF6B1AFD60E40077CFF22D60EDBDDB8482DEE + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9C993A1B905F6C531332273D8762351DFD821626B91F86B5E1049141436EEDA4A693761E077A0504B6EB78B2C4 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B160031FE3BB9AF8F64EF9C20177E2B6431658B24D272A151B46CB9905179524BB2D31EF919DE1BB9397BDE2BD + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3AB5A0F799BE1FF74AB4ACFEA0528B92FFD56B0FE1B9DEEB96D0CF023DBF95EEFD0E5DDC9DF4A0A98A70825B9D + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8F10D0F49AB95E68758186F3C84F7A0546E2EBE9BFFC2787DF9C1D51888C3E0BEA3D9AB06086DF2279F8241434 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E97BE16F2BDAEE3338DFA3FE5145C9661FA35005B4A80BE8464808CC5F8E52BDFF2894DAAC14832556D1260DEF + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 84FB80B42788AD66F30A65448B93CA96B80D06C5BD7CF6A2C5B2BF17E0D2EB4489641F94BEC39FA4F83BA7E4DA + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C634F93B9AAF4760A474EE62C1A1E840EF7F248341F7B54FBFBC0E2DE8DDD895E44140762C78FC49A7ED74A231 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 265B456A0A14003236F8BBE3556065D7C1A780BA8BD11B38C45484FC24A0940DFF87BD0655C6B2BE08BCC5952B + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 0B09CD4F5F0851A501924601D3A78CC4A58CF749ED684C7DD3255400FA463809DADA3BAD7EFD58E74F3D0CFE1937 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = BC685A60BF16125DF85221A22796E6305352F7675C2269171DD5B6570A80F59759DAC956B5FEBBFE582C948A12D4 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 0763C8486DB8CC03458091C15BBB1E2CBAAEDC1A51F4B5B1D43D4F4B1072818764520BC59ECA19DC829DA67C3975 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 263B1BAA60E17F77487239C0FB377A410B0DE653880B0EF7856859D06E5030DFCB5C7687179B56E790C1CF611EB3 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = C0D66846B2D0B0F8BFBFCE8AA2EA4D0CE1E7216A0786EBB68D0DF87BFF6CA5C38F410E708C6BBE47190778024180 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = DB11EC8ED7C6F841F5BEBA72446BDE63CDA85D8711C4A1E79AFD66D9C40D3B17E9B5AC2D0AD9C3C22C722A2827BA + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 328C4745BB0EB701246E0C09897A680FFA022A05D9A3C43A2DDD4B19AB1F569D8A17C55DC5A52C01FEAB608625E1 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = C91068D5A235597E4AA64A5582B966701FF1E8C32C2CB2FA7C21952ADBCB837BBA8F8BDD20FB28E952D192A47CF3 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 85E05D9370788ED0DC7F64119965C6B1EA328964B4C35CA6EE5650470A797D36579A4AEB810E2C715F2FC4606C43 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 8AFB8138773F7A85460E08D64978CB0AC8E1607E636F1113DD8A51283F90605F091A51CB6DD025174D11A612720B + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 3E58ACBECDBEE18BAD898FF9D59DC49674B06A93AE2A9D6743283F536A4EED60B0459A7C61DAE02FBB970A8D259D + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = B394253A4AB6753CDB9A78FB9AAB038FD457DE318F43585583590FA23A3B3961424C6F58C011FA9F20A9135175F4 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 9E7C88F35EBF1AC835B0AE5D5695BF278EA7C32B53143D72F12C3E252E5DB86CD76871C1DACF74769CB113591B49 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 34C9671BB77D1445E9E8F83004CA238962E76E32E7AA6CC77309589F688228E3010F941EDB98313BBCC02FAA3F93 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 4753CCCC40E5DB9A19E9482B0C70A461E51F397AA3E98EC88AA392C2B886DF636428F389DA177D99C0851DD832A4 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = F29475FDEF88FFF1359423BA63C873D5C02A12B2A0906C1004766D3D8DCACB3D8276BC3AED6B91932E37ECC63078 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 4B40E75ED8EF9E174C36DD5EDF3145C954BCBEF4A89ABD2D47A1E5DD9C3A047CC96A7C3D0BE0A2FD58E62406DD43 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 241FE6F59F6C5005CA1B7B67AE657EB99589356749941A338FE3D86945C2BEF5FDDCD6EC6EE91EB2F5A4AA0AC05A + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 92F4F47CA42CBF014B95A10CB0FF7ABC88F5A4EBCB1E5EA42D8C6AE8C3EDDFD93ABF79007A8A245F2E5F92320357 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0BF6BE3E06892E9BB6DAB6974F77F6095CC9831AE2C3ED71CF11BDDE5D3C136C2DB7D3F2A28CD722C7177FDFB95A + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3E68594D86A1D86293C47329E3281C1297FB3BB9EC8407710AA02EF233833436C7CBE3984A7C4E187EE3DD5BB4D3 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 864B1ED0A453923F1D92C8DBEDDAE2C18877C0C2F52F5FF631779A76B5DDBCC53662D7957B0814E2CDE960703113 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7E9AEF9BC326B8EA2FFD9118DC116D91837F1412CF541B98C5956E48D432CE063BB14F215B8757CAC4339877F317 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FB08AC407D1271D44B11B49947D1184723D67F6ACDBFC1C41CD46352AF670D4EFFC0BD5A71AB3659F69F20B0D9E5 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E4DBE32BCD706DD02520A58388F7084D583AD6EBC761ABF904BFE1C01F9BB0D96F119FDC90DF46748F13550ADEC2 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C2D3227D681FB249681FFB0A182AFB92D72AEA37BB49E880CE82B415751A123C18192B006D7DF17F58EC31BDC170 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 759C0F7540163AF01924246EF83184CA94A9E2C629712B428C22717CD89A7387F943032E45F953CEB8F4F7DEF135 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = EE60C0C74B8E5F08DAFE8406BD6280A9309B46EE7B9EA3978B1F4B974A1348F4A40F68A52F4D0A26215EC636120C + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 683943D9B8F7E974853BE8DDDE96A12492E11B495FC22F5E21F7550747BFC022D6B806DEEA7E06336051B93FCBC9 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0AD4505F7278B8CF4CCFF9BC1E33379054FBE2A956DFF6A5D2B3F7255E6C524F695DB6CB2B5B494C274C06EB86BF + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C49C7567EA36F31351F1C431131577523AF0C537EA54003EE00740CA95922EBE242A23BEEE6F8E2C2DCD32BF42AB + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B8800A1516CCECDA31C8DB29AFCD76CCED919357CAFFB7C18209CC977F62E3CFBFCB8739A6E64E0D0B8C99382BAB + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2E5913FE300DA9F981847EB83BA265817145F369B6BF6945D97CBAF810BEFCA5C5D7782BEE4C9778BDC370732DF9 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = C32427BC1F338A75C0FA853F2998183D7E030A4D9244DBE83FD8B73E1E5D41B9CE368359853E766A3B5C752C40341F + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 0C2B673C99267B791C2E09C2BC29F9A09E23D998F1E2EB12E9CDA53F9C120A6DCE3CF779E994BCA0DA424FC0B2946C + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = EF7A2CE3466C69D356F69544B1F535DB9D126858FE19E7C3C9BAA9317A6EE00FB1D08F41B9F6137EEB2F4292F279D6 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 845DD00102EDA5013F3C27162FC45BD69F1B2E6D6539ADCE3C826EECEDC3B9082A745EC56557B28D54CE9879E8B9D4 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = E8B768F5FFD78ED7FC5B79047999E8C1274A1F650C01EDBFC054B2AB9B0E1AD947E3ACCEF3CC76D2E4E6EFB20DE4C5 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 21C457E7D15833A0A7DD0D2B7078D919DC1564876A5C3397FAB78E2F6764D9D3E6CF1E975F38E823A455AED4C64CF4 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 3CA1B188ED5E2F3AD65CD5E2E42A15B3E1036925870EAD5AAE1B47DA049DA5617E5D318340885234AD3C52BC4406F8 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 7D3CC17D13AEC925461EA01A8B5E991250E262589727B3E9C5C85EBE2A4CC5C7951D29B6F7E941B9DF939C01D447A8 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = DBFD436E949DD9C3E32C6CA5B3952EE78073EACA0281E77965A7A23735E10E58DA350AEF30E50753EA54743AC87294 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 649874000E737F79586E2FE573208F532D128A30A2F83371FB78743544A5DBCA4512F24E0BBF69FA8CBB705C910BB0 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 85227E4F47C0DC1840B3D0ABB6E557806C94FD26322335FF3B6C3BC6268B859F1A423BF04C1EAD1B9209DADAD114D7 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = A9E770A26ED28EDDA1BEEE4D8FFA890AFC859A071215322F35C83289B7072753E52B720522D2C7AE2CA9549453CC68 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = B0A6919AE087BAC00C59A6F7A76FAAA4141D2D848A6396346E9D2423D3B11D0181102356AE17F3DABAE2426774AC2E + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 825C2BB34EE31DEDDEC454491B55C242B2BD7F1F73D07661ACFFB425CA8A7761AF7159771DAF056FE018B908BF8322 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = BB1F4A0C3C2F2E7A16041C0E8802D0EFB88ADA8B900D4C92C9C22A3F4B4BFB37A18F327B7BBB0FE08550D22E281A43 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = B6334BAC3D88B25E6D2B4CAC8C336CEF2B4E9D4688139DF3F02D3B72045237814203C6B9CF36C480550FFA43B8BBC8 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = EF4AC395F41855406B372304FCC9B087810DA30896D6AC64B566D1609F01174C7206A9A957AD88C8264DB6D2888C40 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DD56164007B459CE02783107E213F3B5004740DD2A9CD0C7A186BBD661A02FF25F3A7E7B9EC0540FF100E0D95F6844 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C803C93E93F29A3929B8202596DD5AFD1D0E4E13974F97AC3F0A75E0ADC56672FA8E5E1057257C940CA86CB3C131C0 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2D78D615DA5F70A0E688A6339329C462F58EBA983968C565825510670329FCD20A0A57A529E015294D852E723279C2 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 50E78BD2ABB039072778410F37BF7170F96FE4E5017FF2556F91B7CD338DFF837FD01C852AF4E024ADE5F49DD1B62E + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9DAD8C1ED8455D52DAEC7A8E53E10B4F8501AA160D8A6A9A5178F9DA4082430F962EBACF0ED9D31BFF5EE90E5166A2 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EBE7C27B8B1655F13F66EA6FF8AED404EF1CB00E811B12FEC629C709F39CF6DDE11E2B37815A35E72E40C54020DD61 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6DF06078A3E99E2FCAB5969EC2AEED03590FD67A3228D55130EE52E4E389F4C9D4C4B1E2E91D7E7FD91B82EB0E1E3B + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E280AA2A918A3AEE36C73D94048F830AA8FFF5AB7C709C4528D824775EAF72F14D079461E2A85B6AB3FBEE074708DF + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 80120FB1DCFF9C03155A63929F005C7D76C3B870878ED178E87F29398F201F36D7F6584DAA7785EEEED8FE4082EC3D + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 75EE8798463E3D9CB4F95E2173860F44C612F3210D1F28595126BAE15FD386A19A3E71C7CBE788FAA4E794D06BDEDA + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 270F3F4777963B802820E2FE71F215035DDE467E3724925A0CAD2D0A5FEED1A34C11084736ED1A36604C9A31063A4F + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7CD293EB05269B7D9CB0BB315D38C86DB68F6CA59DB0A895ED79F190B000B818ACFA9BABC889F46369FE0036305AC7 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 080303991BDA69889729DCA0BD487455C48610ACA62A86D215EB6E68168E46BEA530265416B6D16BDEAC279D8440B5 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 1D6DED2C9B5C03A428B695BCC750A99F80DA76913F35AEEC470EFF5EDCEDB0C52E18DEEE6C5745A34B655EFFFBF004 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F0039E1A2520A812A110993954A7D4A64C9F87DB50FB34811F21EFE4271C722EC45495BB1A25942342AAC02E0A02D0 + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A6EBD7AFB42B26A3310C67A3DAFF816DBFA56D70A337606230B93BB07315A75258316323156C3A2B0826C534867ADD + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 56D4BD4AEC4B27D07A3469E7D74C1D721EEF5DC4905F47587AA50E55E6065789D93B0E7104BAC6BBE85D976349E034F7 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 7866989E9DA417CFE88B03375D5FF1DADC39CB67C34E98F83C452A803308BCE9BF16EC82402CD2310A96896137723BA5 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 26C897818DFBC05345BD547184A664D1ECDED0676E02108699314364ED2D7CAC86BFB7CFC58078B37C882CB68A9F53B0 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 8459B74C4BCA30E3B2DDBA0AD61632DA6AD67E3CF8EF9207A1395FEF85D9767B42D121023E43DF1010FBAACC9ACB7533 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 1E3F7D783E11F7665027354D98036925C5E3C63207BCB5FA2CC919D5C439E5207C406423D820B2D6A134EFCBF53794B0 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 92CBC66E6B5ED2D522D36CB7C7FB6D920B1AC75D3A15FD83F1993C4821362A7A7B186851334E88580571E70461A0ACCB + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 4322DCD5DEDC235E188F57C605107A4EFB9D1969F9DDEED811F82092D91D658B76926D27A5E0519667DD05C704759E26 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 204A6724F437C98E37FAA9724EC4C239B7B942A7CC216A6E54BCAE725A0CC3FE16018CEAB20D36D51E13F38C74A0A72A + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 1F41F49C1335D8ED7987D98D0E4CFE3B63AF97AAAED55CA223824B68BC1CEEC6AFA22A74A06B53BD3C72C5F18F89EBD6 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = A78D5542CE72008BD261165CD61E093FE8991BE66136F6BB5062EEFB20D2F5CF36F231CA0986A9E94DFDA6F4B5C6953A + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 3FCE6B91BCC3F3F68E98677CB477DE9FFE5A39150CE6A1A9C59305383F1510409D767C6612BFC90CC020B131E8E95A8D + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 1F36BE3AB9745D667EE91651F38135392D9FEADF351018C30AA100BC333243892D332995BDD592A1D6D31B8FDEE55960 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = DF6ABFD0342841DE69B189328A3F52D2FDAB8F9483607E3B9D63F713206C15DC9CB2A04183FAFD48F2C92E7D3FEB743C + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 5D29B1E5014197D11BECCDA0A50467D2CE3F4293898B5E149D1C781FEC9198142222F1B6DC9688987C5DBE0DB5950628 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = DC081605D212DBE3E639B1872CDB63C792B1A981B368D73CBEDBD2A2B8514D9F1495B5EA1E0945D497A0D83FADE76467 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 95E2EF5275E297106DF1C2ACD68527C54C0B6D634E1BC4043EDC7F4898EF5EA4DB325C546013618804689CCE2D1F5F99 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = D254AF62C0E893A2F1DEF996880DE6DA4D613E8C23E9C2D2E3D82575F29FB229011469992E78CDC8C9B1B0CC3089A5F4 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 1166730D62A3025F516CC203DB29C8CD08D709D1063AD1388D7298A4532B2A3AEF7B7904917324983AF2C963E70AB4EF + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6F023839C4B632377401A42A1FDC1A30F8A4C3866A75EE08921FD9D930A66D1B86262916CC265FC6FC6EFF7EF70FEEBE + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 725CE30D2D39C686A73AC55F3B5673202B3C9691D7B7C5B64F57FD47F214D98127F59BFCA0E078BAE93C703D792F247D + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = CC33FE4129DEC29A9300369A514A9F3C8C16C72DDDA1A34CF358ECED3CEF605AF20711A02C2DEC14F305DCD49EA7C665 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 45D89A0105BFF9EFFA1525D5475760A3A1170FEEE5AAA3E3AC8BB6A3E257613CAA64197B3B32B87B3898729C899A1230 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = D18C242AB554CB6277B0953544228FE0C0A8291657999DC7A3DCF4BB2CDBF0996560FA8CDB1FA1FA442AD02159500F20 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3CFCF11B2D4D0708AAE7509623A4CFF3FC4261FDCACCBB7F57A4E097F5A3FE78AC13B6FE36D2295741441871DD8F35ED + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8BF15AF94D784A07F93F9C8BCB0EE236A8ABF60437D920EF171127E1E36544A49CB0C6C244E1FB231E9ADC32F37B023D + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B37230059916DCE59BC181C0AB60EB8A484C0A415F1A54CF9992CE0906FC09E92E9DCDDD2949C8D120D243405FD71558 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 22DCA922EB8C75D63AE535E340046F51CE9392A819F051A5CDE6730D50735E6E043B224ADA144BBCFAA8D8C73C3C28B1 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D93530BC853A6293076BAA6934274D43D149638AE3D60D0466B2C03DA6B04D953CC251AB15B043DF234286E88D3E5171 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A66D0DB9218D226F65A5755DA3EF96129BE59430A9D61465DA5CFA6FDF7DF82617A003D8E145CAD8E2AB2F1EA3E76734 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6AB203E2CC95E024B0541DDD4130C43765B129B8DA4825960ECAADC3A7C731CC71BAC0B2518C8938B4A2C0EF7B947E3F + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 921B18C77999EAEB52770BE9E60753AB228ABCD961A51D3EDE0C5527F160CFCF1DA451D414A89B6CEE0859988C16C5D6 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7D8A673C887B7A81E5B1960CD6150B699E592EA05454DBC8F7AAAA7BB91FCE8638036DFEF5263B621957C84C0CB53A87 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5B5FB6B01A6FDCEA1E58D20E2AE84281955C379BAD97BE025250769FD1DA0493876ACC85B9940C36B05DB652FAEC8A33 + diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.c b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/api.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/api.h new file mode 100644 index 0000000..4bd426b --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 0 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/encrypt.c b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..50af7fb --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sundae-gift.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_0_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_0_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128-config.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.c b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-avr.S new file mode 100644 index 0000000..641613a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-avr.S @@ -0,0 +1,2104 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-full-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-full-avr.S new file mode 100644 index 0000000..ff11875 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-full-avr.S @@ -0,0 +1,5037 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r13,X+ + ld r12,X+ + ld r11,X+ + ld r10,X+ + ld r5,X+ + ld r4,X+ + ld r3,X+ + ld r2,X+ + ld r9,X+ + ld r8,X+ + ld r7,X+ + ld r6,X+ + ld r29,X+ + ld r28,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rjmp 768f +30: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +768: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-small-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-small-avr.S new file mode 100644 index 0000000..77ef9fd --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-small-avr.S @@ -0,0 +1,6053 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +678: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + cpse r16,r1 + rjmp 678b + rjmp 1175f +830: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1175: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-tiny-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-tiny-avr.S new file mode 100644 index 0000000..e7a03f1 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-gift128b-tiny-avr.S @@ -0,0 +1,6766 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-util.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.c b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.c new file mode 100644 index 0000000..d192b8e --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sundae-gift.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const sundae_gift_0_cipher = { + "SUNDAE-GIFT-0", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_0_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_0_aead_encrypt, + sundae_gift_0_aead_decrypt +}; + +aead_cipher_t const sundae_gift_64_cipher = { + "SUNDAE-GIFT-64", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_64_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_64_aead_encrypt, + sundae_gift_64_aead_decrypt +}; + +aead_cipher_t const sundae_gift_96_cipher = { + "SUNDAE-GIFT-96", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_96_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_96_aead_encrypt, + sundae_gift_96_aead_decrypt +}; + +aead_cipher_t const sundae_gift_128_cipher = { + "SUNDAE-GIFT-128", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_128_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_128_aead_encrypt, + sundae_gift_128_aead_decrypt +}; + +/* Multiply a block value by 2 in the special byte field */ +STATIC_INLINE void sundae_gift_multiply(unsigned char B[16]) +{ + unsigned char B0 = B[0]; + unsigned index; + for (index = 0; index < 15; ++index) + B[index] = B[index + 1]; + B[15] = B0; + B[10] ^= B0; + B[12] ^= B0; + B[14] ^= B0; +} + +/* Compute a MAC over the concatenation of two data buffers */ +static void sundae_gift_aead_mac + (const gift128b_key_schedule_t *ks, unsigned char V[16], + const unsigned char *data1, unsigned data1len, + const unsigned char *data2, unsigned long data2len) +{ + unsigned len; + + /* Nothing to do if the input is empty */ + if (!data1len && !data2len) + return; + + /* Format the first block. We assume that data1len <= 16 + * as it is will be the nonce if it is non-zero in length */ + lw_xor_block(V, data1, data1len); + len = 16 - data1len; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V + data1len, data2, len); + data2 += len; + data2len -= len; + len += data1len; + + /* Process as many full blocks as we can, except the last */ + while (data2len > 0) { + gift128b_encrypt(ks, V, V); + len = 16; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V, data2, len); + data2 += len; + data2len -= len; + } + + /* Pad and process the last block */ + if (len < 16) { + V[len] ^= 0x80; + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } else { + sundae_gift_multiply(V); + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } +} + +static int sundae_gift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char P[16]; + + /* Compute the length of the output ciphertext */ + *clen = mlen + SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (mlen > 0) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, T, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, T, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, T, 0, 0, m, mlen); + + /* Encrypt the plaintext to produce the ciphertext. We need to be + * careful how we manage the data because we could be doing in-place + * encryption. In SUNDAE-GIFT, the first 16 bytes of the ciphertext + * is the tag rather than the last 16 bytes in other algorithms. + * We need to swap the plaintext for the current block with the + * ciphertext or tag from the previous block */ + memcpy(V, T, 16); + while (mlen >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(P, V, m, 16); + memcpy(c, T, 16); + memcpy(T, P, 16); + c += 16; + m += 16; + mlen -= 16; + } + if (mlen > 0) { + unsigned leftover = (unsigned)mlen; + gift128b_encrypt(&ks, V, V); + lw_xor_block(V, m, leftover); + memcpy(c, T, 16); + memcpy(c + 16, V, leftover); + } else { + memcpy(c, T, 16); + } + return 0; +} + +static int sundae_gift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char *mtemp; + unsigned long len; + + /* Bail out if the ciphertext is too short */ + if (clen < SUNDAE_GIFT_TAG_SIZE) + return -1; + len = *mlen = clen - SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Decrypt the ciphertext to produce the plaintext, using the + * tag as the initialization vector for the decryption process */ + memcpy(T, c, SUNDAE_GIFT_TAG_SIZE); + c += SUNDAE_GIFT_TAG_SIZE; + mtemp = m; + memcpy(V, T, 16); + while (len >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, 16); + c += 16; + mtemp += 16; + len -= 16; + } + if (len > 0) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, (unsigned)len); + } + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (clen > SUNDAE_GIFT_TAG_SIZE) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, V, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, V, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, V, 0, 0, m, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, T, V, 16); +} + +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} + +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.h b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.h new file mode 100644 index 0000000..9040dd5 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift0v1/rhys-avr/sundae-gift.h @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUNDAE_GIFT_H +#define LWCRYPTO_SUNDAE_GIFT_H + +#include "aead-common.h" + +/** + * \file sundae-gift.h + * \brief SUNDAE-GIFT encryption algorithm family. + * + * The SUNDAE-GIFT family consists of several related algorithms: + * + * \li SUNDAE-GIFT-0 with a 128-bit key, a 0-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-64 with a 128-bit key, a 64-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-96 with a 128-bit key, a 96-bit nonce, and 128-bit tag. + * This is the primary member of the family. + * \li SUNDAE-GIFT-128 with a 128-bit key, a 128-bit nonce, and 128-bit tag. + * + * SUNDAE-GIFT is resistant against nonce reuse as long as the combination + * of the associated data and plaintext is unique. + * + * If a nonce is reused (or there is no nonce in the case of SUNDAE-GIFT-0), + * then two packets with the same associated data and plaintext will encrypt + * to the same ciphertext. This will leak that the same plaintext has been + * sent for a second time but will not reveal the plaintext itself. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-0. + */ +#define SUNDAE_GIFT_0_NONCE_SIZE 0 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-64. + */ +#define SUNDAE_GIFT_64_NONCE_SIZE 8 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-96. + */ +#define SUNDAE_GIFT_96_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-128. + */ +#define SUNDAE_GIFT_128_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SUNDAE-GIFT-0 cipher. + */ +extern aead_cipher_t const sundae_gift_0_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-64 cipher. + */ +extern aead_cipher_t const sundae_gift_64_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-96 cipher. + */ +extern aead_cipher_t const sundae_gift_96_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-128 cipher. + */ +extern aead_cipher_t const sundae_gift_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_0_aead_decrypt() + */ +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_0_aead_encrypt() + */ +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_64_aead_decrypt() + */ +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_64_aead_encrypt() + */ +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_96_aead_decrypt() + */ +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_96_aead_encrypt() + */ +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_128_aead_decrypt() + */ +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-12896. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_128_aead_encrypt() + */ +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/LWC_AEAD_KAT_128_128.txt b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/LWC_AEAD_KAT_128_128.txt index b8b2afc..4a1b0b1 100644 --- a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/LWC_AEAD_KAT_128_128.txt +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/LWC_AEAD_KAT_128_128.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = -CT = F3467A06083B64358EB51659FC8D6D5D - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00 -CT = C8FD86B45B125A5EBE0B1E8D60DC44C2 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001 -CT = B7B9BF3FA79A401C9F35FDD042CC156E - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102 -CT = BD6503317D3313AE799E3172C978C35F - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203 -CT = 1893183DDD2E9178C0FC28D0A8945812 - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001020304 -CT = E3EC1ED835C44C2DC678ACC662C428D2 - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405 -CT = 04C4827FDDF9C1310C8650B1B41B22C8 - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203040506 -CT = 62EB96A7BB3B63EBB6F08BBAEAE77BBA - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 0001020304050607 -CT = 187C98A7D61A0645D5C7756973A63EB6 - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708 -CT = 8B64B437B08E44643BE546B336A68407 - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 00010203040506070809 -CT = 3CD08DD8FA26A18224687837BE40E27F - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A -CT = 189B749BDD44FC90BD2E797540B166A0 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B -CT = 0D9B7D25DC32A58EDB6677A27C602156 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C -CT = E5F40B283D8EBB187BC5407EB4663486 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D -CT = 4167798B6A3EB0C51605D0D6F8DBC4C6 - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E -CT = 6B9BB1BE54CB0231B68B17B0790C1FE3 - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = CA99E5FCFBD0153B3C63F93AA58DEC12 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = A1A317B5998821150654118928B64DDC - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 48813B08AA34C3ADE044D10DFA999DAA - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 36ABB7984B0623C9CE132E44B342E405 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 8FC14D83530E618306A85A0AECAD0264 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 4858866773044484202DAF0FAF276C5F - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 88919ABF68B33307C74F9443D012B50F - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 426239BA8696C3D37AA0762FDD8CC9CC - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = EB1ABBAE1268EFF83DAD08A25BF269AF - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = DAD56A3782115FC4E5E8630790E79A55 - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1EA5CA7309202ECABFD3C8EAF5956A97 - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 315CB792FCDB9ED5D250852FC986F6B7 - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F3BA8C7B796263D5C2CFA044A2C7FB18 - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 97C54D073FD4222195371836E1BE93CB - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 3BCB6C96F2D84BAD5438567766DAA81F - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F6D5402A204F4A8B2BC1D13B67AF020E - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A84AA90220B2A6463D94FEFF6093C586 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = -CT = 7A6C405C76704442D565FF3B1434665B0B - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00 -CT = 23BDC419387C27EB8B17FF0EDA9843338A - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001 -CT = 8AEB94D04505653B06BFE02CCC0CE08A2F - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102 -CT = 5050E769D4FEB3CE0CBD945A1D71979235 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203 -CT = 9964D9BB51B133DFBC105AEB96D65F3385 - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001020304 -CT = A695942B7FFB23D6FEF8E8C9A6BEB37D02 - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405 -CT = D213983371E01A220FABEEFDFD2C97A907 - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203040506 -CT = 5DA0278176F90990A8C9D132B2B0483180 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 0001020304050607 -CT = 4923AD06201EDBD15E0874D48368EDD03D - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708 -CT = 7DDC9F93BD89502B350E48AAE54F35DB6B - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 00010203040506070809 -CT = 35A7CA7FDA0C64D3B75EA8D9C11DA6E849 - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A -CT = E6FC43AD1F2393FE8FA77BA2B6E228D152 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B -CT = F5DF32B84A03E64B4FE27EC63FAC15E0E0 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C -CT = 25194B254237346A99C90E39A6631FB7E6 - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 294B779AB314761CA821C3A4D51241FB80 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = 900005701621B8EBD50A4FBAFFEFC65B06 - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = ED24A99F0E6C92B0DA65E6D22A49752008 - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 55FF9567706C2655AFB84A48F0385D8A11 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 757CC2D7A5DE0DC8784CC5C0811E8C33C7 - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 193403C28B51746ED60E3045D1EB4DD0D9 - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 2FA4ED1045308AD3A28D73C3B3EEDE35AE - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F419FEF8E7D5FBF3F90AA777B349B7175A - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C72C96429F4E05B4F5CFECC901B933A031 - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 8B57B2F7DF30B2E11C28A203525D76C637 - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 807FFDC14F8DE8767648D7A18E3AD49646 - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B83F0130FC1FCF9AF847C1CFFDB43B1565 - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 3AD2388C4DBA2CD57B012444C4468B6B22 - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2012544906527A8F51BF66248364991051 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = D411679DCEC722787E64D8B1C4BBD39671 - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 6DD441DA10E1572714998F362FF9A17FF9 - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 221F9AD1034D211B3AA142AA5D9BC0317B - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = BD3C1A5BC96F0EF7B2A224444301AB6B20 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 0415DDB4EE6479AAF4FD9E76142C88479F - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = -CT = 4072D2708B04E1495B138D37F19DEAF04E39 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00 -CT = 1B330CD32BF7A2DE0C952A1EC1AE893E2952 - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001 -CT = 8ECE7A3CA88465E7C674AB4FD6BB15F3DBE7 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102 -CT = 78194E7A620D0E04ED778BD4A0A4A3E92BCB - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203 -CT = 93C3D23CE1A85A393FF11AA8FA74069E68B1 - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001020304 -CT = C140A725E6299B9889E23169B6EAA4B45059 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405 -CT = 070F54C89A12B3CE4075478F66945A2788DB - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203040506 -CT = 3ACFAE8D9BE332AB2B8C1CBC4F9BE34B7A06 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 0001020304050607 -CT = 91615A731B66D191D6DB61D0336CE493D85B - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708 -CT = F6ED95D8EEA0C62CC40FB7C6BCE539165667 - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 00010203040506070809 -CT = 8FEE7967F0BBCEE2B217C7DA38DA493CBC94 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A -CT = 5C11E131C017B6DFA454BB68E529F021BC25 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B -CT = 6424954E308A8C163FD3309D558BF7096F02 - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 44228C570E68736A2DA110A31C59CC580CB7 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = F523A55E9ABF5532879162FF8B3426019438 - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 41DA97CC9C5585566C8087E6CECE58D2CA52 - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = B33514DD2830D39C6C49F1B08A6EA15B869A - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 9DEE274B2A532CF2EC4EB2EBC295F3646B62 - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 71E2064E67C1A716F3E113371E5042486508 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DE8E880001C10C63F3B9BEEF56E97B3271C6 - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B66802AE07686006D2E61A0934C0A4A46ADE - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 38AF775ED5C4117B90CF6080FAB7F45BBAA5 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 28B7C4972CC468FACFE5E41A465A02626FD5 - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 7867342FD5CC948539EB3B7E689720F44E11 - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3AF186A040E28F9E552209A903360CE04640 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 669D08BFEF13B1DDC0AE69AD69D63A341912 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 3A3E98817A3979101ADBE279C94E69E5EE36 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = E49BF33FDAF75584D8D62F331991392BF677 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 3A6DDAF98D1F83C9C6FA38AEEA60396446D7 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 081592710504430615A6D2B9FB4731A06F50 - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F6EDB417E43F8C4240E47FEC9BD57070E744 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 850170F7243A47FF145B4EC6474BC091DCDE - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = FDD16DB926B9F867C0057FA78E3AFF236A05 - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = -CT = 1540CC0BB7CC52FCCFB6E4DB19A2611BA5EF60 - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00 -CT = 6C83358847CA286F693EDC142281C2CF64C3DE - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001 -CT = 2B546F5A3B7243DAF7FC39EF08EB0020A649CD - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102 -CT = B766293F7552B1F439411AECFE38F3D5BA46F2 - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203 -CT = 10D110615A3DC0BD03E90CCD4CF8AA625FAB0B - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001020304 -CT = 19B8CAC86938D95CE15E260509B99097812493 - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405 -CT = 49DA47130CDB65828B05BC7A2661BA1DCB1DCC - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203040506 -CT = 026596303883CA0E17D71E2E72FE2901785156 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 0001020304050607 -CT = 6F8AC7F3B64DF47879293A682A694CF8FB425A - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708 -CT = 3EB4556BAF1D2507029715352189178AC379B6 - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 00010203040506070809 -CT = 1B20D8A34D5344C4D46B46B9EE2CED0CA0FCFA - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A -CT = 27CAD4C6D0917CC68B5AFF0EC52AF97D074FA1 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B -CT = 5EBD34ECB4855879F93507428077CAD4FFFD18 - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C -CT = 87A0A9AC6BB46216AA3609E6FFD685E042B59E - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 7481E1471FA8BB9AA720EC714B7FD30625F507 - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = E795D7129706289A27C3A8DC1BB0A526C78B3D - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 204FB43DEECEC337BCEEC2A435EE14051B8DFF - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C672A415166EA395503925DF90EB4866FB9E7C - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = A23A9B9D28727DA8BDAEE6BA0DF9180C69BD75 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 716A2161C11DCF0A17563F9260E15CC5EB8CCC - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5628F98DC438888C2602F5B3886883613802A5 - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = E5AF590F649F8813D8A5B39763E50B690A6A91 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FD798CB67D21F23FBD77F86984EB56999CA692 - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5DBE3A7B66DFBA4E4D0411C3A9E792BEECA124 - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FE6E5621A558BE665C62B82E4263FD7BF259DC - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A8F7E6F8A1A68959F7AC81DDF14F471AA2F2D1 - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 44534856FFC9A8F47EA11B26A44AD0F447A1B5 - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C30E850C4322D4F1A74EA901100E8D8AF009C0 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F7F40732B4EFDC5B85F93521A5481144173660 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5ECA05952E474C03D0C463559CD4892A5AED40 - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A2AFCAF71304D255799EA13FD3765168862717 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 6ED06F2C10203D29AAC526835BB8A9DC9173A4 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3E587D680DEF6F9D2A4C28377DC56F71D7CA9E - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = -CT = AA2FA970C1A131B2111FC29C265AC6A7CE0D2660 - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00 -CT = A2451E4C721BD15FA4C15FB12836BA11F8D0F570 - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001 -CT = 0D48B5AF3C8D11AF3D05779BF78CA30DC1D435E7 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102 -CT = 9A55617306DD54EA463004C3F981A92E4BCEE1B7 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203 -CT = 4EADD8E71A6F832F1CC24029FED3FE70951C1539 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001020304 -CT = 7ED8A4E92AB4FAD93336E5C2CB1A1D4FDC19EC98 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405 -CT = E65A7F3A67DBDDDD1FC788E23ECAAE1F475177A2 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203040506 -CT = 2ABF8725B0E11C1C23AC204F1659D3FD7BABAE4B - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 0001020304050607 -CT = 2C408731EEB6D35954156F4A1FA824FC41BC963D - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708 -CT = 1AECCE77FF96429B2F1A923A1C8CD2C2E493E08E - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 00010203040506070809 -CT = F9E0678028C039DE85675601F7B791DDC67F4021 - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A -CT = A01D9067B201792A5471EE7245C133A7C28DB431 - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B -CT = FCD6CB92B8FA931D33A267B1418C589478313681 - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 434EDBEC5C8AA9DCAF2924A220B250A61907C306 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 4666E64130EE8D8D5A90B9358685E2E41D117CBC - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = 82123A9218C8A5650354DEADB2B86220B6C1594E - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 4ACD9FBFB32F0FDCFEC0085A358283707161E8B4 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E5DF82743387156810BDA09178B29F56C99264EB - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = CE75ACD419E31A1A2CE34F72BEBC5826B26F6D14 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 4F8E825EA90CA8CD2E39DD24E66752F339E2650B - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = BB2D70330FCF87F833BCFC9AE66172CC3345D9B2 - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 98FAF7A4A398329572A8F28DBE33C0E076F7DE78 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = CCCB6662E42BF5855D10A7CC94BC5B3ECF20B5F3 - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 617709787FCE10225E97F33E58178048D4A4BE7F - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FA456B51855909D9B69FA8375ED9C6EDCA4FF177 - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C88DFA52CE2C2E98C70358D4DFB943DD5B8DC570 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 802B489702DC30B59049ED613A5DDA2B597D0EC0 - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B07DC6E453B1A71324C2320BDE7587F3B1505688 - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 59C156836A1294FFDFE33FC9202C165A5EC33470 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 02EA2321800CC0BC5E6EBBC6DDAA5D507FCB61FD - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 5060AE40C9D167D804D56919FB081CB00B9EDF9B - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B2EA6703AC6B65A3F6D53E2FEF5729AC494694ED - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = EA3779ED0E7B7BA205510441F73DE3803CD8A85B - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = -CT = 7F4AFBB3A9CFBBB0F9E9B8C3C5461B070873FF0691 - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00 -CT = 359D149F8356A92153B93E1638A30B99E450F56A99 - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001 -CT = ABE8457DE763AEE42E513D010EEB700EF59178F8EA - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102 -CT = B219816961E540075C86C704E09B14B24B4F1A03C4 - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203 -CT = 953FDED06A268637307819C939491B57503E563D37 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001020304 -CT = 0A62E49815DF8BC8C2A7E11DEE003BF10F3B3A7EB9 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405 -CT = F1F600C1D3C80E1609BD3B778C5DC1408752462AAC - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203040506 -CT = 3F3C91B84CD8D5744B3271806935492F4C789D50F7 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 0001020304050607 -CT = E1E976F5F74ADB506401A3231A68A15ABAFF61DEFD - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708 -CT = A01BE963E3529D256F8D8E71F8A1C20AEF7BA5F8AE - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 00010203040506070809 -CT = 69CE3F129CC56B1603C979ED67D24E717D2F7DF54E - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A -CT = DAE871CBF5884C791E28347365C2E430BD07D87A06 - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B -CT = D342AA000F7D7B568C3CCBCCF9AE94F171C49BA474 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = 18B4D957CF6A5728B5EBF0D8F8FFD4897F86D162F1 - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = B502C2613A7D4923DFFB304A00BC7CCE881C88D246 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = 806470EA0505E878879CA5D81F6A8BB63D9B72E653 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 4F4A620552A90177A7A3921686E480EE721832EB35 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6378FC1AFB5A478D0C40D6F865C8A3277096011BB3 - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7287243E9EE2136F0EC45EA818DED1FD39C4D9357C - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 76F8012CD328676A990911D8ABBEC59A6C83331772 - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 193EB3E5F8DC62A614E59C4AB6A0D6C76984BABCCD - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = AE16682A7CB1EBF99C3453EEDD9433A94A020B9D19 - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = B38ACF0E1856E2D69C2F9D824CFC76EB8DA85BCEF5 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3049BEC81A12C6F4C75F745382BF425FB7929E2A71 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 74F9102E7235D5AFDF79CC2F86A069626D8A8DC4AF - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 92F0D90C5B72159B23B03948975EFCE45F37BC4FED - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A5B25737F029FD5747E8DA600ADDC421FC3DF9BD78 - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = AD5D5B55AC544E23349006CB8FDAAC46035412341D - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = AEE1CAE05EFBA565E6A6A5C3C0395150ADD336A104 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1073D9CA0BF09025DBD719016BA6E9E9566DA40E09 - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = D0E4CD2E7829519ADA11E2B64FDD3153AA9093C997 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FDFB61A16903F155CA526D6D027DE0BE70FD9B3B38 - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C0D61C5504C4FED9F783F36C7367FFF59638A87F4B - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = -CT = A31072C9A86CEDF1D7A2AE95F0663986CBF22CE9860C - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00 -CT = 72CB33721EAC511F61D72FED3148D2C1060545E25744 - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001 -CT = F33FF2FFF34B61F1FE3DA3BBB9034149F7D9E7C723CC - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102 -CT = C5881B562F05DA8E82C9776248D32FE1ACE9B31547C4 - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203 -CT = 229CCBBC35597BBD217419543D2DD6C090DAB6B3B458 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001020304 -CT = CDA18359C231D775C081B08645309621C25303E832FA - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405 -CT = 156B15211036E9A6C8524457870EA907B2C6E1230B37 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203040506 -CT = BAB6DD2B8C3C6407981FA1AEF2BA2C4252EF4C8FDC5B - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 0001020304050607 -CT = 46FA889EFE2CFC9AEE04508D81D3083EFEC0EF30659F - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708 -CT = 0D69C08B7F7D085F9870B3E4B57C4A27AA924910A74D - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 00010203040506070809 -CT = E42E624E4670D4902EBDEA57D735BDC70E70F7373A6E - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A -CT = A92B2DF13E3DFE952637EBD016189878100E8CB691EA - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B -CT = AE1771F20616D47E79B4F8298CC964BC5918A26E7741 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = AAC93949095AF5FA79A956013CD85B79A3408931B3B4 - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = AC33BFD0671027D966FB94A2BB3BA5F2B800F676C6AC - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = 5CCE01B369E36997F57308702D8997DADC893A013A6F - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = BCD6DF3F5D36421F6830257E03E9B2695B4D295C2698 - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E326130764573DC784BDE9B236B2B92824AE78E3D3D2 - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5A4E888F58E60E236DD9323CA1132983DFA95DF2C590 - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 789E94E45A71B3548FC47E3D5EF94BE789077059AF31 - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = EC91923F26782B256EAC02160F11C6F3C90E3D9E625A - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 4F909D1B94E321FACAECA305C5A8F9F7A96FB43B2B45 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C852CAF2FD6C567B5B2C87784C18FA06F0A40B34F43F - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 460D546CD979A825E2177FAAB5CBBAC22C845F44C296 - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 16F1B29C87EDF4485E1C78193A707EF2EF50085CDC80 - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A2EA6CE654DF5C6C9D3219D6F4019894428FA35529F4 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = E6C1CD7EAE80CCCC8290C25D87F4DC814291A23E561B - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A2714BC2573494F651B80C638C9F440C7006AA2246EF - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 26D59D2E667849DBFC541D4F7D1CE50332C1AFA9E069 - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = A1031A6D536F70CFF1F21B31EEAEA9BC752649339651 - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C556A613DEA8C2DBDBCCF3DAAB331AA865AD459636 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = A2D5F43B17A0B85C5D4DC1FCE4C007AEC6615E032C70 - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = B228891FE7144ECFFF434B9B2F62876454C002347CD2 - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = -CT = 154DC5876DF27039FDBBD6680D1DC7AD5638893679CD8B - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00 -CT = 0EF62EDC8AFFA660BCFD5A904D395CD057CDB25FEC7C67 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001 -CT = 989072B6B4D16607BC06DAAE817604571C9EC4024B6ADA - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102 -CT = 1DDAA769682005D93751100C67E180AAF46F07DFB49739 - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203 -CT = 4DD6494C0886372B0F35DAEEDFE2F6DD2695E9697D8BB2 - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001020304 -CT = E8C149A2A78DF8EDFFA99397B09B12B71037499BFC1FA7 - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405 -CT = 651677DA4E13DAB7B27F2FFEEA5EE2BB6EEF4428A623EB - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203040506 -CT = 83AB32DEC2997FE40E94048B0AA3E5601E4FB20A5E53DC - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 0001020304050607 -CT = A23B2B1E91BBC936764DD95335324C1E0027C486D574FC - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708 -CT = 7D91BCA7350A02ABE81F3E1F749B1A4FB295CEBC74A57C - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 00010203040506070809 -CT = 9CDF6B7C891EB11323EFA90F5B19B3D123C22AC783FBBD - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A -CT = 7033CDF4086EB94A8D16E61A89B306E52EE62821117E12 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = BD406D86AE6B79BFA2890B76D0AA0397015986CFF6ED74 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 9CA81D1DC927DAF7DF52BAD26D7D341BABCC8F5C260929 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = F6407F03C25676C0B5DC610627B364AEE44A1E74428302 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = F8A230DF6C0FDC6AE5CC7171B5A742D80D3C432CEEEFC5 - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 9B8E908FFD754F98C3EBF521AF6B369FC02C31679644BB - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 66B4CDDD237B5077AA36A2E3CC2D24F8AF81E45236D335 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5DF62CAC1B2E50935C540B0AD231FC128E618C7524D412 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 66D3FF2BD12AF7A56FBB3598A0FB106C736E31DC71CA42 - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6DFC12634975E0A29D4787147F28129A6D580F58D2BF9D - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 580D4DFD57E8BEE8F067095D4FEC14F6C1087B6ED09704 - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 4C09F1C9E04CA0AD7F76D960DBB3881FFB90C0B6E166D0 - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 1B090A52D3EE4BB4F2DC5F0B9201C8FE53B1DEC9CF4599 - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 6514F174119DBBA55ACD6F40D5C4F9CCB4867F59783AA9 - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 2C58F5C3E12EB2993FDB173A737320EC198A02AC261042 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 84141256567F3C8D605E3C59B87783BEC7B945FD6383A3 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BE1AB7109D49222D1FD99B7CA5CB4521A697C93BCB4065 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 7F578DC755D01E19559CEC2F0107684BBA16F5DD05DFE8 - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 647A0707D646A8A15D0D5534895726AB55760CAE763F07 - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = D3380BACEC9504B3E6CA576B5E34E8E3151D5E5BF8239E - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1762330744BC8D115E5114A6CCF7B0518E8EB4094510B4 - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C2F8B4CC50B494076E06708BD29DCCB7CC6FD3C03B0013 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = -CT = 5C5969BD231D42E5BEA32113474A933BE7A628D092D8C2C9 - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00 -CT = 708DDA169033F08C9A9466622326CB9D4AB0EC06EC4656A0 - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001 -CT = AD7BDACC0FF8F866DF52A62A6FA1493BB987F5E16686A214 - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102 -CT = 9599A4FD79039FDB75077AFE7B71C5CCE9B8CEB6616BAB43 - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203 -CT = 81D4C8BE0DC4E013F7437224507C4A8740F19F38627134FF - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001020304 -CT = 58D2DEA71D20E8A1A25C9D8A7B665FFBFAA3CB012C1F08CB - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405 -CT = D71362C061DC7A71F984B426C1E801DA8D8A9A5D1D2EE259 - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203040506 -CT = A49585800763E9E7C5262A01E512E3E71C57AAC1D9AAB0F0 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 0001020304050607 -CT = 2300BB0CAAC8466F7B46016AE901C575183884847AFAE7BC - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708 -CT = EBC2883CE8A4D1A422891C1B6779FE26BB53B6002252A430 - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 00010203040506070809 -CT = 45C129834B3F9456ACA8B01C6590F80364134F8A7F8C096C - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A -CT = 80004FE8CA86B9CB41255757F9F30711CBB3FA274D334ED4 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = 87914DE6AA181F817A933FF47F3F3E1EC1AEBE8454C7C26A - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = 5D04B00647F19E9D8507704830E0C6CA49630246378AB67F - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = F17112A4813BA4137C9FE85A4B8292975BC59C955BF09393 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = 7C589FF88AE91966B5628C0E0798A0AC509A5F4213138511 - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = B3B09FDD91F13A60B9395B41ECB01650F42319E4BE625313 - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = ABC16751BBB2DBC7482B36F3B2BC93878D1A0681B9DED437 - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = EFA8BCD1BB8449D1F85C55545CB3B2EB16D8E3533A728334 - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 968ECF67EE8C8636797AFA658D7B6CF256E6FB75DA25D1A5 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 56E1F78CAC88CB5F0C24F768CB96C4DA68E15ECB3D1F8ABB - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = CC3BC5D01B962B40DF7D9FA8889F9DE636B376B8DBDF04F5 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 208CDE686B79B9521B20B2DCC2DEF8FEB40CA9971CC3D7FC - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 98DCE19F92CF91F5C12039F74A2DEC2270E7B2D169C2B909 - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 7A4D2B0BDE48AFF2D13DBE43913787CBABF14F3CABA77FF5 - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 53C749CDC7F7A5874E1C21AEED4ED2539D20E009EA4BB3F3 - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5DE693BCC182CE18E4782773273F6BF1797F570367E14C3B - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A9A8EF9FFFFE017C6A16C3222CE4239523227D4D2B62EB7E - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5447E40009DB23D5E03AD425CBA0F0D863008AD05171B349 - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3C44AD770F1DE437DDDED27B29725307F1EFE3FD3B2E0131 - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E9270EE3AAB145A08DAD5ADAEE5E598CD840095381BB66AB - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 39DC0406462BAA4D912616CE47CE4BDB2E9DCF0284105DC9 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 97A772BE37F2D456BD04CF6462B2E1893D453562F57AA260 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = -CT = 5BE263708D4FE5068B1D747B1EB89999B9E8932452EEF50F88 - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00 -CT = FB4805526F6315A44D063F75FA3A68BB9C3D48572771B41C67 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001 -CT = 1D39B806F264A950C0B2B33056628760B4B19EE9C538C82612 - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102 -CT = CE643B2473AC546B4B4F94FD8F8680F4B069755FDAA2205923 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203 -CT = 63ED5E364E7493A319A8A6B7DE6D7E24EEB6E2050E1E76A1D5 - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001020304 -CT = 68C449104414980FF803C689039AD22217635BAF7EE31E5F6B - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405 -CT = EF421D79C52009D72387FB3538D534B7D18785939323E48DCE - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203040506 -CT = EFB7F29B24E5E6A67565DB1BD515535EEE4E715D86A92EB207 - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 0001020304050607 -CT = 92F49729A4F8C911CBF1DF4B6B6AD2FCECF313BD85FC007BE2 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708 -CT = 653C3CA2403B42456A3FBB8144A92E6F647FCD72EF3CC89E63 - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 228FD202471D00CBA220BD8317CAE8DFB7060C3F2136F8D9B3 - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A -CT = 30DC82B000C89CB24FA829A1E99BE31A6279245978A29F8665 - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = B79D929C70631BB256A466867CEF0C5A6CB7085E07C424BE31 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = FFBC07F5DC6C8B200A5A0151659B904C77DC497B67CAB10AA7 - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 54E682B303371D368FFD6A57D209864F003DF82415B55A56E7 - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = 96179467A9A64DCFD739FE785CBC246F683E13C4B9758BF840 - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = EB112D358BB4CE4DF4303739BBE316BD053810228D16C81A8D - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 959C162F017F20419A8E49AD7A76712E7EC5309805A9CA471F - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 3A118E47BFC52A47EA69F6CBF2A2E4EC1076DCE5B25FE52B94 - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = D64670ADC3B4FCAA0745801FCD091FE211234D213414EAE1C2 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 27945A36ED43303E7E27D8AA4E6A24E4A61C27020D66A9AC20 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 47FD4AE4C4CD608D7AEBE23E9F5437979BD6E5F76F2687BF20 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 514B0BB452D9E1E207569B0E2C4891A9E018D69382D9F6589A - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 11380F6128385B90507C5A00D315828D80CCFC65E7407C0438 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0417547C1818F0CF0401785C4D4348B0FC8C11291E2BE76531 - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = FF2E62411A330FC37BF94413033992821790D791238BDD48C0 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D7AC89DD9E84F2CBB2F0FC8BB47A966AE80A7097E32E138A75 - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 94681492D66E0D5796C51A5AAFBBBEE31BDB4726716EFADC6B - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 92096F2AE6CD9F5AD3FA63318960D86240E65DA5FDFDF02F4F - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = D606087C6F2BEF9C1AF78D308B69C28DE482AA94F453F35745 - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 74EA5569AD1204A9A1442904F10F9490F941331BEA43153F57 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 547B905898BACE8AC5B30C777A8C82272004D540DE4AF680FA - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 7F1D21902E9F986EE61D059AA292CA49A093331FB4890573C0 - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = -CT = 417A401FD8D163EACFD626B91B8E962307E74173A42A8895A972 - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00 -CT = 47465F9CCBAFE25C2D870F83439C825B77ED75DB22D5F7968D73 - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001 -CT = 80A6E06A37CA7178187149D84056DA5331ABA8C2A43778FE3162 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102 -CT = 4F121A6A58B9BDE22ECD26D8EE9D69C7BBCEF3A03AAE9F7A75EE - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203 -CT = E6CE61DEA2A1AF2B6D08EC9E7A8DFE167F48B5EF9DECB475321C - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001020304 -CT = 05EE326BF0FD954607480DF7D9D64C30940847C8E2CAB484BEE0 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405 -CT = C1342C480997760497BCACD24F9C78518422F5BD1A7E4152EB3C - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203040506 -CT = 3017319D6760DEFFDE8E3569B0AAD072B2E0FAB1206BA1D13CEE - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 0001020304050607 -CT = 6E14E60D726891F9E9B2EE08F7CF41073CD48779CD948F26FF0E - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708 -CT = A39B3BB9B7F402292CC7C29575BA6D913AC2D07E36B71B31F078 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = 77416B8A8BE208C376814B2365C31657AF8BFE84B5BB1E9A42F2 - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = FEF3DC85261F8DB0982583B50EB0B85710DCE9CD318486043F29 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = 6505E4A067193DB3837495FCBB5132EB6ACC21E2000D416BC7CE - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = A054A33F20991995E6892F85CCB68A0A15A543E0A2DD23DE9A4F - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = 028951E19DFE330FCA5D2029C019877D8BC6109EEDFB82DA7B7F - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = 2E74DE3128E29160752A2EB0C1E129E68EF85930AA182B278AF4 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = FFE3CEE034F334D1E6B619328E689F3FD83B0011C7DDAE126FDA - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C0166ED0745C3FB97284CFFDE804630A7768C1674E92B3573FEF - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 51B57B7557B88014C539C6DFE2508C0348A6DEEDAEEDD182ACAE - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 28D60A1992128C9AA6222B5F01ECB665ECFF92E8311C8CB8D443 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 160D5D6C6C4CED9EF6725B6723D407FAC5EAE7D8B16A22559DBF - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = CD3FBA2642C99AAD68560B48DFA5DC458BE19AA3CBF04D513162 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = EF62B0F90407CCFEB0D69A165DFD90761BF7AD026096E511B31E - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 522BE92F66F9AC7663A80A790034BBB40398EAC4F1EDD5D1D6F5 - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 1FB3443FC36CD66D596FEA55A615C20C9580B1518D7D3C0EDAD7 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 650DC72F9E5638CCB5559A7D34032C13D4DF9E730977D3BE8C94 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7DF1F5E6AA4EF9317F844D45E496C171C73BF876A6B7E392119E - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B7881AF7D2348C01BD037520499B57C8C74F453DC58E9C5A8034 - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 7ACD45AF4767617E962B06D204C41283FAE6292E4F1F27A81DA5 - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9795E8D1BC1FA2CE0F3602BE2230C6078D90819D64902DC6FBC0 - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = AABF485F18900481FC30F0BAD5FDF256C755CEFBCD21B52710EB - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9D2DDC3636195114AACDDC27DA217810E6745250488A460AFEF7 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 45EA367CD50C17BE85841A4644AFF3A5677A2D574C5E8E1C9B59 - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = -CT = 898E6D4C6EDAAF7129B56E8FA9B91DBCC9EEF9BCEDAC2377F170E8 - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00 -CT = 743A611C860732A1CE07D7BBF7F0D5313D050DC2743FBA87242807 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001 -CT = D294369D2A025273182A8573E24C4FCB61BDD6D0B94CF26A6EC03D - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102 -CT = B34BAE9DE809E45A1823A345C2E80B326C430AA8B04EB22B019DAC - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203 -CT = 60DEC498AE89EF345AE14F41D8651E80C825ADEACC8405FD7DF8B3 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001020304 -CT = 8F5A1574142BAD43241F6CB44F377131BFC91C6E264A7BA8FF86AF - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405 -CT = E2616024885EFA73B8EF8E45F5E96A364E69860EC694C33DB86C38 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203040506 -CT = EA41B3F2798CCC0441FA345259AB48C220D5EB6136C2292CBC483F - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 0001020304050607 -CT = 3AE56ADC9513339BA3715ED2F00D702553381E60A00E11364082A2 - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708 -CT = 61D331781743F0A9B3F84709407FD3229112E560DF93D1E8978E10 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = CFCD650F520FFA47743146987745054C1D8CB6BF2EE103B468CA5A - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = 41A541ABEC3801D768AF6AFDA106F2653F1C65A0908901B6455C1A - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = 01EE5A66F6AE36526FE3FE4464609697FD96D11832DA50DFD5B05B - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 730A719793D1655DA804BDB2B617C3557FE3906111B87A71F96043 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = F07F2AC5B83722A37755F94949CEBE657563238141200559A4B62A - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 46A5A52497D3E2B88E656A4AF0132D1D2F7BA4AA4D909E3215DCD8 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = 3DFADB0CB78E16841A17612AAB7DB18625AF278A36E5C657E18B8B - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 19DDE066B26710AD09A9AE03244A0AEA1EFC20A49377D71B91DF7C - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 90697F33E8740B12104889123FB588588C85156CC3F545F71E28F8 - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 76F0D030E6BCCADFE05C58C2D06928D41640C0F955969B07942FFF - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = F97ED7A7F2ABCDE1854C9DC1CA4CAE0674AC7389C3585FEC57BF22 - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = BD085B5D7B97C50822761D91842FF8DAC8A17E9FAD6F150DB2D1A3 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9834186FDCB5F50E8FEC6AC248AB30730EBBF8E51240A6F804503A - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C1FD1E013EAAC622CEBB0B58F1CEEF33AD40F646FF0E273F1076B4 - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4F80038C08B123E82FABB5721FAACAF1C1A485C254393D9156EF6D - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = ECF12ED55F93D712524122C81EACCDC04E433AE1077F7D2959371A - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2615223207346480D1B37223938DC613BA398287325339E3284E53 - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 54D0A50189922594CB014AE39788FAA4E73C82C040B3AE6A3005FB - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 109B01B343F1441A78D34247A26223392B81E2A25BBEDFC2889ABA - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 77A633ABCC406F677CFFCD7FFFD906510F0186718AF1BFDFFDBD19 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F51AE36DA18CB9CE603602768D731CC4910FBA4DD8659E008DEE37 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 484633F8F2DAEE0F75658C77B347A6E05847FE2CB53EC4F678D422 - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 65D8FC9BA33E5A868044C555FAF1B864FF8BAF91CC0688C8F36F15 - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = -CT = 1E2B74181926B2A3F3EA1DAA015C9AE0D33F722341CAC22925062D5D - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00 -CT = 7E50BE19F37A442DD4ABB2B17A6AF374AA438AAB172DF372FE3828FB - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001 -CT = 840CBF7CF3A320E2C7677FD47132DD246E425C723B5AA88590ACCA05 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102 -CT = C0BD82892F73E51F343140A9E4791769C23BB873D1BEF18E7AF77F4B - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203 -CT = 5FD1B72489214C2DD414059E0FF55B7FA3363B761096D51876B96E73 - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001020304 -CT = F970F6537F44AF43A6F286BE809C794F2ED2935EB577910A890B4A71 - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 505888DB91CED0DBABA92E6C9D461A5FD2352DFE6470BAF150C6F636 - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = 9D5C3400BD75B97F46B702BE31BCBC9565A1DBC16621EF461D49C065 - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = F5421DE5172491C21F52B72374C7228125BC35878BACB7B10485EB9A - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = 297C7C2B53D5597C5A8D41E8FF05D5F047B71B12231D36AD044FD091 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = 93925CB75BD6A1D7A6DF46B9BF72738A722488239C57A03063499B86 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = ED74D775171C3FDB3FB995D7B541443AAD88D9CBDD6C08027CFEF49B - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = 3616A2C4B1D086F16D58BE876ADD28E996CE521451914F7384DBB14F - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = CF1EAF6D3B7B6B46570BBE7E541240EC831C963E9A3E6517E04C09EF - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = 4B8633354706E8017B41217322DA11C12771839BDA546327D5C0E827 - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = B4DCBCB99E6C01094196E6664CA3A52DCA9FD9CD97C98C36884C293F - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 2C811EB8B46F5D5C0BD8583F15157DA7C6616623B10F84D41252C8A1 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B566B8004789E9FAB1D25053C2D8687D8C1E7AD41A9CF406B8C3EF21 - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 9A70D5A3D1B7362755F2D1FCD8B77984A18089844C08C68EA1AD7DE1 - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 17CA2DE9DF9FC6859054D06B6800C8C940EBA59E654BC520803AF4B9 - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 02D0FD0451A4C2285016CFCE6E4A0081998EC4647BE998A8FCC5DDCC - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1EBE574DB78C4B43B2BE37C39B4625B30003999584F93C3D8EEBD07C - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 4353EA41DC129EC25A194EC8157CAF7C6BED753DE6E3043FD46F3073 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = A05DF8B091EDB7004DCE017A36652C81C3B62640CA38B425A81BB4D4 - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4B9832298D10D17C6B7C602E43FA27F5C851B14879E0BB674B042E1F - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 4199DF5CBE6A76F9873181439BEFB5951E0D782750B61FF65248B989 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 8324CB78B8B205AD20E2E78790E91F07F2C9900F9B789F51A00D4F6C - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B6D9EB62FAE9F5EDA6E70901F6CEE2762A871C0F88EB6EC48829019D - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = EDFE07B84EA66515C8C67317600AC561076A6A44E5990359109050DC - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EB6E8C91F6F0AAB33101E6A2E0BDBD2C62695C901E9FA1554D99B8D8 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 29EDC1DBB1F2C460E6F9B44DD95878D5668F2EA86259E036539B91F9 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4C2D6AF4C1E543AD0AA06CBA2A0C80E5A093F5BD45EBBC14106286ED - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F3DCBD428801ABB9D7EE6F645BDB562F3F33C91FBECEC5F70B7D1F5A - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = -CT = 527037DBB6316379B83190EEDCFC83B85F12FA430AF62BC3BD46A457F5 - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00 -CT = 2C448FA21FCF863A32ED25F86440A119A31D9D7F5D45433F917A888417 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001 -CT = DB12E6D16A81724689487AAB1244D17CE73CC8D9A836FEA6E8B0D3B3EE - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102 -CT = 9F211B30F2F96FE0CF8E6ABC62D1B8A2674AC2C5610B81209916B01312 - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = 3BDBDC4F67A978FF2763871B9E88D8D187CB7F9D18F7CCFF3D8C7B1E9B - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = 519905C56DD0A94811BBD95F235E1F5B66AFAAC11DE3A1AF7B0BEBA645 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = A1BC5BC5C41A851535CF2257CB42DFFD3EFE4AA5F1927D71A2E90D174C - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = E8B5D5265E359C47D37B3802B0B258A8A1F1B9E475444E200B4A8D0F81 - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = 73734BE0492ACC96A96D75062EBA6C12821F82C0C7E0E18598949F2ADA - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 7427D5156504310AFE62F9A69D8E561DC3C3E8E114EFD95EF1EF7BEA96 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 431CC4E4D5C2410E44713CA00ABFD7D86B1B7B558058DE765D046557B9 - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = 573B1822CBD955D66346B851B0A194905B70BB030F1EC7C1D685BD8B0E - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = D69EA8BA45806F5580B5EF458A9BA479D62FBA7A1F4B5F3AC327C41568 - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = 5E0F8A474690944143927B8B4707062856F897368D1BD6549375B8B728 - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = FC783001C4248D14BFFD8CF0056CDC6BB152A430B159271F3A3F8CAB87 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = EE0F2AA6729934CB5669775C4747423281307001B8D223C4DE9675D83D - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = AF03219D07C085D90715CE1D707A5ADE1691C59F5EECBB217E0F09BA5A - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = FD0F1FCF69B56BD2F369B2D796F89021A8F6F90573333ABE5E6F1AC90A - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0F4E77A9A76D94345F50FA817ACD11D44E55168D192806FB059EBAA6E0 - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 6482ABDAE86154DC8F4CACCEEFBE24A0FA04C00D0A6CBFE5CAA68796F2 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 13AF29351F3DC02BD8923D385BA685272C4FB04F172B62C6B68E3ADEFC - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = CF487611727FA579BFAA502A4BBB1A9980B4240095DF1154370086A332 - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 2F0962A3390F194D0E1E2C7BEE9B94C2FA4A4D0FE0C58651A05A16B2AA - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E5BEF535B4A4B172C0B915A94BFD136DEA8E646B8E8E6E358873A81F0E - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 2C090EE076E36E5FCAFBEF5FC857EB351CAA153F146BE83ADE92DB0BD1 - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 112B5FA0234AF7E30715C732EF640624A535E980FC8FB2022C9A2D3E65 - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A8A4C1DFB7A429A4009C449CAAC9FAE88EBB03390D46C31AA083E29EBD - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 062803C0036E2D02088394F6E8E4D0E32ABCD9DC02C0A59A00F305F4FA - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 03A9CC582AD5294FBCDE30AEBA14C96618A9E03DF396D1512737FF6406 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 22A903ADB5F1D88183E73B4FCBEC65AD3F7EDC48316CD310C362C25DC9 - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A4E4D5D16698AF120EDC599D4ADAEB80E206B8D9E5C2B3BE9C4D4E9816 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F610FA9054B87AF447391DF7849158AE6A96C35A329D53DD444DE2024D - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6D1D4CFD7FA6EC0BE0832C20BCAD4448A08437A978FC56B46357B92BB0 - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = -CT = FB9C359BE1F08D77A8453A44F2133ED641C148B9672F8FBF9C4EE645A829 - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = D45F82E41794796F893E44C7D687FD881DAA2A8A215657E1DEE551B92421 - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = DF911C03BBEEDBE875FC1C4B0833F3D52BB78C4F8D856F618AEEA508B059 - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = 307C3509B54F3D58FE5CA461DAB9DBE3AC13F4F83A92613D08449302906A - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = 03037F89B92D1EF2F25E8DC8B23F066946D6680E307FDA7719BA2B21116D - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = 1A3A0452381D22A500B6DE2CE1809D07530E3A5C33668C880FA9E9554B8F - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = C1772BEC9A251EF7D441F6B0706DE9E57D1E3C164086BC3A8C8957DEEDB5 - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = EFF35FBB722297DD93BF0A5C91971FAABF58A054A728CCDBEF5905683D19 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = D9AE466A18193901C0B444F8EFD87104BBDCD55EA3AE5F03344A8FA41223 - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = CF0B552C068810DEBD13B4DBBD4B8AFFAA46BB67A036C1DAAD03851A8B03 - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = 57D6CBE104009BB5470E3BFD4071303F4D7C2111D4AC12B2E0AF7EC67BC7 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = 1991A5CFD3E27A2CCE2C5449D8633444F906188719CEC010C9656B49E085 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = 220567A068244A74F67CD10E7CA12D17376789C5AD18979DC87FCD3CA1FA - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = DBD3716368FCC6F85C6BE697B5B0902BD66B64D751F548B2F610592E661B - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = D784CE4EB1AFD839D02640F78D05D3391CDE5FEFF9707D394A4C4BD87B46 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = 478E15FD62E0FE8B5BFD003372AEABD9E1E8CE8E10E8A52CD5C4608D6AD2 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = 7F2B1BCF9BA9254533BB3FD9D0550B8AD972DCA3449991416FC1762F3959 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 411653842D000FDBEA72591943EC4C400A82C7C3529BF89D3FBAAB9B0153 - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C75A430A5678887621025E7F96618C623B19B6B5D14A5DFDA8D909760051 - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3E0A14C158CB8228A35B0BE547AB09DFC6044858E7DF83644E7494FDF5D7 - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = DDFC2BBAF14F1BA76F2DA90FDA37602144B80DBD0FEEC8670C16548468EA - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 91704058A21B998395096BBFA072646AAD85407BDFE01F633FEA9BF5E3EF - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3A4649E01536CECFFB26FC28C7B1007C14FF54F52E37C8A00D7B5D36AC39 - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = ADC8E980C9BA3A7E1152BFBD23C849861065BCA92B5940C8F72D970501FB - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0A0DBC5E24B05211BC37A9C73F38C8E2A90307BCAABDE2C9EE2053754AE5 - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = DDF714BC89DA979D230A0A7BEFC339E53C3BADCA65059D7A4C139C40536C - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 6BA85BAF555666C75C8EAAB01F7E8C12C34144B64198A1105554EC6644E2 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = FF1152D02B3429B52A8ED1D9E7B6107D6A91D81FA040832D92601DD14DE2 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 55A6108B6FF65347FA8AE495EEB8893CE4FB67992BF638676D43B9B425A4 - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 43C85FCF93350F48EF49FE701FFA47F732738FBBF5E909FCA0797D3D25C1 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 8B1FB874121CF876E610DE43A87FBE5C67B81B1AB2D142959A63FF7D99A5 - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8C38A9B541A042442A4F95E7A9E388C22ED07CCD5B8FCA25399DAF7293A2 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 601C4839D074BB088F2DBF3BF17C02A0171A8FEA76D69D255566DC89ED8D - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 752B4D49236A34677BB669C5E7043221183F83810491F330028CB78D5A0BCB - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = B8F15776B2D5A0BD858F0BE09E60E58B72B2C838544B99FE97CC00671FB9E7 - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = 51E0DA401E755248D1EE3C16D1A6BCDC75864FEDEB32B84021BE424F14766F - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = 24A9028600988B2AD0D85651BDFA3BA0165814C20F001047A826111DB473AE - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = 40E2A3AFA5E8C6DD6D909A5DD40253530B089A3F56FFD844F1EAEC10381066 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 9F3E224C46D252B5610A19313A2DC4315DE51434CB92388A58258C1FBDA708 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 2BEC7FA6461AA22239EAA7371FC6C358AA786964C18CF13C37853A6388451E - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = DE3CBC41D0F905494928FED9E58902CBB6C450F9516B751E64DAC461D3EB00 - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = F8B09650F384D104B27D69C85EAF6576D6E5BEB67871F8F718ADEB45B609AA - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = E801F7527147E9E8560A2C50AD2C096BA3FBD3817BA2F30F295E9C6C9B2AFB - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = 0B898AB19104F6694DB7F39C29A8532D8F78CB84AEBB38C4E182D8ECE36681 - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = 63DE1B61CEC7D9C5128E1FBDE46DA6C3F2880081648FA7AA8F655840CD32CF - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = 23DD564AF23246AD617DD032B77E76603A6FED2FBB24B0C34A315193E20738 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 5C8BB1A52CFE0CB672E1AC2F8BA1289EA41661FE8E4078E770B9D35B1519B6 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = FC55FAC3E9983783096869398A4F8ECC04381C936A7DF63875BC644D552EEC - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = 03161886CA537B1A1B463A92EC241E6CD04F238A07FFB7760B5325632A8998 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 2564D2BFA46E6C8F6665FDD4F9CC0E7D2DDD2771B7A46ED59A9F0C73449507 - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 145B7D2FDFD167C6FFEB4336815F396F2AB2636BBC5678CA26EDFE02C07305 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = AEEF0D97A94A75FDD7BA5A019D0F7AC11B1C85BEF5BA32E6AFC90ABEA732EF - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9115F8F46E885681E986CDE41354B99CB4BB724E64B5B2C7BE892C7B05BA0E - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C4DAA35934275F7280E31F657AC0DDD9FA26D4FEE95148102FAB951AA19ED7 - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 186E9A7EBCE63A29AA751F479913BFAEB5F6519457464B24262E253C5B023B - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9DEC0DFA0792689B364E63E3B5A2C830165B9C9F5C9F9F5FB76E55CD0E2D7D - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = FF83326367E5244F214F161E4F03F1CA5630CD8D4CC0A83024F05F18A37172 - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 77E94459A89F435F4FEDA8159905E0883F6D0EFB932FA876F27BFDB3747CF6 - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BD3D1795702B7F70F9DD0ECB2FFD63DDDD8C8BFC3622440275E30CD0B1D211 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 524A23D1ED8CF5B3BEAD18E5FF62A9F69A1FDC1F7BFDA223D2764D49D546B2 - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D3F4F1AF3F9B2661FECB51C0246306928B23F647BB45A8A3AA50757464485A - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = DD5282CBF06715A50F9E153D9F14EAE3550D53A8525E36418B0D3D32CBED04 - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 99514CFA65EF1A22089CBB37ADD955CE859FDBA6C44C859884AF64B915FC17 - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 7270FB51E7D3D6E764B8D00D55EFFAA77659CF60C5328F8C5A8F7540DA8861 - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B2121A813145B074D1A2A9394721C644B4C1BC9670A412C181B7AE7BEE7F86 - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E4E133FE6DA3F479EE2DCCEC9F525E10AD58EF34C210E44CE817207603DD92 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 175FD5A118EE8E26204D4EEB64A57B80D503B56FB1A55F630373B03AC18D2CB4 - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 08A49A502F84177349F4ECBFAB8D238D9F6F93734179708A6E4BF30CD7F15FA4 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = 2E7CC128E9B45CCEADEAC5067F50047E35C8CCDFAA64B6AE5EB942E6BEFB2501 - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = 04CD965BDF7E006E2FD33A6782402AAD224805B0DE4B60EDAD13138E7425EF7E - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = 1F9AB687EBB5091D500A0C5E0C216DD689F1B36EE4E2A0C24CE4ED79A36D9D1E - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = 45C998D07A4547B703F37B66DF9BF9A905359446527195B2A8BAA2B1BECA3B82 - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 3E038DEEB88D713D3889B94E45E97D3DC3D3CD2B01DF6FCC5C413DA4E06D9A0B - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = F9EF0644AD42F1FC5DA3D65D0020569C3C73E3E8E99DCB0B13933FEB6A6447F1 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = 2FDBEB2BD7CDF6FF6EF33BCCF9A6D987CBA5DC1352F71AA28B57C776C85BCA14 - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = E4214E0F290A482AE1EB25F002D699C905233304B705D9A5AD2CC26FF034E979 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = A66F99849BD1B70E7024F718C5A54133D59FCC81E125AC429935F279E636EFD9 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = 76F90C9415371FA9665837C83FC3F2E467B3D9236BD807BA0B79E27F4DCB1FCA - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = 8A9ABE4CBCC7D51A704247E1D47141DD1ABD9BB4FBD37A62B9B4FF0AAA5A966C - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = F452D5C390D9FD114F268313A678FCF79307799013360EED61D2915FFB976494 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = C4DB122BFFAB86CD60D10F90D936AE1AF6221F60FC6A5F32AA89CC859EB7C494 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = 3DF1650330F4FABA26879CB034299879337EFAD5676821707169AFB48BC94044 - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = F49B8E0BEE9CF22ABFDF3D05F47966C2B3C78F6E39873EDB249A577209DE0DD1 - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = BB21C6ECC59E96B0D195497CD7830B691E8115AE8CC3E5FE109F3B24808397D3 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E66AFCC77592954947D7BB0B8858ADEC47C9926C74F6F0F1102AD6263ADC701D - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = CF67A5C52654F7FBBC2ED7E94D8C074470BE1DB229E72A5CEDC81E0E684B802B - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E03A7413094F52BA89C36E19456A17F961DF70298D891C170030DD3125DB73DD - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = BB70A97797F2D34389C2482B4CEF7903243B4FD514F20B2852A76A33E0B47009 - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 947BB9EB496EEF895653303F308A4842B6CA7700259C9E34D432588F1FBB3235 - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 1FE74C366DB27A76FFE0955511279D94096EB9D3E7DFF2BBC5D39D8F0D0282F9 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 91177E9E50D5709618EFA1F565A73B5B0BAC36B2C67922F97A8761598975FA5F - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 30D60A54D36823E73B34E548F5C9DACCE208B59D2259EA524D735C9C2A59CDA0 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = ABB94125845A648AFE01D58E94F77AA59E9C231042CF1ADBDF78F7D77A885B75 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4011E1DF1F1146D338FA56A495D8F77F45D5A131144950AA46145B3E131F4216 - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 33974764241AB0BCFAC456358F133801C92D85BAAED8E8C526929FC1535A61B2 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3EC3F166E2AC3AD635ED2B0CFD95DF9C1E32AEDB0E72186B4194CBDAEE58AD31 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C57D298913953E339469875DBFC2F1258E2546DF119AB3E8F71B150B27CD4A53 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C6D4E7E692095CDE08AE35ADF861B54966265F112902FB8832BB1EAC6A6CA36E - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3172D7C6B6A3A5A71348F4F6E289D8F5507A7912BBF5C1D7B21F082174EF220A - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 85E5E8B5C25EF2494426DCCFA0243439A2ABEC21438EB81E9880357B285526059F - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 8B14D5089D3EAF7A682E9DA7D58AA6133FB74C1D02ADA2D48D97A8268FBFDC7CDF - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = E35A777E50274F5BA836028C8A8768F576447F6DC573B2B1A97CD5CD1914B89B78 - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = D3103F2C463FAB11274F63D3DF35AD84A7B98E52FCBB094F008F6415EC37F4E060 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 35FC5BB2A7C4CCF2FE5397F5E81A10FB3AD023038AAD21D7C59E86658532D72C87 - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = 535CD585B4F7C23B7FB760552DB0BDD5BD3944CE1478E1E1B2444B82B8CCE94701 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 966140B8BB5DF90372DA30D8B7901AE370730217CF39306A84F78B4DDBFD1FBB63 - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = EB907727AA86A28D14D088CCD93D2CF009EF62BC4943CC29EBC870968899FDDE8F - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 677E1CB8F35B356DE472AD96ADAC9B426A7399F41C9A45B274CA299113447DD6CC - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = FF019304A30A39DF08E0270E65E6AA5AC9755A87A1BA28AE7B93A8ED557ED1997B - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = 0CFFA3E89A887590C6F293AE7CF13DACD5E6A6D2ADE05411B54433EB6A1461145A - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = D88DE1BBD51D2E512C72842368E11AED8F9AD7F601A4EF66C4475831A688CD8B10 - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = 6498F5EB2BB11E5C6DFADD508607654BB1327BCF4D6689B35A580F434FE61E0725 - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 0CDE6BB4104610256FEA05581552C03EE473829DD34BBADB54682368AEEE412435 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = E5BAE539E77A5C49748EB8F7EC7C8E875BE0C83CF4BFA51C2C14BC628E323274A7 - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = C8E5F451D6F1B1FC43120EE2E39CBB56A8D767374DEB9E99A84166E3101B723548 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = B72093294273A6E75216F526E139C7B70CD260D78BFDD1B75870F5C41E1B1AC5CB - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 3CF98622AE1D0049FB80F3CCE95520AC6FFE2FD8EC9AEBCCCF8CB4B994AB227AE9 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 57816B0F588CBD6270FB44A9B237C3091BDEA8AC38CF503CEC493F1849C0DA7321 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 97CB682C1699B600E4F1FC73BF5B31604AC1A2AC8C365D032F444525695663D216 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E1BD6DEB86D4AC45304E1BFEED72623E03BD85218298731299CF61735A6811ECD0 - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 714E4407364BEBAFFC963B9C8A0842F76F1FC8AB906EAF2BF8C0EB6CDABCDFA983 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9C709448949907B4A2158E2402A26DF8FAFB7A69568232E5F9CBE11E277FB74E56 - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5C5421D3D91C38750E3A7C616A86EBF4EC0F65F8DC96F74591CF06E5E5AF0D9F89 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4929CF6CA8B2DA94EBD47A7FB04D47D332F181B77CFC0A3EFEA2385F969F2A366C - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 64FBCFF38D17B85A8045F27755F6FC5172162CD567FC1275BE68B1241CAC5C7381 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 18E2A70FCD8E9DD0724E903C5F8A3C6AD81505FC14B447DD83F0E52A76B6BC02AD - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 930D0E840E833430F0102589BC039D8A8F8CEA816B936253D45B8BD031BE99848B - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F808FD979F97041EE4A1FC747871511B6F801B6AC62E1219A5A5CF71E1E03EF7DD - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C04E7AF4C6EEA6884F75F95EA0513253AA7BA93D24738A5543006E95DE7BE6A280 - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B113724DFE350D62B4A2A1DB7E5777D74E4AF3970081C406CBDE95ACFF337C4392 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C01B992C11948197E9D5DB4DD61ED0428DE3928267336F668B0B038591FED24095 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2D36F213541EF3E1B7FC0CAFD4F95102394B3356985585488FFE78B3023A9E36A6 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = F7456B8A3F5946A0301615F63E182549C334EC0D255BFF202B5BBD1DEB25D14D97DE - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = EF4C9EFED31AC74ACB39F72DBA2349393565455AD3DB1E7541BCC24B29F51C9EB3D7 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 28573AC9835D87CC637AE77FB011A4A28F0BF211D6EEE2689BCD81707E4819C58A47 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = C8CE269A3BEB8470D0AB488E5DC78A0EA9C792D6EA949C892B5DD48B6EC9CF23C9A3 - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = C8F1C7184967975AAF3F3315B4CF4A103B8F8538ED28134F283728F3027121D0C19E - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = A01874F97E7E4043662AF82E10964FDBB9361B82573589699C778749D1A5A7925391 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 5BEC7B6EB2B304A5D4A97DEE02051359D3D612ED836673C65EE0210678B03EF0C5A9 - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = E97BA17E961C12C37A61DCD65BD1D572459B8CF3B8AE0DEFCD942AD1ACC1D8F5B2EA - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = 262F6FB209AFCEB8179124A26DC6A8D4DAA5F55E607A4B853FA9568175E1184A4678 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 11BA7F2421D2F691CA892B5F3C2BCD8CF943B962A6929E052B7D1BD3D707DBCC046E - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = B99D3FC9EF552C7EC227AA49493CA168B668C4DE8AA984A660893035B46107E84B75 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = 81EDCDEC0D17DD44F44823C5FC3F1ED4DE3D7811355BED0520166C78F0956C710520 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = C4723190B310AF42923DE21DFD4B3266C57A347C3A6793D26F74651F082D96550CC4 - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = CC03EBBAB4C4F0ABEDFEC11073B673D8C82D940ED23421F408354391B39DA52808D9 - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = 38592C2B6A459D24D4C54A9F9843B89EB3BF756965E6B6FB59558D05A340BC9D95C6 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = 03BE76C471FBB17C8A56065193395A361D62DCFFBFB6EE47CA077FE36FEAE76E82E9 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = B1439EC7804B182C8DC2030E63476270C31678413662BFB4BE6B5EA1F9EFCBC2E4EA - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D0E7B4B94B75E818ECC5B3E6E032505B188DEE87858A167181A8359832FCF4AC62A3 - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 15037B7ECB0F770F1F7325447907863EDB978577EC16BD25199EF00AA22C5F4D5367 - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E3CF056A76872194CEE928C2340B8EB92E7104058E908A357530A433C73A3A45E2A2 - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 035C4269E776609D99BD0A1C7DA0363CE845CABB840285D523E57AAAEACA18ACED39 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = E4A773A0B52230F0E9E298C2E9106CA5E07FE7CC229F0814458A9872045053CEE5D4 - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 93B44DE97126C4D474AD76FCAE5F5B6C70F2D36ED8E6E0FA83A68A446C2C209C0249 - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 7B7510CB905E0B36A79FDFE85174481F9322B31ABA932E94455303DA89256F03FDCA - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = B49B464581C73653EA2BB839875A166F39B5BA01CAB433763F408843A5518C79D400 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 47688AE2BCC0ED7C5D8AC257455FE1F38D84F378F77601B2C65084B08EBD5B82D8BA - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 519788B4C87F7CEBD3E870CEE1910B1B82708C1D47411EA6295E3C255388F9527C1D - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 40E6B077D1CE62B31A051FBAA08EC0F92674F9CE890E017DE0DF66C7EEFB921EC18F - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = AFA787266CA4FAFE1567CB1A136ACBE0337B1FE6AC782FEC23E6439C51764320330A - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E5876DD6371C9CEB45F97C99A3695762E3B7DE376BC0384976BEBA5FA9C29CF5E195 - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = CBF6FCD245DDD8B1C71850B4F9AC028E22A12EC3DC265DCB4937EB128C89470AC22B - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 68874CD2F1DD71C8A2BC348EC3F5909298D41C5438313FA8877B758918E59651C174 - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 696334297DEA0031855E21467C828BF3D7CD4BD7EBA963650641BD6928CAA49B4FB1 - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 9BB697A843C255D1A175AE0D8C91B4930E5400BE6E1431875484C64FFAC11640B42C15 - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = 9157F2B77CE281547E46FAC675D8AF57BFA641F8E66AE298B96027A276201B447B4CC6 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = 9B787FCDDC787EB70C4DBCF88746236BC8E77EB0F2C38455F37B237D49A641FDD85F54 - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 684F032B7CD4C715BE5752C995CA7C4ECEF54C646A7ABE389C0602DBB0E923AC3E47BA - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = 7A98C6F91DDE123081F75F47D3FA82D932A10232B0FF7E3E4EBDB1E31B8545D116617D - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = 3B0B26EA8228F616187ECC985EC42D6BD16B2AE89FA4E999572A82D0D16B66264A8CBF - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 7E01BC99FED6106412B9C29F7901B6D1882EE4E9481E949F60826FA9C0E2E0B92AF36B - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = FDDEDFFE9DADD30C2FE62F824A91DA132E0884EC26966001156D0916B89A283CBAF9EA - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = 3CA55A3E8F3DAD38C97920A5FE20B29C617A3C1E725049C32FEB23E8398808F2E02463 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 5B17A84032D465A6A47FDC6B3FAE9B2615BAA8B6F772AD9A81B8D2B4ED7E703CF5F75C - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = 01697DA7415767F35DFEE114ABC5203FC098E8EAFB6FBFED379216107813BD6A5EF01E - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = 2C9D792E20597536127AFAD0A4E02F7A42B5D608A76C355DB3B66346D8DFC5FC6E02D0 - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = D9009F1F0B59EA4D08D4EF47E0087D62FFD8A4D415FCFCDB20136C23AD85E529E3B80B - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 8AE836E62A56D46E07B9B8094FD9124BDBDB2C138BF725AE9728660E09464146045299 - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = A17658D810D2E8846FC9971842330728727724BCE03064D5A46D5CC8E67BEAAEF65E9D - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = 30328C3C81A190CBEE501337801F5F80B7F54D196A738EBDD94C276DBFCF2DAF371F11 - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 304E868BC22FDE94AE2E639F73269CCEB3FAD272A22E95280792E348457B196FE7A67E - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 83D7B2448E7A8EF3DAF979C2F367AEE10D922E87892808912A2B9F66BF388A0E7BF871 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 6AB2B5083AF85EEFD8D886BED614853893B7E9D359083B4AD0681876D088536BD1F085 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 0D56794C9252F57F012F185BD3A9B2EC23C8EDDAFBF13A026F1FFB22BEA85A28BB0C6F - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 0B492E0228A0F9171DDA96E1644212FF006DED9B8D7398C11C73B178754A7D414F93CC - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = D578D767BBE96C9980FC8929D09C9BC49431B23A977DC1F034AAACC1B94DA3A626D0EB - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FAFDDD42BB9E5AA6A54A3FBB90E4019E2216C6EF32919659E04DA421E3CE241EFE44EC - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6E5D929798C5C7404A3522839A50577FEDF4A1FBF62EA17707367DBB3BD4A4040E156B - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A11CF8192FE52A75E1FC67D5E34F0E13F3629086A250A9691AA2B0FFD31EE4D4AEA4CE - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 9155EC799EDCAC01F6617010A4D7232FA50D690EE1565E6250FDCC817F6620A0244942 - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = FB5D00F328AE9B90DC10550DB7C88977AB71A8B504D93D8CD64C5E7549EEB79501CFFF - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 422C1673EEEB66BF646C9471146F2B4D8838872953CCC640230937F34CC0C618996ED9 - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 07EE77C874D749339FF2B8BC859E0F43E79196DA107CD642DB29709C61CB04DBB5809B - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4A1CF4AE456BCDE1BFE22B440684418F06D7D1C8C483032C22D963B0F09818BFB15D83 - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = FD910BC6717E033A303572087C9CA949A040A8EDF292BBFD76DE3B991F64F4F70E8BEF - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 7A89DECA2B202125B34565BDBBC4AB7FF9ED372C43C1E05D27ABF8DFDAE4E0021F89D7 - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BCEB350ECB88E7D169D3822F02DD4AFE692FFCD5CCEE6A71293C594A46E2FEC95F6918 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = AB92AD8D2DF39A341D1FDDA48F0165957CEFCB58CD6E206FFA3A6638F97A51DEDE735BC4 - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 2DDA0F52FC24842D0E36B8DFF5FAA00EB70F3619DEFF907D940EB4E511D3B02128764E24 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = CE9AE51AFE9AC5C8882CC86B5CC53BEBBEDCB58C06E8B1A2DC9673C7D834DCCBBCF8A8FB - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = 306E08EC926248C84C04905B863EC21D675DF9E14A599F5D972F53AD8B0D93BB8775EA52 - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = CF79113E7020C11EF28B701363B087D1BD5B32135FD1F1C9A7E700082AF4C7922E357935 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = 7E47280D2B2A70F1841EBAF277F46020B3635E36F5C7EB6254D3F42AD94675B19E545BDC - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 219858A34F1F87DBF6930E4DED0CB4B7B5663B5897C1F8C4599DEABCEBC12E4CEE4A6528 - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = 43217E1FAC463BDDC64DC93E6D7309F321313C29DFBC4280EBA3E0279E067849DDAAE382 - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = 5BAE1EEEE694A9C0B8D710D3D1CC653DF756AEC8A956D0A4E3929AC09B35A245A2206717 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = D89678867EC36DBF03B05232975EDAA20F68EEFC39857AA085978B77F7414C8F34D15CDF - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = B036A1170C7B6143B7E9FB64D53276745785003B1045855713CF994D5366CC190CF7BB5D - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = D83BEBF28F99D24E9F03C116FFD8A4E0A4075916441B7C8DFB9A59371F090C45C3D9CEC4 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = 6C409A0F67B8E2A3EC9141EC96B375DFF48CBBA397D77882622B15ACD1EF4AF1DEC6D1AD - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 91315343D7C305B1C83BD5D8C8BE45BFE8DC064551D65D4A1EDC893AB7CD5501E020A29B - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 117C7A007A7CB33A0F9CB3300415FA7C1ECBBBDB64202EA8AF7138AAA3F3E5E4E98392CF - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = 0F76ACEE8119366DC549755C8C7CEE18AEAD8454AEBF805B296FB02732C03119AD68AC4C - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = F056BBC13DE967FB87E02B724B445A9DA4CC4C8C72A9FC1263EA6F2C8C98BBC6D0E1C123 - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 24DFF36771848BF981AEFF1FD2100DAC6976913A9C95A75DE5D9E2BE61BE395E6D936446 - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 70CB84EC1A7E7E329855E7F7972B22DB140DEB16BAF2B7EB560DFD1A7ED2EFA953338AC8 - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = F8099BD7A6818CC5DC37613A36E3750667E0BA4508A8E9E621C0E8AE9892CF4945943552 - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = DD6B5279F1948DB3703ED51A1FD3A5955219CC0F9043AAB1D0B9320EE5F05BD347D3AF6D - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 298A85989C12F602AB39FE1D061D0D3CBB687B87ED21A1CDBC965E88A287987169B1BA9D - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 79D70254241ECD392F5552150F7F75C1AB80817FBB57C2FE85F9394A52782A8EE6BA6F03 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C1B9E617279BA1A6857688150C5B30E9AE7095A789ECF75991E00502ED7B3A84071AA188 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = EB13585DD163F8CD171C23FF81C649FBD612A0C508641580FA35FF187DBBE07D406394E1 - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C0B6AAF9EFD761CCD25CB6E24AAD91DC709D5B88B932A667BEC5A9715A1BF5F984765F59 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 05F72DF5F3047DCE1E63B4753F5EFA705CBC5BAD10679C9209206A3DB49A4078B68D134A - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4A95A45E41C3F6BC7586D77DB47DD911EDBF6D616D42A0CB21145C066242726C379BF9B2 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B7EDF0D579A92EA1C5B131565D7706ED0969BD70919F102C8A3BA54B4C55253D6B2C6EC2 - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4EF6475A5FA0727178007433A23AD4BEBA42585342B5B8540D83A9F0D90119E83FF98C85 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 113077BCC7D3D59DA6C53F744F4C7AFD73AE9FA5175B45D0BDBF1EEFD639399405EDF34D - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 2EA1D34F95030A3E5F9AF9ECEDE03E5C02FE9DECC9D533FA9F5D70D2F93762082A5B0C3D - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6A896A65783F1F50E2A023AB7711F10683792AB3B8422EB33B37CCCA6D895A20CA780B4D - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = B20A808BC9B50EFD93214EF5F478EF4A285DECF8BD3FB6BF705F81FBF30FE666FF62AB3F8C - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 7F2FE9559BE93F463DC5BC80277CF28DC8500E5044A68FDEA754377AB87AE8ECFFF3DAF8BD - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = 0A97A0BB37E505CE33B54466E19787E1F32669C71233C1577A4437467043244833A951A9AD - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = 3B2EFBFDF79AF874D3D29697DD3E6E1EC74F8EE62F7A3AB602EC8200B81FB3A07570BA8C36 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = EED8E62C1DF85050ECD3A4E47F197EB260610ADBC6C5367A24AC20D834CAB51BB661C62B8F - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = BC34A822DE52826F94095CB7B6BADB529D7CFC4FDA1F3187EC475C668DBA1BE2168E44F1D3 - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 748789605C47AAC7ACD6B7200E730553047A76BA1E82C2C9038CCFA380ED5F0AE5B6B470EB - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 3AEBC5FCD6B7D0AE5AD5B0B8A9983517B836FB165AA20275596936F2F81CAF6C7EFF095C75 - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 47E10EDB7B3EB62DAC77948C3F98E548DC3E56E753321AA4C819012A7B0814966C8E6086F5 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = DEC4C79E8F28F19AF20559D465BBD74F097BB46A4637A46E469DB36CE36E3F9F39CAA0DE22 - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 87CEA9B9343CA67AE16A5C1FEFCBF89488888A017BE1CC58DD5B5B32CD10673E30F9B88DF3 - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = 49EE6D07FF9731024E02C71978A2267A6603CE0751BF85F909E96D6485158E6160AD7978ED - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = D2D6268305EE3A2AAD53790A6AD30AE68C5F5F4C7D2F6D9E575F298B61108521C67ADD1432 - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = 0D22A6BB0A856F6BF71A23DF3E64E4D2106CAD6E1F337D368E1C8312FA6C7C5252E92C6AE5 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = C2E8D2E220281EA7C229BED2B543C12B1EB4E033B7FBB662607B12084D4E5164CDB8B54607 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = 5549FEB55CF033894CB40E0D6D0D643C8BA195A17597903CDB06513FAC1C71BE3F947CBBA5 - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = 145E366D3FAE998DCE8AA2598ACEE0B210403BA756D00EA0B78D14952A124B411E04D642B9 - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 853A8D5BAE6A6FB5A45BBB892283C9F02CB047DB3441C23714B5B6F3AA3B7837D04FC838F8 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 32CE24267515DF801B032E7F96E5FD52A45916D4CD32A45E115E3E0B69B342B7AFADB222D8 - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 925AF9197FAB744A7AEA61099F094FB94D24FB4AFBCBEAFB9FCFC9366746750CBD60C1B666 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 9EDA12D181B6A41A3830EE9D5CF5AA24F36E7630550267ADDD789E33E83AB8466277B9B488 - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2A60098FBD54A12D74CF96190EEC4864422394A77FBC24A9993F23B575BBA60ECE17BC68C5 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = B964350BB443E4D54D86D2B405514832B1F3ABDF403320AF3C7D58AA069AC7245889134946 - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 44ACE63A1AC20B13DBB02957BC03D48CD3000AC36192A1337F379E8F44C048EF5C6AFFDC06 - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = B7C731E501187620FE09CCA761BB9C111BD0E2F9DD6CA3DF3EC3FEDB7FE90C059ACDE3764B - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = ABF823AE9D00D32BCD0B7686E98BC959782299B263EE3BAFE837DC703945DB8302355B46FA - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 42D6D6778FDECB217238009A2201418366B6D9924AE0DA1E14564BB1DCED498CBC8CBC9E25 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 7E57A52463D268F3C19AE87A469D142CF6EEA736D0F171F80D94407ED9E775BD8AA6D05CA2 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BD3AE1867D732FCEA07044D68C9C248E1DDD083303722020F0460D40D688FE484B54084B17 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9456C294976DBA05165EE13F4B2D007A444F5E6BD5CA1AE6C8AAAFC926B1A1706A6CCF6A7F - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 35E8CFFCBCD548B8037461E21EDA05C031BC8BD7DA30857C9D0D27C59E9585A35DC0B31695 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 943E727FA108175EEF55F60CE80926615E55A58C1AF0E13E4E684E3215CD8DD0F46D178B9B - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 8110FA8F1857B2ADF19A2488A044A3F6E3D47CFCD194D2BC1D36072ACBCDE7F2568952221E - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = D28C4879627FC05A5D1D941822197808709C32121B42AC81BEDDD9B09D07DF05B648DBF5F317 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = 4D6D071D9E075AE16251815BC6D3B5A6AC9FE3507E3ECE04E044269921C4B70FC0E662FD63F2 - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = DE95C2073AAEDAEE9307DC37F13019EFFFAE15333514844804797E2B1C5E7541553332324A19 - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = BCC8DCFE8BF6E17FD488D6880E8E8B0E88429FFE63C66ADBB24FCDC7E8D629583517FA67245B - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = 3D2336D0D8A734A96DC43D24590FC44F00001CB3D4487BBC332C8F419680464846048B638660 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = 67CA945BF18EE85012A1F47B4CBC722A23FECA4E9C0A35D8999C830F3A541C286649C3FEDF3B - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = C4521C7B6BC73BEA29440F172961E9FB6D1693D5A17436D6B488F791CFC5D416650646B949D3 - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = AA07BB0E5ED0D365308D2781CFA28051784F6E718CAEA173C8BB738E00E67E42D75A41776B77 - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 792B57DFF3B1D58F2E74CB0A35BF86AE3F113B02D7589275AD418961AE6DC094064BA1C6A42B - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = 28E4A5AA0637F8CDEF29520B72FF1F017FF160AB641B400D77B3D6E76E92ED704618AEB8D458 - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = DA6E8E738F1E7A9D0281F29AEC80BD4C957BA0D3D520408771E7427ACA439F5037FCF6C56434 - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = 144E0FCC91ACCCD6B9A8DA3C8489D51BE3B95E6FD36C9456D9F2A0F1E7499CD57774916E65F5 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = 57B87E8F13B3285D2359E61AFE5A9D4976B00B12551DA2E1EA303632C51B4AB1D94643A95800 - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = 6A65A92410CC0252A01D4A6EE39967BDFB7CA498C118418990503EB3C8F207C494FD06588AF7 - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = 454E71FE13E52E243E4749AE26E6EAF3ABDEE876CC63E5DD07988C2B93DD24AB3BE2F38069F3 - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = EC4A39B5237FC0530865D7C432CBCD6D2D5149556CCD854FF6CA3871395714D4E14851F448B8 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = DB5423437843861989626DF14B3120E812D749B39055574416CB3437025673ADFD8917C6DC1D - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = FCCB7601B82A3341FC89045B3A98122B867F76BA053ABFE12D082652609259A100E85546C5A5 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 9E84AF0625255B679ACF530F6C435DC26EB343396BE82D4BC5F5279CE18262A7612848D6E0EE - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 4D17004A8AC0C5EBBDCB43100E921009FC653E6FD6FB86E043A952CFE2ACFDAA680404199CD3 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C5198959CCC9BCF0F176B71D0596EEFD178308792F992BCDC81511FEB53941BECF7CE65B80B0 - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 849E472593447666AA6715EA10835D229F5909EC1DCD2756957EABB713DF07D2A2AF20085E4C - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 5277CA4E650EEFF707C97FAED9A9BED6659CC95FF285EFDE22B2D2291600BD798C83BA436660 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = FEE885DD11CFF26BEB6180BADDB9A2D0217215DB61DF77BEA04CD2DD57D1756770ABEBF18370 - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 361A062E9CE154300941FD41574324B423083E47C6A8971B7426327B93765CF587BBFC03AA3A - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 4C9B0E9129339D8416215BFAAE9FAF544264DE0E84934340DF16850B6F1BBD6224A65D9428EC - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B40494705C3DF5C800CAE658D704328A67165BD50B7D89372184B4741F29FE83F9D2F70DCC44 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4AA8BA19B27E35329B2F327EAF7E8B38D8DDF565C00977BDE42FFDD52AEA391DD1A13F85E0BF - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5233BDC3AEB50C47BB037AF91B15BD06A73C65C3C035322FC7A0EB53489AA00D6C873FB4BFE1 - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9EE7A65AA662A50E0D403F5EB85F39A547715813AC6F2ED6FEDF8B73A6B885519BF9F689824F - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 67F300FFC37EC1D4B80D3B3985696A5BBC7021F46D959C5AA88BE6B0B5C697D43E03EBFB76CC - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E705F2F5D3E0994F67ABB396146BB2381479C1A134643AA491633B99975C83DD4085F0133003 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D9988B8365A59DE7965F2ADE2C3157B3CE34B7E829A9F512DDA07F69B2A0CBDCC2CB27B219F0 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = F3C7B8CA78463963FBF6A9DC76F3DA505123DDEC177F1FEF42F225C50CAD7129853A6EC7FE3ADF - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = 25A7A8B2207B7345E287B592C2673D71515DAE73582D687274DFAB2AB61EE0152E22BD3F39038C - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = 78392537BC0BB75EDE914913242A8660BBA42B50C2F35683939ED9577709B618C89E100A9385AC - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = 2B198B3A992BD2DADD224A373BBF8F17AB9D64900D66057AF608A7F232FC342B707840EC245E28 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 30C06529FE35B697C2A9B06E1EFA8ACB0BCD21632D97728D44825939EC71CC52A05287866049CE - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = 6C8F93C782065E4126829A2119029143E824EF907A4AC3D2E04E4DA85ECE4EC4FAA61D56BF4723 - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 1A020F5336D1B04D17EBD4563971A8E51F8A25B11E9D09FF45A2617D1123FC8F1276E252F52C33 - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = 798FDC42E31E86E89A22CFC970B5B71CEFE2C52D941553926D8F602555ED25CE8B54867DECC396 - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = 588A6C83F4FABE1C766EC0626134FF89F504F0743A915AD8E74A85AF945D4EDAB1F1F04C51DDB1 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = B8E03C0C32B74C18B64FD863DF69888B7C397FB6E17590674295679E88C777CD531324583D6FCB - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = E956D6FDC35D93A7F3F7746CEE215422F9FC0017C6156057BFABCFEBC3E1D2059B26071843188A - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = 09933ED6298D61D94EC615BA639860AAA4EFF6D523316E1522F73BBE600EC6DD0B04B7CBCF6AEE - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = 8FB96B82571A31945E7678D809687A003D5FFA251E1CC09F9832EE7900B8E22BE3783F52C1CB4D - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = AC87EC6C7C2C676E8FD6FBD3F95D4AA2B65B03BBBEE8EFB69818061D808E7DC9FA3F2B9DF0C212 - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = AB9F4AFD846BF4E9D794DA1D757A88588782C3BAA0EBF3789E628714B8B325DCF771D7EB1E4E04 - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = ADE6F2A0B08F5EA37DB6B28B2E0388CAD4C002AF5D1E23A8FD6E822DF15C1496242068E7EE6608 - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = 9F22E8B32F0AF7CD552FE270CBFA2F4E7C0D705847FE60521C254409AFF9E8D6ABEEC4F6AE72C4 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6CD8B5FBB36CB484531CDAA24780B7F8B7339CF16EBA3A34F0208023BA90441DCDC4EDC64C4BD0 - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 80D0616AE44F420B4C7D71EEE2563B855D00D5C9DA3016AC951D63841AAAD7ED6DBFF04E49B949 - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 8309735985C17CF84D412533E9F0C56F070CC2E6A8E81D8C249034D21038E98FD19AC53CE23446 - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = D82B867BAE4F53985215558D76DAA4DD7E85EC9E71EF2F94B202394C4CA343590BBC5AF48A4FC8 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 054266575E5C79517E90B75F94372D63ED8B1A5E8DDD63D5F548C70A3D8A738C9818B40D920587 - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = ED0F65D4927527FEABD013C1EBCA11CD2C4065B9914DEE3D2C0DCE80998C2E2A3090A3C94E73A6 - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 51A581B4857D91745693C46BF2015BC517891DA5CA1D37DA06B3AA82AC410386C28FCF321ADDC3 - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = CF8D7E947225C5A165EDC371975238D393A43189DB4D6E1194F31621F3E5946CB1CDF093969378 - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 27F76193E98DECB3C8E7027771B19561222A8BAB24DD70C7B3E208D13C9BBAF51BC29A5E217872 - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = C6457A900D80A80E405A7FA395D7566B9DF60D035B77DE54A2A00CC8FB5CBB8C20477B899748BD - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 419825F107A7D393E851892F98946A72CA4B5433A610E53B6F5A153F3F215C2A6CA471F385D1CB - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BFFFFDF01C379E730E2FE8336D3B2D5FBE3D2752D1DE466006A4674E925D2B18A1F3BB4606A85D - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = B030D704582BE0D19EF860CB00F91CCB68D7BBE9A274222E1F6152503F0999A01878B1B0FB55B5 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B3C32B1F5916D8738A4EEDB06DC87D5C8B6E14D279AD856FEAAF4336F5960C4E56D126C3420B97 - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 03881E947ADD1D687F073961E5F68FBB5DF8FAF876BE38550D091823541E6803F54B4821203722 - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 32DBD0332B761E82A3B1CD04512C5DB9983808B0531A9688B58C703C9F859CA47F1598D17171BF - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 4A2AD7D1AE2014A61051D651B78504119C8BCFD73C6907F1A3BB7D4F704112E4B7FF16CC9CCF514F - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = A11B92B0C4EB4675C0CFA97602967F47A478C6778B69B01C76036B6BCCB8A15260257308F4F5E21E - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = A6FA07FCCD3D608D19DB69BD0B7F33137319DC14CD4B8C3A4C6B55434F6927CAF2DBAA80E191C247 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = DDA4895345EE33DD630DC52560E8CD5A7429F4BCEA5CFE1B699FDBAC3C95465BCCAE48DF7FE39B48 - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = 4A5CA1328B1BB54DCC9EAAB47BF74B5011F797C2EC3240D165A443EFC144816F65F3C8D017F50DE6 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = E2CE3BDD1B498C2F878581F11BF2FAF040DB9892FBE040C06B783DA359AC0B6F14A353BA241326BB - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 13F39ECA72562C6FEB8C79736D3AC33253DE59DCE90FBEEFE142C68D80C19304CD8459AF85A42252 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = 7AEEA9DE01D791E7133BE32B13BB72AD3FC30D491DC8FEF605A5A89F7F5C0E4D58D735A63A0B2FAA - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = 93C6F090E030AD3EE817B7A43792F70B1ACC5CC1E0891312ABF4ECE1112FBB1A58E2F2B4E901A4CC - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 4128B416524946CC5A2BD2920533773BC5AC4E5892E4A9642758738854DFA3927CF4347A7A5D0FC9 - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = E51C536D79613616C7233EF9996E371405899FEB5766211CD7E8D20E1831F54D9F915E684699750C - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = 9DE1C7C0D6717C13738F98092B5AA39E56F9CC809D92D095E13CCC0E3128B33FD5A56B29E749CDFE - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = FE891C3C1DBC32F7914666637E28F94096760A61C5DA9AFC48D2DBD0259378E65B49CFFCBA81A319 - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = D5FB5C9B8EEC107A0B0BE6E2BDC28346A42835062784788F27C670D68F340CC84ABE95DFAA051C94 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 6D4BF1F779093FCB7A944F59BFB281E31889E6A5B1CE52889553ADD4405C31D30210FCFF3C9A2DC4 - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = B474BC5125EA1298433D43DAEFA5FC39235FE2185B06E7F61F7AE431E4C8E9B578A6071DE8A16F4F - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = B615EC7573C73AC0A2F8E46D895F79E172FA5059288C8E8E341D66D28E7AD7F8F60C15DEC677F945 - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B0C9EFDD9358817521C03D40AA0DBDD8B18E5661869FB1A7091D4DE6E18C6E1CA512B9EB863D066F - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C13CF96B27BD324161ADD150B328E899E82577AF6678454D59A1446D5BF3CCE8DC254E81EB04808B - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 8EABDD8644C77DBE84CF2477FC35D12F22C3155C68DA5872C8ED109F6ADB439C6A8BA81B3A530D9B - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = EACC3F31D3D54CD51AE3A87E5CFEE6DDA7B694A750F905B5CA773150A380B524288BE46C5487CC4F - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = AE0DF2B1439EEEAEB1D3623DD8EAE8536AACB6AA3669512ACD654429582DBC417775E6AF60BCA511 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C147BF829885AFA090B778B550E0D830CB74FC05857D7BF95CA83B8615E3D009D8A15200997992AC - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = AA79AB7CC97ED24042DD5E7DF09FAA790D5CDE1A0FC5BCE4F473E060B4604B2ABF733523E85BD5E8 - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E1145F652B0CDC3BB09F701DD4D8D663C0D28B15AC1DC0EA097AB39F9C0FCE8B65E5D08D7AE94FF4 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = DDE21101BFD72326C53D782A899777C3D7A32F395D763A9F2770F7A5F4CDE20B82C34E4E4AB83DB8 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = E0AD3634FA42DA5A529E54D50B7FBDEFFBD597D1C38D703F6D22F004263FEE100BC7CB9C4F7F5EA9 - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 024C6F5E4EEA3655952EC3B52E4B8C1ABEDAA85E80D8074A67CB7BA55C2882FC0816127DCE24B915 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 360B22E4CFDBAFDC92E10B54C57AA6361B60D59813CD7EB3839A192B3B158C1E9191BC40D324D86D - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3C16AFC41817B7B8CDD1247DE4A738500FE4A9BB99C13FD918E3F3DCF4C1B8872B16BCE6BBE0795D - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 802A3FAF92D5578C54E232429C90B938D9EB0A1227595729F6D02866563A46B839BE8350FAC43853 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 72EDF980E20123846DA4E85CAF9C37C6EB31859BDD49FD17EE76DE59454823B191A044ABADB01FFE - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 234BAA954317E26B740E4010043132214617ED5B7B5142A25E548A953BF7CC47771B9701C65ECCA5 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = D38B652988BC6FCD36C9D33B2B8B9CA7E3EAB4CCF700E029E27354D070CB0EF8C3FACBD68335A5197A - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = 38F346D54BC850123B5EC6A53910A53C4D6DCAC61F8D61C73B6DBF94905B72F122AB4E97D4C1E5FF9E - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = A56B93264FB73A1BF1BD93FD3297A1D381F7BDB378583661E34DA710A2D1CA555143438A5AB4DB8F59 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = 0EE41721D4D858B80AD6D2E48C26109888341EA97F98CF06BB3E1198F37D7DADDC87435D6A3A4204ED - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = 867B40DF2B60E9C94692AD33F6D323B938C9B46F67112F809A48AA9D65CF4F79AE3E45CAE7C2037A31 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = 4908D9B85B63EA1AD1FB956B453EE3B434B9CACF9921D7C31DA4CD099EC48F612D220600E1C4ABC2F5 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = 67A1CCADFB248727CF9FB05CBB0320395A927631B5C6A4913DC3A522D4DB383F28A595EC57C9D53925 - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = 4F78B50C1EC3F528DC33CC9BB5359AB2792A7FE0A2E1B87C62A1369DB65036B16D081D6A4C38438F57 - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = 02C6EFE7E505F685408698BFB189F94F50BF85EF9EC4AF488EA14D1F90EF85DB45B8B385BFC94D6BE5 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = 970C1F87536EB054D018BCA719371AB285AA042CCA490FDE071B95E9FAB8BFC62822077D64EA42AA72 - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = FF57BD54ED5F7019A970DDF8281A91C1F2F76F9A8BBE40A9D8CD2F00983F7DA39D0DFC7199BD22F004 - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = 6C72D0D6E33BA198668CBCE6DA7CB7054B8AD5920C1C1BD6D50DD61E186CA75A371E811F13E755BAEF - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = 861F3824C98F811EE8D1728F3607080C80B475227EBE1E73C256C57D948370A9DCA48450B35ED4A8C9 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 7EAA173CF822A8D6801D32CC60BAC9B34E9E2EC2EBAD99B4E9C741B926F5F3ACAD9DBF46D43D73F1D6 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 09BD40F3CB56AC96DAC14C7D153982CC238EF0A83B28667A1D4121E5137B752842CDC35CB22E2B5CB6 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = 2F0E8465EA96703F723EDEB7B352F3FDB8909C6B4E1D78A717EB021709A0083E524FE19CF538EAA524 - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = EBA9FF223F6912252D260501FC59887DA5280512CC87D144A9C8C9C9E059F186AAB628D80EFDE47FE0 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C2F16FEC618F3894B09840092555C8571EBC26A8A8EBE2534261E3A9F8A109A408CFC62D30C900E436 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7A29084A1C6A40432340B470011C29DBCA0C28814C8AA770F5681F484FFF0CF4CC47523657884AA62B - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 4E353CDF44525403730FED6297A59097EBAEE3EAE4751BF472544320BF5DBAB61D60DAF8AE9BAFDB89 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 75ABDC2514FAFBE3F691A5D3E4554353FA8DD87ED2D4945D1E4E20C0B02B511C2FB7937A236A709B20 - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2F2A226198C61562FCDEB2C744EF1621058AF95EFF98A2DF6A3719CCCF882F579AE2DCB3264AB62BC2 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E93C575990E7AD9AE413A748E647EFD41A2D8379D173C1AAA59CD62115658B7623F61DC3B4A7D87550 - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 686E00C541E3B869691201F92E01FB4CA3EDF1B503758986C9DAFA50156D6F65EF59C43313F8169AB4 - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 6F64E2D4E91C713935D0715984D85D886B1396A5EA5B013225F96FD997686F32907FFEF1A1172AD59D - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = F04E1D4C3D310339FA53BCA242FB188BB59AC0A76A22A6AEECE0F0ACFAB11AFBA74F85C1E3E9DF385F - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 6DD5CF101ECE15FA4E4A26FA3D74C987555CDAED600E659C0B4E98A7FB71D4C2917FE5F98EAC16C946 - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = FB0652B6E65C0E4D7A5EA779235134437F290F510D787D2D1B377A92DE3778AB9FED837BEA1EA8F055 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B773A399115F37E8226246EAB6C42881F1F6D56DEE865CB8070E5C6FE99C6C42D530FEB66C6A1FB77F - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 0960088412F72DF6C41EA884110805DEDF0A324049A6891A4AEBE4FFDB3C1CA63BCFB608FC12BB0230 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F934DB2DCE66120FC5F9D4BB8BBFAC861474E9B80C9A8A00C2ACF5888F68C4E072CA298142E2A78C22 - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9FADD96D91093EC525A8C54DB2BA3497FF3891A1E093169452FDBE2AED0D4ADAD5668398305820B664 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 708DD21215716002757B6E1314535A08CBB522011EFC3F3C5F5B00073D5D8331BC8D565D5F657E7E01 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 88BD07898C0152C33D485DD9D26E7521605E8D7C524F59D764AA9B8984B1B26CD4AAB9D6C25F186CB383 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 2D8BF156E592F6A08410E0F86DAAD040D38DAF92A43ED2389EF73DB4051ACC725CCC0D457DA1CA4D427A - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = 6B90D6B9596A87D7CAEA10F69506EFE7A5DE02F9844F2873245824B113B6B0824FF1E9F90233F503010F - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = 3BE6332A355759B3063D596AFBC9F47A6EF18E454C955FCC0E5DCC55C94C9AA5A90C088ECD10A3B14963 - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = 58E2B1C30DC3F5FED74758C6C43F293CB2857A9BCCAC52DF24D007088472F2BA1D475DFCA70B9862D3E4 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = 4DAC8529B2B89024DFD48FDFEC66C5068A20A5E18ED65194B7EF4B9EA6A844246B9B7571733CDFE44EF5 - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 563010B8251F242C8D4388F481275DDF8399DC3920587D91A8503B8D206AD15B0B8EABAE1C71CF80DF34 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 3A8E5493883E49D17321CF0FB3E3C68CDF221945776EFDEB6F969A7DFE698C0AC7D75C004B6ADC1C568D - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = 2C15D86C03EEE626488614023092A67BEAC1EB9BB8F49F0DBE8AE35481B95B527FC3589372DB3A86142F - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = BF1C863DD749E115C8D5945AB3E47B013EB9B5F07C259926C1AC229993DD2BCDC057865457C62BF44020 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = 3740D28BB9DAD06793286DCEEAE09F8017C1CA617016876CE5B17645F7576BAF5D5AF942B3F8E9D2DA1D - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = 9762346C8474FF7D991C20922232443886EC7EA1CE4B28BF0DBB3B48DB7612E2D9BE8B278AC16D16B975 - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = 223330E0612E399E6B5BDF5E2EA692F9B8F77463FC5699B24DFBF900BAFCC50653DD3A6DBA6D776235AC - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 9674803580AFF4C81B615165F4DA850F7EA45476D2B1B08559FB2F9212ECB8D02E7D55B96D41EBC713B9 - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = E59E0ED292A6863718358AF09AEC4AF47F4BF8373AB7B3785F3FBF17AF6CAF1FDEDB0921555A3A590927 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = 594ED59F0837FBEF4043E31CE060FE734C1F2CECA116C19043C7FB077B7EDE6452F2A8B51009EE881140 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = F554B382CCC1AD715F1693B89A3DB61A2CCB49AE71AD7BFAABD4530379C4AF2106A3B1DC8A0261838B7E - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C640622D0042E271F0D9E60BF5A0C8E5A7CDF89E36C30353BDE09E6534DCCD3BB6D149369DFEF1EF220A - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = F8B5FE81B671C1E86FDF7C7E1E0A329B8BFB451E3EA155E0175B3986D2AFACD01A2D506A74ECE6687891 - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = FA532EFFE7CCD96D85ADB9B6860E2F510A1AF85F2C046EBDE3F4B8BA688EDACAD2841B11FB44DEA10F28 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E93805B7B6250E5A873F0C00FA74EA88EBF78D9B29B83B8E5DB0624D9F44D4142D4C64087B59CA58DFF7 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 10817992E3C6A949AE7A46B8DA8D2A5C89F15E29366459D958A6BE13AA5C3465AB5990E6D8549A1A42C1 - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 749FD417EEDC551D38B403754646FBCD81EBD7708CC6436C906053D470396116FA196DEA052AEA58F9EE - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B815CCEC636C22404A3A6887A65A998B0AF0F9B1EFFA061F6A708E21054E6875E270BC6820EC38C94B0B - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 291FED1897B4519B8305EB4B9EBA01D806A71959E4F18D79A1AD48D34E94E5F182468201C7DF72E79B93 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 720CE7E0E8CDB2BCE90EA608278ED56ED2FD185B641FD9C98A90CABAE768C4FB0F911819067204BDA44C - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CC3ED0A8157A49A587F76D42D568547BD1EB4F7CC16282EEE7E538471CADBE003AA9F34AD0BB1FD9A24F - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F122A3B6CFD0521FF3CB7B5C9226390BB0253ED9295664AE194ACD9EF881E1A9AD22F1ECC3A2B3B7A862 - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E78520E5BB11B8C52A2E5E58E8B2D99AE701E256327C6FD2A4FC3EDF938443AF49FCAA092171B1FC5DA7 - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = DE9F0DE4DA9811E3A24647E3A1DFFC5569953CDC0B465FCAE8894B288EC658F5CAC3018995EDAD29F716 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 59973823FD3FA05F9D040394ECD09B30A8734F36B75B9506583DE6F3EBF4DA226980F80193B52FC1576B - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 0B9C0A518DC263BFB355768637E3E34E94C82DA477396F1241EDF99803BC3FE92727591AD1E311AD8494 - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 561D717A8E3510B7E1E793D1AECCF0D40C02DAC1B8559E53C11032B7EBF961D0E92A55F1E405CDA1084B - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = D761A3376F87204B75528C30ED8A713617C7859AAB31C976A03F4A2B0B09A6B2B54128CD631DE825457D6E - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = 51B710A12C9C59AED4F008CC38A71D5E14AD4D47AF33DEE74025A340EBAC9C9A88F151B7759A1CBE732020 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = 1FFC481083F96FF52DADF81D99333D698DE6CE5D520ED7C24C7B5187797CD9CB86B1B8C5BF9D8E026C7286 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 702D4B0CEC1040A66392C501942A904B686BC624A7E23D96519073ACD66360340F45853C1BDDABE7859D5C - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = 6A5F8D8E15839C80370F8882731F5D0E1D953F24C41D1E4EE28E153C60DD944ED57A082BACBB111B2E83A1 - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 400A492D4073F4D0713EFB707CCD9DCD6850D4C2A7EC9FCE1D6E67943794AD4CFD7E7B6F8C25FFC7EF2712 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = BF32AABE4451BF8B5190E07C0CBC05C15952D42B55EBC52ED4FB2E947F29EC88449C7F139DA4AB5722DE00 - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 810FB216BF78E6938AC6AB7F3E34B3B58DB726B1E765FDE7EE895B10C6DA0CB6C90E1C063166C3D20A7B9C - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = 23C18D58D3258CFD3C4703D3CCB1916D97BA72637F1067380569F6B2FA1DDBE861939FE6994ABCAB9AC9D4 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 27348C8B5BF373A31F7910AC16DA445F68E9EDE71DB6C81887698F12ECDA7A16931741C03E589E8756D7B1 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = 81AC6D37916E21D41CD703DB03DD0F95BA5C006D04A9C51AA60491A0CB0FA4D8B47E6D4F8C0A84DC472AF8 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = 4310F8DCDD0F3795BDBF80D42F5666B49ABA5AB39564C708F81FD643AE7D21657A2719832D14FD2C892C4F - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = 549E5C4EE29205BC331E6D885241B8DCCAC25543F1E070F69AA545F65DC574BC85A18FD4153CD7978277E0 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = A2B4AC3AC55734587C13E150AC832253F259600AB245E5E5E4CA2A206B8F04412B9AEF70C28574474A1ACA - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = B270B4882B5E86700BEFEAA717933AFDD7E3084860D3022393317BB657F67A7963BD25C61A88A252923CBF - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 0B5CDE2B6D2F4699B0B4017D54B91E305FFB099597734E61037128A032CF360D50EB48A8611A6EE3B7CEF7 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = 84BA62801AFB7B85FE089AB36E490F442F72E2F0BEE73C4BA28C34115132B0D5FB9A69323BA967E83D1081 - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8C7ABD78FB83021C55BF05ECF726620BBC72BF4BD957C65867487ECD5D1A6DF62B0A13D473D9DFF8DAAE98 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = AD1ECE4EC99B0277E20585E77C8EF7536CDCAD440B0C864F8BA2AB3FC974F73BC6F1A84D2E370B732DB582 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 669BD569993E93031A0FF72C62D5CE12E8BEC230249D7B106BB10689E87D013BA7DB46B748C7D694AE1B37 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 06233AF02C44210EF32274853F6B838E3730E510C25D7D388BEC8E8661D301A9B0A35A63CD3CFD321ACA62 - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 089D4E9A20C230D5EA9EB36DA1C4DAA199AA5321F68CA9C080F6A98864BD53D734CB9F21E95679C2C6FE25 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 78C8EF60441D7AD77DC2CC757835E80C0EAC6EDDE4FBEBAAAB2CFA8F5B8611130E8BA850354219755141A0 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3B031EA943CCAD370E1BEF335EB98AAD481F8B8F6FA37205E962E2BD3CD67251409039521C1C82767832F0 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FE9F0743FEEBF88A2444185C316E89D644C0EEA776F1D86B3798F11ED9BC1593A7500CD2A8F0A2063D621D - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BF910AE68B466A660AF1EA3EAD6117424F349ED32DAC569B683F51C88B5FE9ED4D050BCF4A5D36F9377728 - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5AFDC10F267E0A94C66C028351C2B2313F12280BF0AD7BA43B8493835E160816F621BD7B5BC117EF198503 - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 902F8B481A03811E8DEE69D623FE61239182158AFD0AAFF5279CE98157819C0BB886411CDA2D6352C84851 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1C13B1EB4F1D12F5798C92F32D4E556F75695A91C2308F01BCB1043979E25DF08DB127BCB46C3739F5C263 - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1AEA0C137B539555AF84AE67E9BC5D58A278D84CC778084250BDBCC604CC5B868103F8F35FC011A599B5CB - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A4745F6F6FA04B1D4CB8F0CCCC0B58248EF51062CA63D2ECBAA4A9C157B84563DC938DB815395386AB3016 - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E639D666E3717E40DD4F58100600CE278AF90FE35D3E44DAB099F726C93662A3994F815231238393CF7A44 - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 13630B818FAAEA8F29B2F472A778E05B264B17AFC5C7DACD98DAFB33BE449773440686CFE8008BA8F00B86 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 4631EFF7DB7987FF3C788B02EC5EA0D2F8D8E26018AC2EC98492DC412C53589D9B7208F06133EA2D3A4C963D - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = A1F6CBF28B94C36E23F9FACD10231E85E382D804A7B742DA314CDD685A081BA378753951C4D4B624BDCB9B4E - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = E1A2E508B562969153BBD3160203D07E751F6642AFC7E4CA29993A55AF35005B34ADDFB063F1F7F37A7CF80D - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = C0331C5073264CCFED778138CBBDF537191E31F75C28536A1104018C72EB16CB681A7A43209235FE0ED7E7D9 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = D98D834A654986FDDFFDA6FAB3E7CECDC01F16F02340C0F4CE07401AB11E56C8B0DD6708B77318B0809B585D - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 2B3E58BAF5FF96E8D9BD3139E344219D43B01E90A5EFE5F519E2CF8BD57300B0BED504C55348EF77DE176C1F - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = E1CD107BDF5BFDB815272A9F2A9C72BEC1C62F38A850F94ADAB4FE80B4A5EFD23EF54E9EAD41123CE991C40E - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 493B0B17478EDBA7349FEB4A1A826987F340C6C7E0771C79DE51FC2EF73CA5C4F67245D15BB4A61AA49EA78B - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = B5C46A5E9AAE66E5AF7DC3EF1C96752C463891DF1DDFEBFE86355618E6F468A064116A82DA72FD7EA968A70A - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = 61EC42CF64C31BACE17EAC22A34452667CB4EB16C2F8B06507422AA8E11EAC430F0AF11D1904E43046A35086 - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 8149C0099CD248108BDE503F9BDFC803574D2AA21A69587F9024AD786AAFE038C8BD91D280DA319AA5D9F12B - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = D2A1986D68DA8649B343E63B089B0359314DEDDC9E3A8E2107D07B8976DAD3D128B599A2C2D70BADE2EFCD88 - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = 878CD786532A21E1C2672C4ABA6EE23F8609855BCD2A797E13E8367047199E26E3882E844B240A359372F8E6 - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 480F1733987450F48AB04858CB2693E4630D46D2B7FB1661782FE64E1C2C2A8A0AA6EB4AA8166407B89BD0D0 - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = 51DFB419555A3F316EE90E1C9E364E535A082068FA965AE88A04E5D8F81A4679CD8C77DBF7803B61A25C7669 - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = B4123F0495846AF2F1340734AA48C7092A88D89A893056843D8D7353CBA85271B204FA3AD654E13FE0C62FF3 - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 747969F414565232267F45FA9C810D3F749B6A4AB1DD680FA1E702317FF7B839F48D4AF70A707632D1A21E43 - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 7C79610BA60B3D4A8C56D8C96EC2AE7A9B7BEF4740367BFDA6CB9483947C30EA8B125DFAA00FF3A1F12221FD - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0C9BC5F98E630AE52F18ED9D12E77BAC6FAA398FE42E7AC3159C64CE5B88989A284C90E3FCE9EDE0240DD6FC - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B5A5AC92E62C58B2E473749B876A7367E0E2D66F016C28FAC78CA516FD896124C144303FAB5AAD5BEA3286BC - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = D48B3B168C7E6F568D221EC685FAF4B9B1E25019E57894F2DC0128C742489B58828BE45471664E1449E9DA69 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 8D8E23D397EF64F1467BF43D1EA4B767757ABAB51AE38ED0D7A3F04849C5702FB444D90213BAB5925BD51AD4 - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C090849DC2D0A33407D74B5352E7EB9819781F6BAA2C15C72319620E3122543A1D2CB3B407A7E1AC194A664C - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = F5A3B984DE3AC46A856BA0CDA7749AF9DD15D0EEB6A91B4AB8DA41E2D11541891782EA5084658532A84779FD - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 62D84BF1714F586E4418C446F256F5074D46D9A2FA11AAEA77B4DEAA3B5B476B4F725CB9BBFD51620FB9D8F6 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = E7566C3FE29738565E11C4729B9C4B4D28D61D4354FB6FA58D0D50A5AC6E905EDF6589D7E0AA63E6997717B3 - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 3C2DC904094544B213E59AC911BE8835D9979B1663F4732D86A3CE2DC3E43E2AF5DD5985362756C04CCC9C50 - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2BAA26F748D754D2490537D853FE43B428AA1921BBB165FB63EC1D9DCB74DEAECCBD8CB826FF6B37428FB2CC - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 80560D111AF6DC75D5817750E9A66C73484C2C19436F1468278227A6341DC87DD8A0D97A6458869591A86543 - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 81478174EDF360A8300F3AFF135AC82C5647DFAB7377D7840A1FE2546479726B658C07E644E95C5D63769D98 - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F31F529B3AEBB1735EA531D7E214A12D3F212C73AF448FB8B01BEFF70FF4CCF0AC587F40F39F9B8205B5EC5F - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C810449FB20F619DD887E4D71D47BB06491609F08EBB0C9A37994A0BAEC98AEE8DEF95CA2257A27FFE7B3997 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F1923204C753C122479762FABCAA9427EEDBF21C38902E91EB10EE7137B868AC507A1FD0AA3052FA5EEF866A - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 1D5FC7B222EC034A4F3B1C0FEAA03769923889B747AF3B732C7F6CD5436FDB54773395CC7157423C8C4AF0A673 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = 7A674D2E7EADF1F31B832654583BDD0751676E6A518C8E58CADCE98DA2D459DA4D835FFA795A25E03FF02396C9 - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = B86086F2B49C0309FC421483CC7D89E6A10EC88B89B57F9F2B9BB971C753A0B1C78D62374DB63B8A63B226A283 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = CF7DBB3EE8553597499EA2BE08EBCBAC34BB92A10BA60746C66B001480507A32F38F872A2AFA0E5A65765D76CA - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 5C99A218493841B0723B15660C0101C9F9B6451B0FF9D1227CE6DF878269A7480EEAAEE3D87B8F780FC50C0368 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 40A209F11A61BD00A6544A98B32CEEFAAF639054F6C4ABAC4429A3F3E90F2578D0796AAC6CD1ABF62DFA01354C - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 1C19F0B78EA9A21B9B12EB2488A8597129DAC0712DC02A502BF4FC9530A563811E7CE05EA58C3651FCF79B8C7E - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = F44D3455123B1ABAF04DB6865031B71117D0C79940B0825DE48C57FDB34E8DC6C05E23358EDDC2AF2115E29A6A - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = 240B5A9690B6AF50B64411F23F58E94060E5A98C6EE90556E82912EB5C891203D99EC206A5974B5AF3683745EB - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 37453CF9B8158059F5AC10CC878E8BC179FA99420CB6B4DDB7253D4461EEF7D44C1574A4CDEEE9C02600FC8E18 - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = 5E248F4574B642257CC76A63A4367B27F05857A8BA6494C928B4CD70A66568E587FD92FCC8CAAD9520A11FF57A - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = 4FF832E9F2C124DDB63BAEA96B8287C377E447AF590EAB2DA745D910A8B2E41C18407CDF7E359A5C3FAEB984A7 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = 8BCA543C4559E24EC0E33F4B38C83BC37B46F5C895359DD4B6D9E375361BADD553985AE0600FBEE4468293467A - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = E0E1220611DF157D00816DFFCF6DA2439579E58AC1358BF733843577BA51FE051D38C53749188E1A9D7ED59A75 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = EFA53C58F68A0FB7AF4328BD6C2C84C251B7BB1FE2DAE2668D186315299DF56BE49ECB765D969F28C249D13307 - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = 5F755F7480FA7CFD1C0C4875FB0F398C249FD73DE7A62270E99BAE75A4AC4873A2BED916318076AF5D2F1EAD61 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = CBB15E8C959C9511F26ED641B8E8D068406C6F436560F95E295EFEA9BB43863979DCC72767EC65799099719C77 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 351E585B5B901AA3BC8D3A51E582ECBAA18A26C313743AE1B36B01AD2CD8D30C157A5673660385171CB11B5459 - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0FC337942AB4A6BB4AF1197F1BAECAD812BF917295E5A8CCDEC2115A49276D7F4F567597251C37A41F0E452C53 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DE176A6A6D84D97C71E7A4D557B8C51D03B0C1B1F49D870AEC61101DE5992E49D753951182919BBFD67C0513F3 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B8B0B0651CA7B0D8599E0FCD27DC93C55215688E1A46DC884B59A2A3748950CAD47E1EB73077FED558960ABA5A - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3F3462D00E5F2353E1CCD1E3CDF029D4948E418E2AAE77B1F01175B897975EF13EAC1DEE49A4592E44AF4C6851 - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = BAA9A575C70DA3D192DA9F8289515DA6A896F11887922E0A70407651B57C3A47BCD74DB433009AF7FD59C754B9 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 141676FED8FF33269BEABA626ABE61BD490440987D2D8B5182F77EFE7CDE37B1A7D2C47D65D77A4DD3DC8D201E - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FB5C4BA275A3D68F1237CF79A2536B8FF0CF3E63D9E6C6DC836CB34182A97F6F33D39BF4C451A1E2FF74AE0C7B - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 88E8F4F6297460E851FDEB20C5C27C6699BC7372E3BA6C2B6DA1CAF19DC902637E1E680C33644308459220579B - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A5484211C19284FF26CF3E4634C201B7B8BD7D172B6F1BD32912D7F5B616263D77813694BAA3D1A76C608D929A - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 29F56D5899334FA9CF946FF8E6608CD8F234ADA279811D0E21CC41CC9FF3EB02990C26AB702B5A149C6E5DEAA8 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 07ED7A28ADF93D5D981B20BE1E6B1E47C02FCDFA31144E37D0C545C4DBF64A013598BE4E136995E185D5D27EE4 - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = D75B850A8AE568256AA0C6699444C281DEF55E3BC54F20E5C8DF4F2272A254B5E2DC9E4DE35E5F1E07D284B7AE - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E0E879B3B760B4D4773BC19C64C418829912AF65DA6B4F6B8377F3171D8D2EF15EF7146BEFE24F263FFF4D5AAA - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 226D2524E9F8231229CE7CB14A2413DAC72D14DB70A4D5C956C46CFA1B66ED7A0D1C000D5CDA9443185AF5C3EE - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = AB1F909FBB0CE337176AEA59DEE56A9BF9F572545337F41BADCC82087D7987A1B807B7E2C0B526B726525AE968 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 3ACE3522F7CAFED97A57F8E021D4A208E56A31965D855B98B26C2DCEC5C84AE6A0692DBD59CD891B8571FE64998F - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = 53FA840F0857CB58BB6614FD35DAE26537229B6EA97542A9B3434B37E31D5D4FD27BC04C716C43FD673F97C9B7ED - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = 2A38156C2F8DC4939FB0DDB0D2860B276486ABF0C58085CEEAA88DD7C33C3B33FB64378EEDE87290293CC98FAD3F - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = DE9CBDC2E3A1256271F119D08463ADBCDFE28A99BBF5861DD6F80F95C92CC045837D2794323C829EC578AFC95683 - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = EE315AC1FAA7667C17F4DFBC793A08CB6368F2A086EE1241E6A805BD14B1F4D5C1E8EAE8853CCF9D6625728E196A - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = CAECBB81E9C0D4EFC30A8979BA50DC4DC2239CA9438994305371E530E0A51F338A75856C5119C500FA504D888E3C - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 5643651105C12AC5A499A7A9EB37C3511C6FDC8BA670303D7D394C2A0A2AC57558B4606FC550758E93E0F9DDFD84 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = 1D0AA1274B30BC9B40A416555CB5FCD9EB7D03BDA24504972452340F4D0F72D48F72161E08307341472EAA4A9C05 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = B1F69A00DDEED34B28DF0DA262BD972874865D3A7A01DCA559D3C3E4D7ECE804AE87B74EF10580C52AA3B8CE1FA3 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = C9A1D6AF24D9955B80277DDCE37738714E2E4BB659A3BF86599EE904DE3E64EEF9B62915A2F45FE10351ADAB7A49 - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 4114800B6E20919A618D3EF93B03BFF29541CE781E7CF7EEF4DDEC106BD5F39A4EFAF7ADFBAE444F2E43D3E57C98 - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = 15CFBB19F5700E1C09D614A743EDD0A26456D4B37DE5FF962B21B2289A818132D9F9F251A55A0A7DE9D43B59FB62 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = 1A35F426CE6896447C1F8E0968C32AAB683CFC5E45AF52D2DD4A5CD878DC70C4009FBF9C86C729F6A4A87BA5E49B - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 21CFC803ADB6CB66B692193BE575CCBD911B476CBC5FED70FA7B74827A9C1E6D193FAD0ADB26F5792367DAB9D9C9 - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = B2334054EDA32B39CC77E0F89D5521476AC0C8CFE0E9DE596F2F7272A3AFC5DA8A57860990B5D99B71C6ADEE02A8 - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = A0D83F54749135A7A3D452A3A94CB729E774B049B422E993ED8D55504FF5682CFBD01A415F55F9658B72A3FB4EA3 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = DAA97889A5ABC3B0E6A99B3D86D32DECA8649D568EE931FB59410C7C36253AF75BACE42192E8B8A080479732B3F9 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8087689425F62D214C1A63346FA0BDAF1F32F5618E080CC9A5E412F7281C0633150AF9BE248558AA00060B3212C2 - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 02B65E258349443E1B3A51627474C37888B314C476317215C86B3C2C450D5A89F59AF0CE7738794CECC50641F9C4 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3C921841EBFA06AF95FAA51DBC10735B075382114D80055E48CAC9EA89BC5259EB2DB3B31404FB809D7D8D84EF1D - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 2FE15423F1F0A8B3FE208A8C5A90F3AFC849C1173FE5C666FFE7609D41F7B5374B93D047CF461F3CBDDD2123D460 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B020E03A4274428E912994CC1552142F407811C63B125A07CCD7B9FC5DF638C2517DC9FF935A2CD1FA2E1A4649BB - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C000025E534FBCDF2E9D4D965F5B06E0F5D0EF15D5288DB2C2A98A7A0AA8FF15E8280716A56F7A7BA585B6DFB868 - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3CCD862712B2A1EA67F37B60CF6CD897351E9C59425935A6CA7C1F3AF748407C6C6707D3B330EA8A18F7B64338A5 - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 176B82E5AC2E3341D055292E2A6DB5BAEE4F3F048BB44F0980708A532D3C3534E19185689053764A2D7B0E6F5515 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 2A459605DE22AC67F23C75C8870AB5BB10CF607B9A59820D6151D5D1EA8BE7F92FC5B1C9F82EF952B4D3C96A1D82 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 73793B54ADE9C3A03389BC135AB1CAE4633FF66E502144D3C9CB3C9A205A04E21BF0CE4C65CCD62F808C11210EEB - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4F8216113F215F15748BF0CF727DD2AA32BB5DA90886671564D1DA1DBD970846DFAD2F3718F7632847B21CE4DD28 - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 025623600DEE49364393D866D48907C6B1C96AA8E470D8923643950660EAC2698A084F70080F5B77D6CBA7F635B1 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 34D5A477CA74195145F060D200AB644036FFDB7FDDF6AA4EECC6823A46150A24927AF4746FF9B6B6CD362E4B87E4 - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 619D41FAD0D51172B57386B817A2276473EE509A36F3CD11B670190736853ABA687A6B5B633D4D681B6636398D94 - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9F753261BA48B23AE4BD473A450206EB2E28687FB34EEE8C56E720E67743733A9D4466812717FE0D83A4CC6EA3B0 - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6EC91161460DE504B64B28C509D0A1CBB5A39B109425B41BE815849AA519C29EDD8BB8024F2CB05F75001F520E5C - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 0A0D9CE64B7D1BBA88B369512A34901D70CB84FF259E51104E0129AEC2B35A50F7CC78C07F5DD490A2A81F433E88AC - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 1CF0BE50A57BB12A178C77DBD19B9D3DFC975FDBE63505B9A407F00FAA2DADCB1418A2D22362E7D625D6CB721EB0D6 - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = D5A5A7B1B29F15FB534BF2012990D231C02098C98FFCD9A25D799B088E45B3EAE634121C3F518A31B8370BA28E3769 - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = F66D267D766F0110885C2C9E025A3CA3C9AC2BB85EC37B3F3AD8EED652D5E1ACC01172BDBA655806B2AFC82D2D62C1 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = 6D5DAC06E3C59454BDCFF731839943E0B74B4713AC443C3C153FF030C5F18C54DB499FF05EE74778B69B624C6563A4 - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = 53292F0461AE06129AE1E14A348021BBAC30D686AE7BBFEFA66E47CA6DF8F8C569388F1A5EF1DF7F9FD9276BB19CBD - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 4E445C78736E9E0CE84F4162B574A5F18DCD0414CD3B1A76151F167B9BC0F715EE7717A2D901574D5B6D966B09C35B - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 9BEE0F03DB8C980E5CA77D10B6B77A6A84325F28552D8F2EF7A443495DF3A841CA5F988551E2CCE7D4079E1DA0562B - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = 5C9147E1AA90EEB328869A97D5B71DF59327B663D8A6C486AF16A663DCDBD3BC5FBE3264B42D48E82C16B89676380A - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 2671EB7FE131EF93B3AD606BCC4A6F045FF665F8D31338CB5BFEF9355E552586FE9AEA0CDB697089005DAB4242F129 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 1FC9ED4F8736B987E68D4BD4E982D2B6EF82DDB379299ECEC0B37683BA23FA02E470932092025474FA8F2DFD861A6A - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = 71114726C16213ACA86B935EB5DFC764DC024BA32444684B9934F2EB9265DE62A19A72FA4861FCF4AA090616647C5E - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = 36D20D4298EA93354ACE0F044AE38000C6CF6E522F31F7F36CC77E76D3C1E1120F186B0B46A0E63605517B1BCFFAC5 - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 5F19C6FD09D4BFA755055E05C1958ABC27C4E2F47D621CD6E15CD93A2CA83886ED9BC9B04DF9A90B6C6EF6060BD954 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = 61416684AF33EB225F7A3DAA486AC32B135E1B72E4A369C5A2CA0699FF75E10F8D3E4B1E316B49EFDD65895180D966 - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = ECC891842ED26AFE6202B809F851EE161CDCF42C2F4171451AE71CB59AF535D1729B2F5DB5F05F560511890908E62B - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = FB1E98535D0D2F3C667283420B9EA3E3A869827D615D40254D6D5A74ED34E9E6D6CBD51DE4A45F9EAF769B15C025A5 - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E78E093CB9888992EA1C980EDE970771A51EAE788052390A8807C101F9E7F199035A7BE439769C48A6F83CBC2DC6C8 - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = CEC372B32BD75156B814D16FEBA772C593B9F0FF779AF8C3B562D85C815E7203BE3C37DBB1C11E3E92976EBAB0D7AF - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 967841419A04A38512D18BC574989F00B20B87F3454A31083A8373A2B87251E5AB413BAD0E7C1855068C47DE0EF855 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 95708CA357B2076FC4FC4FD8CE39D364C45ADED73FF0C5696D5B56122A84FACFEBA4FCB9705579697CF894C138EB43 - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 04D983FB974183F5245EA496C09E33B95878737DBFF2A4A96B82B70ED5AB25FA90D03C3AFEF45E538245449EFDBBB3 - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 18C4E384C45578B06BBAE4A830B0D616341D717AE0CECE5E9206D481FA49220167C205AEE99752D7090A4555826FDC - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 1D4681A91800EF16D35B3AC1F226E323C99CE7DCB5EA3769D46C2CF57EAD808899C65FA09B2F60995B68CA4C584030 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F1161A3FBE40754C9F7138D366AECDB9B0E81C5B208997153274DD6F7D88B2737CD07561FCD0D8EAD1376573487B02 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C3C32636A7FB01A2A584A8B13933E19AD0C42595410F95978A266637F393B289A37CB49951A021B9F57A00B96DB902 - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = BB8F385659ECA4C47C9ADFEEBDB76B89CD8D457565EE36FE408A5B0B21779D0295E3437A1775ECCE516B0A26164C22 - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 83311808A1A27E6ABEC29360B6A491AF396B0C2F238A5234F6E79737AA532704FE644AB9201091F2F74BEB80F397A3 - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9AD60E25E3E9B9097B2DB10D2DB099CCE25473312E7D58E88914335EFE0F55D9B979B35E9D7FABA3D6F9D89B8BDFDE - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = DA36976E0D5C53DCE0235FDE4E1822A3FBF626CE1B4BE4D246F52A94009951A3259354CF673297B82BEBE1C508E362 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 0E8F5D60A50E6C1CBDF45B678DFBEA122F12E6C699397E9731C805DA54EB42FBE12F13A9A444509A21BC5203E01468 - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = B36FA867D99603F33A81157B627ECF60A7AC79CF4C01CE1A439EE9918E9D46635E9934F37292DDBA332BE8183F961B - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6875024A0917AF47EEE2FADD447AC46E201ADCCFD2DED76E5A1F011CDA368969448BDDB9A659B2439F4CC646539CD6 - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 121172803F4C842365D11D2437577A433D329ED82E6865CC75FD26C1863B6914A7C0D51DD4AE47B8808A329D28E6089B - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = E906E42E5CFD292A42B7493B4B53D18FC730758CC2A233EA446AC819AA09FC2A84138DC0A5A3FD8237EB2F9537FEC1F1 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = 8D574D91B45163984D88A6ADA40128F3F4B99F17F99532B4FB13AB08D8BF828F062ACD6D7FFC36E49C46EC403493D15A - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = FAFA4C7492131996E8ABD83D997F54870F25AABF3562A0A10D8C2A0A491AAFF4093309D2B9BFB59DBE20D5ABA24DF95B - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = B09B3ACCF8E07E92B423EEC304391C6C31957056B5C0F47D7AEEC0FD07D4B58ED46A49263E184A6D0477B9926E56523F - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = D2E4869CA046F2F49A2388A9CD48CCC804817C580834B715F748B927D4A1639358325A2BE7BB0229591BC12A55D9F60B - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = A7F3490B210EE5E7E30057C32092B4FE2D1CEDF1C361EEC130D53646CCA1A81AAF47872EB94DE3820C6391556C49D908 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 6E1CB3A06AF48F2B240D3B8E22D2A1C91B6EAFF5F30A7D0E80FD5902E57B77E1224486298155499877730F4AA13DFCCB - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = 80E511E01DE9D5A282CAEAB7B5B7D7BA30F4FD9641A71D09E42E644B41964DC60CE53AC332DBB2A5FD7D9FEB637EC995 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = A93D1D09820003202F7C91836E47D2640646181BF3D1030D24DFD87802B2CAC972CF63CD4305E142B623945D6A466CBC - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = 7ECF9D81DA6406CAB1C776702C7E54CB63F14721778418B3602735071BA6C2404FF169ADD70554E731DC5E29BE3FC1FD - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = 2E3408EC903562B4E8B2D069A180CEB3CA99FCB446E339D54A77A0D917FB04B33CFFBE5DB7189F56E31179D32E0B146C - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = AA820EB70544F5F74403AA13B8A41EE7F01C75401B159A4486FAEAED1FE5152E24A1B0B7645300DDABB93A55BC620C93 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 65E14D474FAAD1FA4447FB6AC45EE337DA59231101D5252B3DF6790EAA32D5FB4FBD2406498AE6525BCD1282E329FCAB - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 5C7B09E7961889CD672CFD91E4C89499A74BB060D279E039BBA2D05BD3A8B4CA792DD7516C11051C035F41B6075682F9 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = BA33826E75864F69E5242E3BD39424291C98EC8FBEF4AB9F6985646E8A01F5666042EED8884C3E142F9DB5D35CB2B28A - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 04EF6DCAA9E933EBA8FE15ADEEC8D27EE607914FD4B7D842E0B9C8221BDF9C29DA42EE7AECD6FA5BF11D51CDE6F7E9AA - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 281290C09E0BD33EF28A164BDABB878C8D1B06169790A5F7834751541CE8080DBAD89C7FDA7AC98FFB4BA2B1519D3046 - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1980325769E1DEE75E0896B17FD9762A5BC072A006CA245440B6204E04090878DC24775AC6169C6D69A539658336692B - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DD177EDF1B29124582F70765464F37061A0F3E5FB2B229A4DCF5E665D74D9A8B77105C9DFA10FDD17B4FF4EA03B54A84 - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = BC65F8743755EAF00339EA05B481B0D89266D1103B98980CCEC9B3750A493478F069B77419F5D08515B6604576D7AB9F - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 557FD03AE02351A83583A2469FB2724F0A4A8B6E920ED05451A569564E6982446CA1F26555B4176D49263486A9F3AD57 - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9418554C386C24004DA2D19CDD89AE1156BCD9290B1AAC07DAA2A384519E72C68801749D8F2E278259094985B1B0056B - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 45E5FF4B9D9F2B263A02D76840EEC759991AEC4D02CDD9B8C98D62BA4BE4F4761DC543720B64E902829B6BCFD7E0BAF3 - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3C5556632197EB80DA2C29DBB506A0283052EC24DA548624210BEBAC8E839A55F85CE9E1DC821DE0DDAA1593C4F01022 - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 858F555375F98810B5D19035B3269BC6CF444F137F1C94BBE02710DF7E6CF9A4D20DF9A045177EE0623F2F7441B74892 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 757C99569F79DB6FCF1E4100E7912CF77B3F7AB7AC83FB151E5F327542969A1240B94F2023EEE1C22FD5CD01B2BE5FEA - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2CCF850249644E9AD9E9E5939005741627D25833D3505B871572EACFAF9DCA6A38F3458F0D18A72E78DC80FF610AC835 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 71B3115CAFF049F7943AD91A4C99DD2EB42ECA418D9B15DC148263593AE48DFF2030279B00952BB4A48A561153349708 - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3CD0CAEEE0710AB21A9A01C6CB161D9A222C40D17C42A239BF3EA735D030B9BAC3539C930F36D9B9128D6702199AF8F8 - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F38B4470D6AC2FCB56FDD10ADE6A204822BEA8E9BE73B1A1675C75AC982B0E0B079382CAA28C193D409BF666C40E1695 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 006DD064539E869DF17D7FB9CDB32595C0425AA030554B0A7D5E57F5D5D4563C4DFE1E241B9B53CCE0BAF20724C4BC76 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B0C0D0E0F -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E4C75961EA0A1F4E1509DA3AA6268F30624BBD8083ACF3FF0CACD4E5111A542B6A04B6E51EFFDF4C554C66E58C879CF8 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = +CT = F3467A06083B64358EB51659FC8D6D5D + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00 +CT = C8FD86B45B125A5EBE0B1E8D60DC44C2 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001 +CT = B7B9BF3FA79A401C9F35FDD042CC156E + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102 +CT = BD6503317D3313AE799E3172C978C35F + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203 +CT = 1893183DDD2E9178C0FC28D0A8945812 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304 +CT = E3EC1ED835C44C2DC678ACC662C428D2 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405 +CT = 04C4827FDDF9C1310C8650B1B41B22C8 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506 +CT = 62EB96A7BB3B63EBB6F08BBAEAE77BBA + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 0001020304050607 +CT = 187C98A7D61A0645D5C7756973A63EB6 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708 +CT = 8B64B437B08E44643BE546B336A68407 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 00010203040506070809 +CT = 3CD08DD8FA26A18224687837BE40E27F + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A +CT = 189B749BDD44FC90BD2E797540B166A0 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B +CT = 0D9B7D25DC32A58EDB6677A27C602156 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C +CT = E5F40B283D8EBB187BC5407EB4663486 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D +CT = 4167798B6A3EB0C51605D0D6F8DBC4C6 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 6B9BB1BE54CB0231B68B17B0790C1FE3 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = CA99E5FCFBD0153B3C63F93AA58DEC12 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A1A317B5998821150654118928B64DDC + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 48813B08AA34C3ADE044D10DFA999DAA + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 36ABB7984B0623C9CE132E44B342E405 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8FC14D83530E618306A85A0AECAD0264 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4858866773044484202DAF0FAF276C5F + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 88919ABF68B33307C74F9443D012B50F + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 426239BA8696C3D37AA0762FDD8CC9CC + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EB1ABBAE1268EFF83DAD08A25BF269AF + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DAD56A3782115FC4E5E8630790E79A55 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1EA5CA7309202ECABFD3C8EAF5956A97 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 315CB792FCDB9ED5D250852FC986F6B7 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F3BA8C7B796263D5C2CFA044A2C7FB18 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 97C54D073FD4222195371836E1BE93CB + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3BCB6C96F2D84BAD5438567766DAA81F + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F6D5402A204F4A8B2BC1D13B67AF020E + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A84AA90220B2A6463D94FEFF6093C586 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = +CT = 7A6C405C76704442D565FF3B1434665B0B + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00 +CT = 23BDC419387C27EB8B17FF0EDA9843338A + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001 +CT = 8AEB94D04505653B06BFE02CCC0CE08A2F + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102 +CT = 5050E769D4FEB3CE0CBD945A1D71979235 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203 +CT = 9964D9BB51B133DFBC105AEB96D65F3385 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304 +CT = A695942B7FFB23D6FEF8E8C9A6BEB37D02 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405 +CT = D213983371E01A220FABEEFDFD2C97A907 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506 +CT = 5DA0278176F90990A8C9D132B2B0483180 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 0001020304050607 +CT = 4923AD06201EDBD15E0874D48368EDD03D + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708 +CT = 7DDC9F93BD89502B350E48AAE54F35DB6B + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 00010203040506070809 +CT = 35A7CA7FDA0C64D3B75EA8D9C11DA6E849 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A +CT = E6FC43AD1F2393FE8FA77BA2B6E228D152 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B +CT = F5DF32B84A03E64B4FE27EC63FAC15E0E0 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C +CT = 25194B254237346A99C90E39A6631FB7E6 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 294B779AB314761CA821C3A4D51241FB80 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 900005701621B8EBD50A4FBAFFEFC65B06 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = ED24A99F0E6C92B0DA65E6D22A49752008 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 55FF9567706C2655AFB84A48F0385D8A11 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 757CC2D7A5DE0DC8784CC5C0811E8C33C7 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 193403C28B51746ED60E3045D1EB4DD0D9 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2FA4ED1045308AD3A28D73C3B3EEDE35AE + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F419FEF8E7D5FBF3F90AA777B349B7175A + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C72C96429F4E05B4F5CFECC901B933A031 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8B57B2F7DF30B2E11C28A203525D76C637 + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 807FFDC14F8DE8767648D7A18E3AD49646 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B83F0130FC1FCF9AF847C1CFFDB43B1565 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3AD2388C4DBA2CD57B012444C4468B6B22 + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2012544906527A8F51BF66248364991051 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D411679DCEC722787E64D8B1C4BBD39671 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6DD441DA10E1572714998F362FF9A17FF9 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 221F9AD1034D211B3AA142AA5D9BC0317B + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = BD3C1A5BC96F0EF7B2A224444301AB6B20 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 0415DDB4EE6479AAF4FD9E76142C88479F + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = +CT = 4072D2708B04E1495B138D37F19DEAF04E39 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00 +CT = 1B330CD32BF7A2DE0C952A1EC1AE893E2952 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001 +CT = 8ECE7A3CA88465E7C674AB4FD6BB15F3DBE7 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102 +CT = 78194E7A620D0E04ED778BD4A0A4A3E92BCB + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203 +CT = 93C3D23CE1A85A393FF11AA8FA74069E68B1 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304 +CT = C140A725E6299B9889E23169B6EAA4B45059 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405 +CT = 070F54C89A12B3CE4075478F66945A2788DB + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506 +CT = 3ACFAE8D9BE332AB2B8C1CBC4F9BE34B7A06 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 0001020304050607 +CT = 91615A731B66D191D6DB61D0336CE493D85B + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708 +CT = F6ED95D8EEA0C62CC40FB7C6BCE539165667 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 00010203040506070809 +CT = 8FEE7967F0BBCEE2B217C7DA38DA493CBC94 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A +CT = 5C11E131C017B6DFA454BB68E529F021BC25 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B +CT = 6424954E308A8C163FD3309D558BF7096F02 + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 44228C570E68736A2DA110A31C59CC580CB7 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = F523A55E9ABF5532879162FF8B3426019438 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 41DA97CC9C5585566C8087E6CECE58D2CA52 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = B33514DD2830D39C6C49F1B08A6EA15B869A + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9DEE274B2A532CF2EC4EB2EBC295F3646B62 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 71E2064E67C1A716F3E113371E5042486508 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DE8E880001C10C63F3B9BEEF56E97B3271C6 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B66802AE07686006D2E61A0934C0A4A46ADE + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 38AF775ED5C4117B90CF6080FAB7F45BBAA5 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 28B7C4972CC468FACFE5E41A465A02626FD5 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7867342FD5CC948539EB3B7E689720F44E11 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3AF186A040E28F9E552209A903360CE04640 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 669D08BFEF13B1DDC0AE69AD69D63A341912 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3A3E98817A3979101ADBE279C94E69E5EE36 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = E49BF33FDAF75584D8D62F331991392BF677 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3A6DDAF98D1F83C9C6FA38AEEA60396446D7 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 081592710504430615A6D2B9FB4731A06F50 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F6EDB417E43F8C4240E47FEC9BD57070E744 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 850170F7243A47FF145B4EC6474BC091DCDE + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FDD16DB926B9F867C0057FA78E3AFF236A05 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = +CT = 1540CC0BB7CC52FCCFB6E4DB19A2611BA5EF60 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00 +CT = 6C83358847CA286F693EDC142281C2CF64C3DE + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001 +CT = 2B546F5A3B7243DAF7FC39EF08EB0020A649CD + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102 +CT = B766293F7552B1F439411AECFE38F3D5BA46F2 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203 +CT = 10D110615A3DC0BD03E90CCD4CF8AA625FAB0B + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304 +CT = 19B8CAC86938D95CE15E260509B99097812493 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405 +CT = 49DA47130CDB65828B05BC7A2661BA1DCB1DCC + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506 +CT = 026596303883CA0E17D71E2E72FE2901785156 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 0001020304050607 +CT = 6F8AC7F3B64DF47879293A682A694CF8FB425A + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708 +CT = 3EB4556BAF1D2507029715352189178AC379B6 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 00010203040506070809 +CT = 1B20D8A34D5344C4D46B46B9EE2CED0CA0FCFA + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A +CT = 27CAD4C6D0917CC68B5AFF0EC52AF97D074FA1 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B +CT = 5EBD34ECB4855879F93507428077CAD4FFFD18 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 87A0A9AC6BB46216AA3609E6FFD685E042B59E + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 7481E1471FA8BB9AA720EC714B7FD30625F507 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = E795D7129706289A27C3A8DC1BB0A526C78B3D + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 204FB43DEECEC337BCEEC2A435EE14051B8DFF + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C672A415166EA395503925DF90EB4866FB9E7C + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A23A9B9D28727DA8BDAEE6BA0DF9180C69BD75 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 716A2161C11DCF0A17563F9260E15CC5EB8CCC + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5628F98DC438888C2602F5B3886883613802A5 + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E5AF590F649F8813D8A5B39763E50B690A6A91 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FD798CB67D21F23FBD77F86984EB56999CA692 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5DBE3A7B66DFBA4E4D0411C3A9E792BEECA124 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FE6E5621A558BE665C62B82E4263FD7BF259DC + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A8F7E6F8A1A68959F7AC81DDF14F471AA2F2D1 + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 44534856FFC9A8F47EA11B26A44AD0F447A1B5 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C30E850C4322D4F1A74EA901100E8D8AF009C0 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F7F40732B4EFDC5B85F93521A5481144173660 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5ECA05952E474C03D0C463559CD4892A5AED40 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A2AFCAF71304D255799EA13FD3765168862717 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6ED06F2C10203D29AAC526835BB8A9DC9173A4 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3E587D680DEF6F9D2A4C28377DC56F71D7CA9E + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = +CT = AA2FA970C1A131B2111FC29C265AC6A7CE0D2660 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00 +CT = A2451E4C721BD15FA4C15FB12836BA11F8D0F570 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001 +CT = 0D48B5AF3C8D11AF3D05779BF78CA30DC1D435E7 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102 +CT = 9A55617306DD54EA463004C3F981A92E4BCEE1B7 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203 +CT = 4EADD8E71A6F832F1CC24029FED3FE70951C1539 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304 +CT = 7ED8A4E92AB4FAD93336E5C2CB1A1D4FDC19EC98 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405 +CT = E65A7F3A67DBDDDD1FC788E23ECAAE1F475177A2 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506 +CT = 2ABF8725B0E11C1C23AC204F1659D3FD7BABAE4B + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 0001020304050607 +CT = 2C408731EEB6D35954156F4A1FA824FC41BC963D + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708 +CT = 1AECCE77FF96429B2F1A923A1C8CD2C2E493E08E + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 00010203040506070809 +CT = F9E0678028C039DE85675601F7B791DDC67F4021 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A +CT = A01D9067B201792A5471EE7245C133A7C28DB431 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B +CT = FCD6CB92B8FA931D33A267B1418C589478313681 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 434EDBEC5C8AA9DCAF2924A220B250A61907C306 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 4666E64130EE8D8D5A90B9358685E2E41D117CBC + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 82123A9218C8A5650354DEADB2B86220B6C1594E + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 4ACD9FBFB32F0FDCFEC0085A358283707161E8B4 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E5DF82743387156810BDA09178B29F56C99264EB + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CE75ACD419E31A1A2CE34F72BEBC5826B26F6D14 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4F8E825EA90CA8CD2E39DD24E66752F339E2650B + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = BB2D70330FCF87F833BCFC9AE66172CC3345D9B2 + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 98FAF7A4A398329572A8F28DBE33C0E076F7DE78 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CCCB6662E42BF5855D10A7CC94BC5B3ECF20B5F3 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 617709787FCE10225E97F33E58178048D4A4BE7F + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FA456B51855909D9B69FA8375ED9C6EDCA4FF177 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C88DFA52CE2C2E98C70358D4DFB943DD5B8DC570 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 802B489702DC30B59049ED613A5DDA2B597D0EC0 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B07DC6E453B1A71324C2320BDE7587F3B1505688 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 59C156836A1294FFDFE33FC9202C165A5EC33470 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 02EA2321800CC0BC5E6EBBC6DDAA5D507FCB61FD + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 5060AE40C9D167D804D56919FB081CB00B9EDF9B + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B2EA6703AC6B65A3F6D53E2FEF5729AC494694ED + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = EA3779ED0E7B7BA205510441F73DE3803CD8A85B + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = +CT = 7F4AFBB3A9CFBBB0F9E9B8C3C5461B070873FF0691 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00 +CT = 359D149F8356A92153B93E1638A30B99E450F56A99 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001 +CT = ABE8457DE763AEE42E513D010EEB700EF59178F8EA + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102 +CT = B219816961E540075C86C704E09B14B24B4F1A03C4 + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203 +CT = 953FDED06A268637307819C939491B57503E563D37 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304 +CT = 0A62E49815DF8BC8C2A7E11DEE003BF10F3B3A7EB9 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405 +CT = F1F600C1D3C80E1609BD3B778C5DC1408752462AAC + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506 +CT = 3F3C91B84CD8D5744B3271806935492F4C789D50F7 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 0001020304050607 +CT = E1E976F5F74ADB506401A3231A68A15ABAFF61DEFD + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708 +CT = A01BE963E3529D256F8D8E71F8A1C20AEF7BA5F8AE + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 00010203040506070809 +CT = 69CE3F129CC56B1603C979ED67D24E717D2F7DF54E + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A +CT = DAE871CBF5884C791E28347365C2E430BD07D87A06 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B +CT = D342AA000F7D7B568C3CCBCCF9AE94F171C49BA474 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 18B4D957CF6A5728B5EBF0D8F8FFD4897F86D162F1 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = B502C2613A7D4923DFFB304A00BC7CCE881C88D246 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 806470EA0505E878879CA5D81F6A8BB63D9B72E653 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 4F4A620552A90177A7A3921686E480EE721832EB35 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6378FC1AFB5A478D0C40D6F865C8A3277096011BB3 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7287243E9EE2136F0EC45EA818DED1FD39C4D9357C + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 76F8012CD328676A990911D8ABBEC59A6C83331772 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 193EB3E5F8DC62A614E59C4AB6A0D6C76984BABCCD + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = AE16682A7CB1EBF99C3453EEDD9433A94A020B9D19 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B38ACF0E1856E2D69C2F9D824CFC76EB8DA85BCEF5 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3049BEC81A12C6F4C75F745382BF425FB7929E2A71 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 74F9102E7235D5AFDF79CC2F86A069626D8A8DC4AF + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 92F0D90C5B72159B23B03948975EFCE45F37BC4FED + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A5B25737F029FD5747E8DA600ADDC421FC3DF9BD78 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = AD5D5B55AC544E23349006CB8FDAAC46035412341D + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = AEE1CAE05EFBA565E6A6A5C3C0395150ADD336A104 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1073D9CA0BF09025DBD719016BA6E9E9566DA40E09 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D0E4CD2E7829519ADA11E2B64FDD3153AA9093C997 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FDFB61A16903F155CA526D6D027DE0BE70FD9B3B38 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C0D61C5504C4FED9F783F36C7367FFF59638A87F4B + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = +CT = A31072C9A86CEDF1D7A2AE95F0663986CBF22CE9860C + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00 +CT = 72CB33721EAC511F61D72FED3148D2C1060545E25744 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001 +CT = F33FF2FFF34B61F1FE3DA3BBB9034149F7D9E7C723CC + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102 +CT = C5881B562F05DA8E82C9776248D32FE1ACE9B31547C4 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203 +CT = 229CCBBC35597BBD217419543D2DD6C090DAB6B3B458 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304 +CT = CDA18359C231D775C081B08645309621C25303E832FA + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405 +CT = 156B15211036E9A6C8524457870EA907B2C6E1230B37 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506 +CT = BAB6DD2B8C3C6407981FA1AEF2BA2C4252EF4C8FDC5B + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 0001020304050607 +CT = 46FA889EFE2CFC9AEE04508D81D3083EFEC0EF30659F + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708 +CT = 0D69C08B7F7D085F9870B3E4B57C4A27AA924910A74D + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 00010203040506070809 +CT = E42E624E4670D4902EBDEA57D735BDC70E70F7373A6E + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A +CT = A92B2DF13E3DFE952637EBD016189878100E8CB691EA + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B +CT = AE1771F20616D47E79B4F8298CC964BC5918A26E7741 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = AAC93949095AF5FA79A956013CD85B79A3408931B3B4 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = AC33BFD0671027D966FB94A2BB3BA5F2B800F676C6AC + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 5CCE01B369E36997F57308702D8997DADC893A013A6F + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = BCD6DF3F5D36421F6830257E03E9B2695B4D295C2698 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E326130764573DC784BDE9B236B2B92824AE78E3D3D2 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5A4E888F58E60E236DD9323CA1132983DFA95DF2C590 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 789E94E45A71B3548FC47E3D5EF94BE789077059AF31 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = EC91923F26782B256EAC02160F11C6F3C90E3D9E625A + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4F909D1B94E321FACAECA305C5A8F9F7A96FB43B2B45 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C852CAF2FD6C567B5B2C87784C18FA06F0A40B34F43F + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 460D546CD979A825E2177FAAB5CBBAC22C845F44C296 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 16F1B29C87EDF4485E1C78193A707EF2EF50085CDC80 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A2EA6CE654DF5C6C9D3219D6F4019894428FA35529F4 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E6C1CD7EAE80CCCC8290C25D87F4DC814291A23E561B + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A2714BC2573494F651B80C638C9F440C7006AA2246EF + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 26D59D2E667849DBFC541D4F7D1CE50332C1AFA9E069 + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = A1031A6D536F70CFF1F21B31EEAEA9BC752649339651 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C556A613DEA8C2DBDBCCF3DAAB331AA865AD459636 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A2D5F43B17A0B85C5D4DC1FCE4C007AEC6615E032C70 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B228891FE7144ECFFF434B9B2F62876454C002347CD2 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = +CT = 154DC5876DF27039FDBBD6680D1DC7AD5638893679CD8B + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00 +CT = 0EF62EDC8AFFA660BCFD5A904D395CD057CDB25FEC7C67 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001 +CT = 989072B6B4D16607BC06DAAE817604571C9EC4024B6ADA + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102 +CT = 1DDAA769682005D93751100C67E180AAF46F07DFB49739 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203 +CT = 4DD6494C0886372B0F35DAEEDFE2F6DD2695E9697D8BB2 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304 +CT = E8C149A2A78DF8EDFFA99397B09B12B71037499BFC1FA7 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405 +CT = 651677DA4E13DAB7B27F2FFEEA5EE2BB6EEF4428A623EB + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506 +CT = 83AB32DEC2997FE40E94048B0AA3E5601E4FB20A5E53DC + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 0001020304050607 +CT = A23B2B1E91BBC936764DD95335324C1E0027C486D574FC + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708 +CT = 7D91BCA7350A02ABE81F3E1F749B1A4FB295CEBC74A57C + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 00010203040506070809 +CT = 9CDF6B7C891EB11323EFA90F5B19B3D123C22AC783FBBD + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A +CT = 7033CDF4086EB94A8D16E61A89B306E52EE62821117E12 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = BD406D86AE6B79BFA2890B76D0AA0397015986CFF6ED74 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 9CA81D1DC927DAF7DF52BAD26D7D341BABCC8F5C260929 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = F6407F03C25676C0B5DC610627B364AEE44A1E74428302 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = F8A230DF6C0FDC6AE5CC7171B5A742D80D3C432CEEEFC5 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9B8E908FFD754F98C3EBF521AF6B369FC02C31679644BB + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 66B4CDDD237B5077AA36A2E3CC2D24F8AF81E45236D335 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5DF62CAC1B2E50935C540B0AD231FC128E618C7524D412 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 66D3FF2BD12AF7A56FBB3598A0FB106C736E31DC71CA42 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6DFC12634975E0A29D4787147F28129A6D580F58D2BF9D + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 580D4DFD57E8BEE8F067095D4FEC14F6C1087B6ED09704 + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4C09F1C9E04CA0AD7F76D960DBB3881FFB90C0B6E166D0 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1B090A52D3EE4BB4F2DC5F0B9201C8FE53B1DEC9CF4599 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6514F174119DBBA55ACD6F40D5C4F9CCB4867F59783AA9 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 2C58F5C3E12EB2993FDB173A737320EC198A02AC261042 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 84141256567F3C8D605E3C59B87783BEC7B945FD6383A3 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BE1AB7109D49222D1FD99B7CA5CB4521A697C93BCB4065 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7F578DC755D01E19559CEC2F0107684BBA16F5DD05DFE8 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 647A0707D646A8A15D0D5534895726AB55760CAE763F07 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D3380BACEC9504B3E6CA576B5E34E8E3151D5E5BF8239E + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1762330744BC8D115E5114A6CCF7B0518E8EB4094510B4 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C2F8B4CC50B494076E06708BD29DCCB7CC6FD3C03B0013 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = +CT = 5C5969BD231D42E5BEA32113474A933BE7A628D092D8C2C9 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00 +CT = 708DDA169033F08C9A9466622326CB9D4AB0EC06EC4656A0 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001 +CT = AD7BDACC0FF8F866DF52A62A6FA1493BB987F5E16686A214 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102 +CT = 9599A4FD79039FDB75077AFE7B71C5CCE9B8CEB6616BAB43 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203 +CT = 81D4C8BE0DC4E013F7437224507C4A8740F19F38627134FF + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304 +CT = 58D2DEA71D20E8A1A25C9D8A7B665FFBFAA3CB012C1F08CB + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405 +CT = D71362C061DC7A71F984B426C1E801DA8D8A9A5D1D2EE259 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506 +CT = A49585800763E9E7C5262A01E512E3E71C57AAC1D9AAB0F0 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 0001020304050607 +CT = 2300BB0CAAC8466F7B46016AE901C575183884847AFAE7BC + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708 +CT = EBC2883CE8A4D1A422891C1B6779FE26BB53B6002252A430 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 45C129834B3F9456ACA8B01C6590F80364134F8A7F8C096C + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 80004FE8CA86B9CB41255757F9F30711CBB3FA274D334ED4 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 87914DE6AA181F817A933FF47F3F3E1EC1AEBE8454C7C26A + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 5D04B00647F19E9D8507704830E0C6CA49630246378AB67F + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = F17112A4813BA4137C9FE85A4B8292975BC59C955BF09393 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 7C589FF88AE91966B5628C0E0798A0AC509A5F4213138511 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = B3B09FDD91F13A60B9395B41ECB01650F42319E4BE625313 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = ABC16751BBB2DBC7482B36F3B2BC93878D1A0681B9DED437 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = EFA8BCD1BB8449D1F85C55545CB3B2EB16D8E3533A728334 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 968ECF67EE8C8636797AFA658D7B6CF256E6FB75DA25D1A5 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 56E1F78CAC88CB5F0C24F768CB96C4DA68E15ECB3D1F8ABB + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CC3BC5D01B962B40DF7D9FA8889F9DE636B376B8DBDF04F5 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 208CDE686B79B9521B20B2DCC2DEF8FEB40CA9971CC3D7FC + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 98DCE19F92CF91F5C12039F74A2DEC2270E7B2D169C2B909 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7A4D2B0BDE48AFF2D13DBE43913787CBABF14F3CABA77FF5 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 53C749CDC7F7A5874E1C21AEED4ED2539D20E009EA4BB3F3 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5DE693BCC182CE18E4782773273F6BF1797F570367E14C3B + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A9A8EF9FFFFE017C6A16C3222CE4239523227D4D2B62EB7E + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5447E40009DB23D5E03AD425CBA0F0D863008AD05171B349 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3C44AD770F1DE437DDDED27B29725307F1EFE3FD3B2E0131 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E9270EE3AAB145A08DAD5ADAEE5E598CD840095381BB66AB + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 39DC0406462BAA4D912616CE47CE4BDB2E9DCF0284105DC9 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 97A772BE37F2D456BD04CF6462B2E1893D453562F57AA260 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = +CT = 5BE263708D4FE5068B1D747B1EB89999B9E8932452EEF50F88 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00 +CT = FB4805526F6315A44D063F75FA3A68BB9C3D48572771B41C67 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001 +CT = 1D39B806F264A950C0B2B33056628760B4B19EE9C538C82612 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102 +CT = CE643B2473AC546B4B4F94FD8F8680F4B069755FDAA2205923 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203 +CT = 63ED5E364E7493A319A8A6B7DE6D7E24EEB6E2050E1E76A1D5 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304 +CT = 68C449104414980FF803C689039AD22217635BAF7EE31E5F6B + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405 +CT = EF421D79C52009D72387FB3538D534B7D18785939323E48DCE + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506 +CT = EFB7F29B24E5E6A67565DB1BD515535EEE4E715D86A92EB207 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 0001020304050607 +CT = 92F49729A4F8C911CBF1DF4B6B6AD2FCECF313BD85FC007BE2 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708 +CT = 653C3CA2403B42456A3FBB8144A92E6F647FCD72EF3CC89E63 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 228FD202471D00CBA220BD8317CAE8DFB7060C3F2136F8D9B3 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 30DC82B000C89CB24FA829A1E99BE31A6279245978A29F8665 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = B79D929C70631BB256A466867CEF0C5A6CB7085E07C424BE31 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = FFBC07F5DC6C8B200A5A0151659B904C77DC497B67CAB10AA7 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 54E682B303371D368FFD6A57D209864F003DF82415B55A56E7 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = 96179467A9A64DCFD739FE785CBC246F683E13C4B9758BF840 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = EB112D358BB4CE4DF4303739BBE316BD053810228D16C81A8D + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 959C162F017F20419A8E49AD7A76712E7EC5309805A9CA471F + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3A118E47BFC52A47EA69F6CBF2A2E4EC1076DCE5B25FE52B94 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D64670ADC3B4FCAA0745801FCD091FE211234D213414EAE1C2 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 27945A36ED43303E7E27D8AA4E6A24E4A61C27020D66A9AC20 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 47FD4AE4C4CD608D7AEBE23E9F5437979BD6E5F76F2687BF20 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 514B0BB452D9E1E207569B0E2C4891A9E018D69382D9F6589A + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 11380F6128385B90507C5A00D315828D80CCFC65E7407C0438 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0417547C1818F0CF0401785C4D4348B0FC8C11291E2BE76531 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FF2E62411A330FC37BF94413033992821790D791238BDD48C0 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D7AC89DD9E84F2CBB2F0FC8BB47A966AE80A7097E32E138A75 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 94681492D66E0D5796C51A5AAFBBBEE31BDB4726716EFADC6B + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 92096F2AE6CD9F5AD3FA63318960D86240E65DA5FDFDF02F4F + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D606087C6F2BEF9C1AF78D308B69C28DE482AA94F453F35745 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 74EA5569AD1204A9A1442904F10F9490F941331BEA43153F57 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 547B905898BACE8AC5B30C777A8C82272004D540DE4AF680FA + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7F1D21902E9F986EE61D059AA292CA49A093331FB4890573C0 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = +CT = 417A401FD8D163EACFD626B91B8E962307E74173A42A8895A972 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00 +CT = 47465F9CCBAFE25C2D870F83439C825B77ED75DB22D5F7968D73 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001 +CT = 80A6E06A37CA7178187149D84056DA5331ABA8C2A43778FE3162 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102 +CT = 4F121A6A58B9BDE22ECD26D8EE9D69C7BBCEF3A03AAE9F7A75EE + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203 +CT = E6CE61DEA2A1AF2B6D08EC9E7A8DFE167F48B5EF9DECB475321C + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304 +CT = 05EE326BF0FD954607480DF7D9D64C30940847C8E2CAB484BEE0 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405 +CT = C1342C480997760497BCACD24F9C78518422F5BD1A7E4152EB3C + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506 +CT = 3017319D6760DEFFDE8E3569B0AAD072B2E0FAB1206BA1D13CEE + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 6E14E60D726891F9E9B2EE08F7CF41073CD48779CD948F26FF0E + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708 +CT = A39B3BB9B7F402292CC7C29575BA6D913AC2D07E36B71B31F078 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 77416B8A8BE208C376814B2365C31657AF8BFE84B5BB1E9A42F2 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = FEF3DC85261F8DB0982583B50EB0B85710DCE9CD318486043F29 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = 6505E4A067193DB3837495FCBB5132EB6ACC21E2000D416BC7CE + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = A054A33F20991995E6892F85CCB68A0A15A543E0A2DD23DE9A4F + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 028951E19DFE330FCA5D2029C019877D8BC6109EEDFB82DA7B7F + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 2E74DE3128E29160752A2EB0C1E129E68EF85930AA182B278AF4 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = FFE3CEE034F334D1E6B619328E689F3FD83B0011C7DDAE126FDA + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C0166ED0745C3FB97284CFFDE804630A7768C1674E92B3573FEF + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 51B57B7557B88014C539C6DFE2508C0348A6DEEDAEEDD182ACAE + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 28D60A1992128C9AA6222B5F01ECB665ECFF92E8311C8CB8D443 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 160D5D6C6C4CED9EF6725B6723D407FAC5EAE7D8B16A22559DBF + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CD3FBA2642C99AAD68560B48DFA5DC458BE19AA3CBF04D513162 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EF62B0F90407CCFEB0D69A165DFD90761BF7AD026096E511B31E + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 522BE92F66F9AC7663A80A790034BBB40398EAC4F1EDD5D1D6F5 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1FB3443FC36CD66D596FEA55A615C20C9580B1518D7D3C0EDAD7 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 650DC72F9E5638CCB5559A7D34032C13D4DF9E730977D3BE8C94 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7DF1F5E6AA4EF9317F844D45E496C171C73BF876A6B7E392119E + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B7881AF7D2348C01BD037520499B57C8C74F453DC58E9C5A8034 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7ACD45AF4767617E962B06D204C41283FAE6292E4F1F27A81DA5 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9795E8D1BC1FA2CE0F3602BE2230C6078D90819D64902DC6FBC0 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = AABF485F18900481FC30F0BAD5FDF256C755CEFBCD21B52710EB + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9D2DDC3636195114AACDDC27DA217810E6745250488A460AFEF7 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 45EA367CD50C17BE85841A4644AFF3A5677A2D574C5E8E1C9B59 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = +CT = 898E6D4C6EDAAF7129B56E8FA9B91DBCC9EEF9BCEDAC2377F170E8 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00 +CT = 743A611C860732A1CE07D7BBF7F0D5313D050DC2743FBA87242807 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001 +CT = D294369D2A025273182A8573E24C4FCB61BDD6D0B94CF26A6EC03D + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102 +CT = B34BAE9DE809E45A1823A345C2E80B326C430AA8B04EB22B019DAC + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203 +CT = 60DEC498AE89EF345AE14F41D8651E80C825ADEACC8405FD7DF8B3 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304 +CT = 8F5A1574142BAD43241F6CB44F377131BFC91C6E264A7BA8FF86AF + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405 +CT = E2616024885EFA73B8EF8E45F5E96A364E69860EC694C33DB86C38 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506 +CT = EA41B3F2798CCC0441FA345259AB48C220D5EB6136C2292CBC483F + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 3AE56ADC9513339BA3715ED2F00D702553381E60A00E11364082A2 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 61D331781743F0A9B3F84709407FD3229112E560DF93D1E8978E10 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = CFCD650F520FFA47743146987745054C1D8CB6BF2EE103B468CA5A + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 41A541ABEC3801D768AF6AFDA106F2653F1C65A0908901B6455C1A + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 01EE5A66F6AE36526FE3FE4464609697FD96D11832DA50DFD5B05B + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 730A719793D1655DA804BDB2B617C3557FE3906111B87A71F96043 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = F07F2AC5B83722A37755F94949CEBE657563238141200559A4B62A + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 46A5A52497D3E2B88E656A4AF0132D1D2F7BA4AA4D909E3215DCD8 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 3DFADB0CB78E16841A17612AAB7DB18625AF278A36E5C657E18B8B + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 19DDE066B26710AD09A9AE03244A0AEA1EFC20A49377D71B91DF7C + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 90697F33E8740B12104889123FB588588C85156CC3F545F71E28F8 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 76F0D030E6BCCADFE05C58C2D06928D41640C0F955969B07942FFF + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = F97ED7A7F2ABCDE1854C9DC1CA4CAE0674AC7389C3585FEC57BF22 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = BD085B5D7B97C50822761D91842FF8DAC8A17E9FAD6F150DB2D1A3 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9834186FDCB5F50E8FEC6AC248AB30730EBBF8E51240A6F804503A + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C1FD1E013EAAC622CEBB0B58F1CEEF33AD40F646FF0E273F1076B4 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4F80038C08B123E82FABB5721FAACAF1C1A485C254393D9156EF6D + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ECF12ED55F93D712524122C81EACCDC04E433AE1077F7D2959371A + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2615223207346480D1B37223938DC613BA398287325339E3284E53 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 54D0A50189922594CB014AE39788FAA4E73C82C040B3AE6A3005FB + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 109B01B343F1441A78D34247A26223392B81E2A25BBEDFC2889ABA + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 77A633ABCC406F677CFFCD7FFFD906510F0186718AF1BFDFFDBD19 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F51AE36DA18CB9CE603602768D731CC4910FBA4DD8659E008DEE37 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 484633F8F2DAEE0F75658C77B347A6E05847FE2CB53EC4F678D422 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 65D8FC9BA33E5A868044C555FAF1B864FF8BAF91CC0688C8F36F15 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = +CT = 1E2B74181926B2A3F3EA1DAA015C9AE0D33F722341CAC22925062D5D + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00 +CT = 7E50BE19F37A442DD4ABB2B17A6AF374AA438AAB172DF372FE3828FB + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001 +CT = 840CBF7CF3A320E2C7677FD47132DD246E425C723B5AA88590ACCA05 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102 +CT = C0BD82892F73E51F343140A9E4791769C23BB873D1BEF18E7AF77F4B + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203 +CT = 5FD1B72489214C2DD414059E0FF55B7FA3363B761096D51876B96E73 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304 +CT = F970F6537F44AF43A6F286BE809C794F2ED2935EB577910A890B4A71 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 505888DB91CED0DBABA92E6C9D461A5FD2352DFE6470BAF150C6F636 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 9D5C3400BD75B97F46B702BE31BCBC9565A1DBC16621EF461D49C065 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = F5421DE5172491C21F52B72374C7228125BC35878BACB7B10485EB9A + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 297C7C2B53D5597C5A8D41E8FF05D5F047B71B12231D36AD044FD091 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 93925CB75BD6A1D7A6DF46B9BF72738A722488239C57A03063499B86 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = ED74D775171C3FDB3FB995D7B541443AAD88D9CBDD6C08027CFEF49B + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 3616A2C4B1D086F16D58BE876ADD28E996CE521451914F7384DBB14F + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = CF1EAF6D3B7B6B46570BBE7E541240EC831C963E9A3E6517E04C09EF + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 4B8633354706E8017B41217322DA11C12771839BDA546327D5C0E827 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = B4DCBCB99E6C01094196E6664CA3A52DCA9FD9CD97C98C36884C293F + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 2C811EB8B46F5D5C0BD8583F15157DA7C6616623B10F84D41252C8A1 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B566B8004789E9FAB1D25053C2D8687D8C1E7AD41A9CF406B8C3EF21 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 9A70D5A3D1B7362755F2D1FCD8B77984A18089844C08C68EA1AD7DE1 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 17CA2DE9DF9FC6859054D06B6800C8C940EBA59E654BC520803AF4B9 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 02D0FD0451A4C2285016CFCE6E4A0081998EC4647BE998A8FCC5DDCC + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1EBE574DB78C4B43B2BE37C39B4625B30003999584F93C3D8EEBD07C + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4353EA41DC129EC25A194EC8157CAF7C6BED753DE6E3043FD46F3073 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A05DF8B091EDB7004DCE017A36652C81C3B62640CA38B425A81BB4D4 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4B9832298D10D17C6B7C602E43FA27F5C851B14879E0BB674B042E1F + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4199DF5CBE6A76F9873181439BEFB5951E0D782750B61FF65248B989 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8324CB78B8B205AD20E2E78790E91F07F2C9900F9B789F51A00D4F6C + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B6D9EB62FAE9F5EDA6E70901F6CEE2762A871C0F88EB6EC48829019D + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = EDFE07B84EA66515C8C67317600AC561076A6A44E5990359109050DC + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EB6E8C91F6F0AAB33101E6A2E0BDBD2C62695C901E9FA1554D99B8D8 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 29EDC1DBB1F2C460E6F9B44DD95878D5668F2EA86259E036539B91F9 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4C2D6AF4C1E543AD0AA06CBA2A0C80E5A093F5BD45EBBC14106286ED + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F3DCBD428801ABB9D7EE6F645BDB562F3F33C91FBECEC5F70B7D1F5A + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = +CT = 527037DBB6316379B83190EEDCFC83B85F12FA430AF62BC3BD46A457F5 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00 +CT = 2C448FA21FCF863A32ED25F86440A119A31D9D7F5D45433F917A888417 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001 +CT = DB12E6D16A81724689487AAB1244D17CE73CC8D9A836FEA6E8B0D3B3EE + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102 +CT = 9F211B30F2F96FE0CF8E6ABC62D1B8A2674AC2C5610B81209916B01312 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 3BDBDC4F67A978FF2763871B9E88D8D187CB7F9D18F7CCFF3D8C7B1E9B + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 519905C56DD0A94811BBD95F235E1F5B66AFAAC11DE3A1AF7B0BEBA645 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = A1BC5BC5C41A851535CF2257CB42DFFD3EFE4AA5F1927D71A2E90D174C + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = E8B5D5265E359C47D37B3802B0B258A8A1F1B9E475444E200B4A8D0F81 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 73734BE0492ACC96A96D75062EBA6C12821F82C0C7E0E18598949F2ADA + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 7427D5156504310AFE62F9A69D8E561DC3C3E8E114EFD95EF1EF7BEA96 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 431CC4E4D5C2410E44713CA00ABFD7D86B1B7B558058DE765D046557B9 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 573B1822CBD955D66346B851B0A194905B70BB030F1EC7C1D685BD8B0E + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = D69EA8BA45806F5580B5EF458A9BA479D62FBA7A1F4B5F3AC327C41568 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 5E0F8A474690944143927B8B4707062856F897368D1BD6549375B8B728 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = FC783001C4248D14BFFD8CF0056CDC6BB152A430B159271F3A3F8CAB87 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = EE0F2AA6729934CB5669775C4747423281307001B8D223C4DE9675D83D + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = AF03219D07C085D90715CE1D707A5ADE1691C59F5EECBB217E0F09BA5A + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = FD0F1FCF69B56BD2F369B2D796F89021A8F6F90573333ABE5E6F1AC90A + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0F4E77A9A76D94345F50FA817ACD11D44E55168D192806FB059EBAA6E0 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6482ABDAE86154DC8F4CACCEEFBE24A0FA04C00D0A6CBFE5CAA68796F2 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 13AF29351F3DC02BD8923D385BA685272C4FB04F172B62C6B68E3ADEFC + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = CF487611727FA579BFAA502A4BBB1A9980B4240095DF1154370086A332 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 2F0962A3390F194D0E1E2C7BEE9B94C2FA4A4D0FE0C58651A05A16B2AA + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E5BEF535B4A4B172C0B915A94BFD136DEA8E646B8E8E6E358873A81F0E + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2C090EE076E36E5FCAFBEF5FC857EB351CAA153F146BE83ADE92DB0BD1 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 112B5FA0234AF7E30715C732EF640624A535E980FC8FB2022C9A2D3E65 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A8A4C1DFB7A429A4009C449CAAC9FAE88EBB03390D46C31AA083E29EBD + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 062803C0036E2D02088394F6E8E4D0E32ABCD9DC02C0A59A00F305F4FA + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 03A9CC582AD5294FBCDE30AEBA14C96618A9E03DF396D1512737FF6406 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 22A903ADB5F1D88183E73B4FCBEC65AD3F7EDC48316CD310C362C25DC9 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4E4D5D16698AF120EDC599D4ADAEB80E206B8D9E5C2B3BE9C4D4E9816 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F610FA9054B87AF447391DF7849158AE6A96C35A329D53DD444DE2024D + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6D1D4CFD7FA6EC0BE0832C20BCAD4448A08437A978FC56B46357B92BB0 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = +CT = FB9C359BE1F08D77A8453A44F2133ED641C148B9672F8FBF9C4EE645A829 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = D45F82E41794796F893E44C7D687FD881DAA2A8A215657E1DEE551B92421 + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = DF911C03BBEEDBE875FC1C4B0833F3D52BB78C4F8D856F618AEEA508B059 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 307C3509B54F3D58FE5CA461DAB9DBE3AC13F4F83A92613D08449302906A + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 03037F89B92D1EF2F25E8DC8B23F066946D6680E307FDA7719BA2B21116D + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 1A3A0452381D22A500B6DE2CE1809D07530E3A5C33668C880FA9E9554B8F + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = C1772BEC9A251EF7D441F6B0706DE9E57D1E3C164086BC3A8C8957DEEDB5 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = EFF35FBB722297DD93BF0A5C91971FAABF58A054A728CCDBEF5905683D19 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = D9AE466A18193901C0B444F8EFD87104BBDCD55EA3AE5F03344A8FA41223 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = CF0B552C068810DEBD13B4DBBD4B8AFFAA46BB67A036C1DAAD03851A8B03 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 57D6CBE104009BB5470E3BFD4071303F4D7C2111D4AC12B2E0AF7EC67BC7 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 1991A5CFD3E27A2CCE2C5449D8633444F906188719CEC010C9656B49E085 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 220567A068244A74F67CD10E7CA12D17376789C5AD18979DC87FCD3CA1FA + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = DBD3716368FCC6F85C6BE697B5B0902BD66B64D751F548B2F610592E661B + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = D784CE4EB1AFD839D02640F78D05D3391CDE5FEFF9707D394A4C4BD87B46 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 478E15FD62E0FE8B5BFD003372AEABD9E1E8CE8E10E8A52CD5C4608D6AD2 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 7F2B1BCF9BA9254533BB3FD9D0550B8AD972DCA3449991416FC1762F3959 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 411653842D000FDBEA72591943EC4C400A82C7C3529BF89D3FBAAB9B0153 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C75A430A5678887621025E7F96618C623B19B6B5D14A5DFDA8D909760051 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3E0A14C158CB8228A35B0BE547AB09DFC6044858E7DF83644E7494FDF5D7 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DDFC2BBAF14F1BA76F2DA90FDA37602144B80DBD0FEEC8670C16548468EA + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 91704058A21B998395096BBFA072646AAD85407BDFE01F633FEA9BF5E3EF + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3A4649E01536CECFFB26FC28C7B1007C14FF54F52E37C8A00D7B5D36AC39 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = ADC8E980C9BA3A7E1152BFBD23C849861065BCA92B5940C8F72D970501FB + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0A0DBC5E24B05211BC37A9C73F38C8E2A90307BCAABDE2C9EE2053754AE5 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DDF714BC89DA979D230A0A7BEFC339E53C3BADCA65059D7A4C139C40536C + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 6BA85BAF555666C75C8EAAB01F7E8C12C34144B64198A1105554EC6644E2 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FF1152D02B3429B52A8ED1D9E7B6107D6A91D81FA040832D92601DD14DE2 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 55A6108B6FF65347FA8AE495EEB8893CE4FB67992BF638676D43B9B425A4 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 43C85FCF93350F48EF49FE701FFA47F732738FBBF5E909FCA0797D3D25C1 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8B1FB874121CF876E610DE43A87FBE5C67B81B1AB2D142959A63FF7D99A5 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8C38A9B541A042442A4F95E7A9E388C22ED07CCD5B8FCA25399DAF7293A2 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 601C4839D074BB088F2DBF3BF17C02A0171A8FEA76D69D255566DC89ED8D + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 752B4D49236A34677BB669C5E7043221183F83810491F330028CB78D5A0BCB + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = B8F15776B2D5A0BD858F0BE09E60E58B72B2C838544B99FE97CC00671FB9E7 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 51E0DA401E755248D1EE3C16D1A6BCDC75864FEDEB32B84021BE424F14766F + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 24A9028600988B2AD0D85651BDFA3BA0165814C20F001047A826111DB473AE + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 40E2A3AFA5E8C6DD6D909A5DD40253530B089A3F56FFD844F1EAEC10381066 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 9F3E224C46D252B5610A19313A2DC4315DE51434CB92388A58258C1FBDA708 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 2BEC7FA6461AA22239EAA7371FC6C358AA786964C18CF13C37853A6388451E + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = DE3CBC41D0F905494928FED9E58902CBB6C450F9516B751E64DAC461D3EB00 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = F8B09650F384D104B27D69C85EAF6576D6E5BEB67871F8F718ADEB45B609AA + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = E801F7527147E9E8560A2C50AD2C096BA3FBD3817BA2F30F295E9C6C9B2AFB + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 0B898AB19104F6694DB7F39C29A8532D8F78CB84AEBB38C4E182D8ECE36681 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 63DE1B61CEC7D9C5128E1FBDE46DA6C3F2880081648FA7AA8F655840CD32CF + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 23DD564AF23246AD617DD032B77E76603A6FED2FBB24B0C34A315193E20738 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 5C8BB1A52CFE0CB672E1AC2F8BA1289EA41661FE8E4078E770B9D35B1519B6 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = FC55FAC3E9983783096869398A4F8ECC04381C936A7DF63875BC644D552EEC + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 03161886CA537B1A1B463A92EC241E6CD04F238A07FFB7760B5325632A8998 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 2564D2BFA46E6C8F6665FDD4F9CC0E7D2DDD2771B7A46ED59A9F0C73449507 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 145B7D2FDFD167C6FFEB4336815F396F2AB2636BBC5678CA26EDFE02C07305 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AEEF0D97A94A75FDD7BA5A019D0F7AC11B1C85BEF5BA32E6AFC90ABEA732EF + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9115F8F46E885681E986CDE41354B99CB4BB724E64B5B2C7BE892C7B05BA0E + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C4DAA35934275F7280E31F657AC0DDD9FA26D4FEE95148102FAB951AA19ED7 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 186E9A7EBCE63A29AA751F479913BFAEB5F6519457464B24262E253C5B023B + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9DEC0DFA0792689B364E63E3B5A2C830165B9C9F5C9F9F5FB76E55CD0E2D7D + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FF83326367E5244F214F161E4F03F1CA5630CD8D4CC0A83024F05F18A37172 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 77E94459A89F435F4FEDA8159905E0883F6D0EFB932FA876F27BFDB3747CF6 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BD3D1795702B7F70F9DD0ECB2FFD63DDDD8C8BFC3622440275E30CD0B1D211 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 524A23D1ED8CF5B3BEAD18E5FF62A9F69A1FDC1F7BFDA223D2764D49D546B2 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D3F4F1AF3F9B2661FECB51C0246306928B23F647BB45A8A3AA50757464485A + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DD5282CBF06715A50F9E153D9F14EAE3550D53A8525E36418B0D3D32CBED04 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 99514CFA65EF1A22089CBB37ADD955CE859FDBA6C44C859884AF64B915FC17 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 7270FB51E7D3D6E764B8D00D55EFFAA77659CF60C5328F8C5A8F7540DA8861 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B2121A813145B074D1A2A9394721C644B4C1BC9670A412C181B7AE7BEE7F86 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E4E133FE6DA3F479EE2DCCEC9F525E10AD58EF34C210E44CE817207603DD92 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 175FD5A118EE8E26204D4EEB64A57B80D503B56FB1A55F630373B03AC18D2CB4 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 08A49A502F84177349F4ECBFAB8D238D9F6F93734179708A6E4BF30CD7F15FA4 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 2E7CC128E9B45CCEADEAC5067F50047E35C8CCDFAA64B6AE5EB942E6BEFB2501 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 04CD965BDF7E006E2FD33A6782402AAD224805B0DE4B60EDAD13138E7425EF7E + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 1F9AB687EBB5091D500A0C5E0C216DD689F1B36EE4E2A0C24CE4ED79A36D9D1E + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 45C998D07A4547B703F37B66DF9BF9A905359446527195B2A8BAA2B1BECA3B82 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 3E038DEEB88D713D3889B94E45E97D3DC3D3CD2B01DF6FCC5C413DA4E06D9A0B + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = F9EF0644AD42F1FC5DA3D65D0020569C3C73E3E8E99DCB0B13933FEB6A6447F1 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 2FDBEB2BD7CDF6FF6EF33BCCF9A6D987CBA5DC1352F71AA28B57C776C85BCA14 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = E4214E0F290A482AE1EB25F002D699C905233304B705D9A5AD2CC26FF034E979 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = A66F99849BD1B70E7024F718C5A54133D59FCC81E125AC429935F279E636EFD9 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 76F90C9415371FA9665837C83FC3F2E467B3D9236BD807BA0B79E27F4DCB1FCA + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 8A9ABE4CBCC7D51A704247E1D47141DD1ABD9BB4FBD37A62B9B4FF0AAA5A966C + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = F452D5C390D9FD114F268313A678FCF79307799013360EED61D2915FFB976494 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = C4DB122BFFAB86CD60D10F90D936AE1AF6221F60FC6A5F32AA89CC859EB7C494 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = 3DF1650330F4FABA26879CB034299879337EFAD5676821707169AFB48BC94044 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = F49B8E0BEE9CF22ABFDF3D05F47966C2B3C78F6E39873EDB249A577209DE0DD1 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = BB21C6ECC59E96B0D195497CD7830B691E8115AE8CC3E5FE109F3B24808397D3 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E66AFCC77592954947D7BB0B8858ADEC47C9926C74F6F0F1102AD6263ADC701D + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = CF67A5C52654F7FBBC2ED7E94D8C074470BE1DB229E72A5CEDC81E0E684B802B + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E03A7413094F52BA89C36E19456A17F961DF70298D891C170030DD3125DB73DD + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = BB70A97797F2D34389C2482B4CEF7903243B4FD514F20B2852A76A33E0B47009 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 947BB9EB496EEF895653303F308A4842B6CA7700259C9E34D432588F1FBB3235 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1FE74C366DB27A76FFE0955511279D94096EB9D3E7DFF2BBC5D39D8F0D0282F9 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 91177E9E50D5709618EFA1F565A73B5B0BAC36B2C67922F97A8761598975FA5F + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 30D60A54D36823E73B34E548F5C9DACCE208B59D2259EA524D735C9C2A59CDA0 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = ABB94125845A648AFE01D58E94F77AA59E9C231042CF1ADBDF78F7D77A885B75 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4011E1DF1F1146D338FA56A495D8F77F45D5A131144950AA46145B3E131F4216 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 33974764241AB0BCFAC456358F133801C92D85BAAED8E8C526929FC1535A61B2 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3EC3F166E2AC3AD635ED2B0CFD95DF9C1E32AEDB0E72186B4194CBDAEE58AD31 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C57D298913953E339469875DBFC2F1258E2546DF119AB3E8F71B150B27CD4A53 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C6D4E7E692095CDE08AE35ADF861B54966265F112902FB8832BB1EAC6A6CA36E + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3172D7C6B6A3A5A71348F4F6E289D8F5507A7912BBF5C1D7B21F082174EF220A + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 85E5E8B5C25EF2494426DCCFA0243439A2ABEC21438EB81E9880357B285526059F + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 8B14D5089D3EAF7A682E9DA7D58AA6133FB74C1D02ADA2D48D97A8268FBFDC7CDF + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = E35A777E50274F5BA836028C8A8768F576447F6DC573B2B1A97CD5CD1914B89B78 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = D3103F2C463FAB11274F63D3DF35AD84A7B98E52FCBB094F008F6415EC37F4E060 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 35FC5BB2A7C4CCF2FE5397F5E81A10FB3AD023038AAD21D7C59E86658532D72C87 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 535CD585B4F7C23B7FB760552DB0BDD5BD3944CE1478E1E1B2444B82B8CCE94701 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 966140B8BB5DF90372DA30D8B7901AE370730217CF39306A84F78B4DDBFD1FBB63 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = EB907727AA86A28D14D088CCD93D2CF009EF62BC4943CC29EBC870968899FDDE8F + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 677E1CB8F35B356DE472AD96ADAC9B426A7399F41C9A45B274CA299113447DD6CC + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = FF019304A30A39DF08E0270E65E6AA5AC9755A87A1BA28AE7B93A8ED557ED1997B + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 0CFFA3E89A887590C6F293AE7CF13DACD5E6A6D2ADE05411B54433EB6A1461145A + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = D88DE1BBD51D2E512C72842368E11AED8F9AD7F601A4EF66C4475831A688CD8B10 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 6498F5EB2BB11E5C6DFADD508607654BB1327BCF4D6689B35A580F434FE61E0725 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 0CDE6BB4104610256FEA05581552C03EE473829DD34BBADB54682368AEEE412435 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = E5BAE539E77A5C49748EB8F7EC7C8E875BE0C83CF4BFA51C2C14BC628E323274A7 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = C8E5F451D6F1B1FC43120EE2E39CBB56A8D767374DEB9E99A84166E3101B723548 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = B72093294273A6E75216F526E139C7B70CD260D78BFDD1B75870F5C41E1B1AC5CB + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3CF98622AE1D0049FB80F3CCE95520AC6FFE2FD8EC9AEBCCCF8CB4B994AB227AE9 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 57816B0F588CBD6270FB44A9B237C3091BDEA8AC38CF503CEC493F1849C0DA7321 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 97CB682C1699B600E4F1FC73BF5B31604AC1A2AC8C365D032F444525695663D216 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E1BD6DEB86D4AC45304E1BFEED72623E03BD85218298731299CF61735A6811ECD0 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 714E4407364BEBAFFC963B9C8A0842F76F1FC8AB906EAF2BF8C0EB6CDABCDFA983 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9C709448949907B4A2158E2402A26DF8FAFB7A69568232E5F9CBE11E277FB74E56 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5C5421D3D91C38750E3A7C616A86EBF4EC0F65F8DC96F74591CF06E5E5AF0D9F89 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4929CF6CA8B2DA94EBD47A7FB04D47D332F181B77CFC0A3EFEA2385F969F2A366C + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 64FBCFF38D17B85A8045F27755F6FC5172162CD567FC1275BE68B1241CAC5C7381 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 18E2A70FCD8E9DD0724E903C5F8A3C6AD81505FC14B447DD83F0E52A76B6BC02AD + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 930D0E840E833430F0102589BC039D8A8F8CEA816B936253D45B8BD031BE99848B + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F808FD979F97041EE4A1FC747871511B6F801B6AC62E1219A5A5CF71E1E03EF7DD + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C04E7AF4C6EEA6884F75F95EA0513253AA7BA93D24738A5543006E95DE7BE6A280 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B113724DFE350D62B4A2A1DB7E5777D74E4AF3970081C406CBDE95ACFF337C4392 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C01B992C11948197E9D5DB4DD61ED0428DE3928267336F668B0B038591FED24095 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2D36F213541EF3E1B7FC0CAFD4F95102394B3356985585488FFE78B3023A9E36A6 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = F7456B8A3F5946A0301615F63E182549C334EC0D255BFF202B5BBD1DEB25D14D97DE + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = EF4C9EFED31AC74ACB39F72DBA2349393565455AD3DB1E7541BCC24B29F51C9EB3D7 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 28573AC9835D87CC637AE77FB011A4A28F0BF211D6EEE2689BCD81707E4819C58A47 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = C8CE269A3BEB8470D0AB488E5DC78A0EA9C792D6EA949C892B5DD48B6EC9CF23C9A3 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = C8F1C7184967975AAF3F3315B4CF4A103B8F8538ED28134F283728F3027121D0C19E + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = A01874F97E7E4043662AF82E10964FDBB9361B82573589699C778749D1A5A7925391 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 5BEC7B6EB2B304A5D4A97DEE02051359D3D612ED836673C65EE0210678B03EF0C5A9 + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = E97BA17E961C12C37A61DCD65BD1D572459B8CF3B8AE0DEFCD942AD1ACC1D8F5B2EA + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 262F6FB209AFCEB8179124A26DC6A8D4DAA5F55E607A4B853FA9568175E1184A4678 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 11BA7F2421D2F691CA892B5F3C2BCD8CF943B962A6929E052B7D1BD3D707DBCC046E + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = B99D3FC9EF552C7EC227AA49493CA168B668C4DE8AA984A660893035B46107E84B75 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 81EDCDEC0D17DD44F44823C5FC3F1ED4DE3D7811355BED0520166C78F0956C710520 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = C4723190B310AF42923DE21DFD4B3266C57A347C3A6793D26F74651F082D96550CC4 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = CC03EBBAB4C4F0ABEDFEC11073B673D8C82D940ED23421F408354391B39DA52808D9 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 38592C2B6A459D24D4C54A9F9843B89EB3BF756965E6B6FB59558D05A340BC9D95C6 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 03BE76C471FBB17C8A56065193395A361D62DCFFBFB6EE47CA077FE36FEAE76E82E9 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = B1439EC7804B182C8DC2030E63476270C31678413662BFB4BE6B5EA1F9EFCBC2E4EA + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D0E7B4B94B75E818ECC5B3E6E032505B188DEE87858A167181A8359832FCF4AC62A3 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 15037B7ECB0F770F1F7325447907863EDB978577EC16BD25199EF00AA22C5F4D5367 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E3CF056A76872194CEE928C2340B8EB92E7104058E908A357530A433C73A3A45E2A2 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 035C4269E776609D99BD0A1C7DA0363CE845CABB840285D523E57AAAEACA18ACED39 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E4A773A0B52230F0E9E298C2E9106CA5E07FE7CC229F0814458A9872045053CEE5D4 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 93B44DE97126C4D474AD76FCAE5F5B6C70F2D36ED8E6E0FA83A68A446C2C209C0249 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7B7510CB905E0B36A79FDFE85174481F9322B31ABA932E94455303DA89256F03FDCA + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B49B464581C73653EA2BB839875A166F39B5BA01CAB433763F408843A5518C79D400 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 47688AE2BCC0ED7C5D8AC257455FE1F38D84F378F77601B2C65084B08EBD5B82D8BA + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 519788B4C87F7CEBD3E870CEE1910B1B82708C1D47411EA6295E3C255388F9527C1D + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 40E6B077D1CE62B31A051FBAA08EC0F92674F9CE890E017DE0DF66C7EEFB921EC18F + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = AFA787266CA4FAFE1567CB1A136ACBE0337B1FE6AC782FEC23E6439C51764320330A + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E5876DD6371C9CEB45F97C99A3695762E3B7DE376BC0384976BEBA5FA9C29CF5E195 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = CBF6FCD245DDD8B1C71850B4F9AC028E22A12EC3DC265DCB4937EB128C89470AC22B + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 68874CD2F1DD71C8A2BC348EC3F5909298D41C5438313FA8877B758918E59651C174 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 696334297DEA0031855E21467C828BF3D7CD4BD7EBA963650641BD6928CAA49B4FB1 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 9BB697A843C255D1A175AE0D8C91B4930E5400BE6E1431875484C64FFAC11640B42C15 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 9157F2B77CE281547E46FAC675D8AF57BFA641F8E66AE298B96027A276201B447B4CC6 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 9B787FCDDC787EB70C4DBCF88746236BC8E77EB0F2C38455F37B237D49A641FDD85F54 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 684F032B7CD4C715BE5752C995CA7C4ECEF54C646A7ABE389C0602DBB0E923AC3E47BA + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 7A98C6F91DDE123081F75F47D3FA82D932A10232B0FF7E3E4EBDB1E31B8545D116617D + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 3B0B26EA8228F616187ECC985EC42D6BD16B2AE89FA4E999572A82D0D16B66264A8CBF + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 7E01BC99FED6106412B9C29F7901B6D1882EE4E9481E949F60826FA9C0E2E0B92AF36B + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = FDDEDFFE9DADD30C2FE62F824A91DA132E0884EC26966001156D0916B89A283CBAF9EA + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 3CA55A3E8F3DAD38C97920A5FE20B29C617A3C1E725049C32FEB23E8398808F2E02463 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 5B17A84032D465A6A47FDC6B3FAE9B2615BAA8B6F772AD9A81B8D2B4ED7E703CF5F75C + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 01697DA7415767F35DFEE114ABC5203FC098E8EAFB6FBFED379216107813BD6A5EF01E + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 2C9D792E20597536127AFAD0A4E02F7A42B5D608A76C355DB3B66346D8DFC5FC6E02D0 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = D9009F1F0B59EA4D08D4EF47E0087D62FFD8A4D415FCFCDB20136C23AD85E529E3B80B + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 8AE836E62A56D46E07B9B8094FD9124BDBDB2C138BF725AE9728660E09464146045299 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = A17658D810D2E8846FC9971842330728727724BCE03064D5A46D5CC8E67BEAAEF65E9D + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = 30328C3C81A190CBEE501337801F5F80B7F54D196A738EBDD94C276DBFCF2DAF371F11 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 304E868BC22FDE94AE2E639F73269CCEB3FAD272A22E95280792E348457B196FE7A67E + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 83D7B2448E7A8EF3DAF979C2F367AEE10D922E87892808912A2B9F66BF388A0E7BF871 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 6AB2B5083AF85EEFD8D886BED614853893B7E9D359083B4AD0681876D088536BD1F085 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 0D56794C9252F57F012F185BD3A9B2EC23C8EDDAFBF13A026F1FFB22BEA85A28BB0C6F + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 0B492E0228A0F9171DDA96E1644212FF006DED9B8D7398C11C73B178754A7D414F93CC + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D578D767BBE96C9980FC8929D09C9BC49431B23A977DC1F034AAACC1B94DA3A626D0EB + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FAFDDD42BB9E5AA6A54A3FBB90E4019E2216C6EF32919659E04DA421E3CE241EFE44EC + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6E5D929798C5C7404A3522839A50577FEDF4A1FBF62EA17707367DBB3BD4A4040E156B + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A11CF8192FE52A75E1FC67D5E34F0E13F3629086A250A9691AA2B0FFD31EE4D4AEA4CE + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9155EC799EDCAC01F6617010A4D7232FA50D690EE1565E6250FDCC817F6620A0244942 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = FB5D00F328AE9B90DC10550DB7C88977AB71A8B504D93D8CD64C5E7549EEB79501CFFF + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 422C1673EEEB66BF646C9471146F2B4D8838872953CCC640230937F34CC0C618996ED9 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 07EE77C874D749339FF2B8BC859E0F43E79196DA107CD642DB29709C61CB04DBB5809B + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4A1CF4AE456BCDE1BFE22B440684418F06D7D1C8C483032C22D963B0F09818BFB15D83 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = FD910BC6717E033A303572087C9CA949A040A8EDF292BBFD76DE3B991F64F4F70E8BEF + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7A89DECA2B202125B34565BDBBC4AB7FF9ED372C43C1E05D27ABF8DFDAE4E0021F89D7 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BCEB350ECB88E7D169D3822F02DD4AFE692FFCD5CCEE6A71293C594A46E2FEC95F6918 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = AB92AD8D2DF39A341D1FDDA48F0165957CEFCB58CD6E206FFA3A6638F97A51DEDE735BC4 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 2DDA0F52FC24842D0E36B8DFF5FAA00EB70F3619DEFF907D940EB4E511D3B02128764E24 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = CE9AE51AFE9AC5C8882CC86B5CC53BEBBEDCB58C06E8B1A2DC9673C7D834DCCBBCF8A8FB + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 306E08EC926248C84C04905B863EC21D675DF9E14A599F5D972F53AD8B0D93BB8775EA52 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = CF79113E7020C11EF28B701363B087D1BD5B32135FD1F1C9A7E700082AF4C7922E357935 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 7E47280D2B2A70F1841EBAF277F46020B3635E36F5C7EB6254D3F42AD94675B19E545BDC + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 219858A34F1F87DBF6930E4DED0CB4B7B5663B5897C1F8C4599DEABCEBC12E4CEE4A6528 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 43217E1FAC463BDDC64DC93E6D7309F321313C29DFBC4280EBA3E0279E067849DDAAE382 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 5BAE1EEEE694A9C0B8D710D3D1CC653DF756AEC8A956D0A4E3929AC09B35A245A2206717 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = D89678867EC36DBF03B05232975EDAA20F68EEFC39857AA085978B77F7414C8F34D15CDF + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = B036A1170C7B6143B7E9FB64D53276745785003B1045855713CF994D5366CC190CF7BB5D + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = D83BEBF28F99D24E9F03C116FFD8A4E0A4075916441B7C8DFB9A59371F090C45C3D9CEC4 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 6C409A0F67B8E2A3EC9141EC96B375DFF48CBBA397D77882622B15ACD1EF4AF1DEC6D1AD + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 91315343D7C305B1C83BD5D8C8BE45BFE8DC064551D65D4A1EDC893AB7CD5501E020A29B + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 117C7A007A7CB33A0F9CB3300415FA7C1ECBBBDB64202EA8AF7138AAA3F3E5E4E98392CF + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 0F76ACEE8119366DC549755C8C7CEE18AEAD8454AEBF805B296FB02732C03119AD68AC4C + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = F056BBC13DE967FB87E02B724B445A9DA4CC4C8C72A9FC1263EA6F2C8C98BBC6D0E1C123 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 24DFF36771848BF981AEFF1FD2100DAC6976913A9C95A75DE5D9E2BE61BE395E6D936446 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 70CB84EC1A7E7E329855E7F7972B22DB140DEB16BAF2B7EB560DFD1A7ED2EFA953338AC8 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F8099BD7A6818CC5DC37613A36E3750667E0BA4508A8E9E621C0E8AE9892CF4945943552 + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DD6B5279F1948DB3703ED51A1FD3A5955219CC0F9043AAB1D0B9320EE5F05BD347D3AF6D + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 298A85989C12F602AB39FE1D061D0D3CBB687B87ED21A1CDBC965E88A287987169B1BA9D + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 79D70254241ECD392F5552150F7F75C1AB80817FBB57C2FE85F9394A52782A8EE6BA6F03 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C1B9E617279BA1A6857688150C5B30E9AE7095A789ECF75991E00502ED7B3A84071AA188 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EB13585DD163F8CD171C23FF81C649FBD612A0C508641580FA35FF187DBBE07D406394E1 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C0B6AAF9EFD761CCD25CB6E24AAD91DC709D5B88B932A667BEC5A9715A1BF5F984765F59 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 05F72DF5F3047DCE1E63B4753F5EFA705CBC5BAD10679C9209206A3DB49A4078B68D134A + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4A95A45E41C3F6BC7586D77DB47DD911EDBF6D616D42A0CB21145C066242726C379BF9B2 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B7EDF0D579A92EA1C5B131565D7706ED0969BD70919F102C8A3BA54B4C55253D6B2C6EC2 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4EF6475A5FA0727178007433A23AD4BEBA42585342B5B8540D83A9F0D90119E83FF98C85 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 113077BCC7D3D59DA6C53F744F4C7AFD73AE9FA5175B45D0BDBF1EEFD639399405EDF34D + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 2EA1D34F95030A3E5F9AF9ECEDE03E5C02FE9DECC9D533FA9F5D70D2F93762082A5B0C3D + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6A896A65783F1F50E2A023AB7711F10683792AB3B8422EB33B37CCCA6D895A20CA780B4D + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = B20A808BC9B50EFD93214EF5F478EF4A285DECF8BD3FB6BF705F81FBF30FE666FF62AB3F8C + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 7F2FE9559BE93F463DC5BC80277CF28DC8500E5044A68FDEA754377AB87AE8ECFFF3DAF8BD + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 0A97A0BB37E505CE33B54466E19787E1F32669C71233C1577A4437467043244833A951A9AD + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = 3B2EFBFDF79AF874D3D29697DD3E6E1EC74F8EE62F7A3AB602EC8200B81FB3A07570BA8C36 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = EED8E62C1DF85050ECD3A4E47F197EB260610ADBC6C5367A24AC20D834CAB51BB661C62B8F + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = BC34A822DE52826F94095CB7B6BADB529D7CFC4FDA1F3187EC475C668DBA1BE2168E44F1D3 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 748789605C47AAC7ACD6B7200E730553047A76BA1E82C2C9038CCFA380ED5F0AE5B6B470EB + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 3AEBC5FCD6B7D0AE5AD5B0B8A9983517B836FB165AA20275596936F2F81CAF6C7EFF095C75 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 47E10EDB7B3EB62DAC77948C3F98E548DC3E56E753321AA4C819012A7B0814966C8E6086F5 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = DEC4C79E8F28F19AF20559D465BBD74F097BB46A4637A46E469DB36CE36E3F9F39CAA0DE22 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 87CEA9B9343CA67AE16A5C1FEFCBF89488888A017BE1CC58DD5B5B32CD10673E30F9B88DF3 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 49EE6D07FF9731024E02C71978A2267A6603CE0751BF85F909E96D6485158E6160AD7978ED + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = D2D6268305EE3A2AAD53790A6AD30AE68C5F5F4C7D2F6D9E575F298B61108521C67ADD1432 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 0D22A6BB0A856F6BF71A23DF3E64E4D2106CAD6E1F337D368E1C8312FA6C7C5252E92C6AE5 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = C2E8D2E220281EA7C229BED2B543C12B1EB4E033B7FBB662607B12084D4E5164CDB8B54607 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 5549FEB55CF033894CB40E0D6D0D643C8BA195A17597903CDB06513FAC1C71BE3F947CBBA5 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 145E366D3FAE998DCE8AA2598ACEE0B210403BA756D00EA0B78D14952A124B411E04D642B9 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 853A8D5BAE6A6FB5A45BBB892283C9F02CB047DB3441C23714B5B6F3AA3B7837D04FC838F8 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 32CE24267515DF801B032E7F96E5FD52A45916D4CD32A45E115E3E0B69B342B7AFADB222D8 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 925AF9197FAB744A7AEA61099F094FB94D24FB4AFBCBEAFB9FCFC9366746750CBD60C1B666 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9EDA12D181B6A41A3830EE9D5CF5AA24F36E7630550267ADDD789E33E83AB8466277B9B488 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2A60098FBD54A12D74CF96190EEC4864422394A77FBC24A9993F23B575BBA60ECE17BC68C5 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B964350BB443E4D54D86D2B405514832B1F3ABDF403320AF3C7D58AA069AC7245889134946 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 44ACE63A1AC20B13DBB02957BC03D48CD3000AC36192A1337F379E8F44C048EF5C6AFFDC06 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = B7C731E501187620FE09CCA761BB9C111BD0E2F9DD6CA3DF3EC3FEDB7FE90C059ACDE3764B + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ABF823AE9D00D32BCD0B7686E98BC959782299B263EE3BAFE837DC703945DB8302355B46FA + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 42D6D6778FDECB217238009A2201418366B6D9924AE0DA1E14564BB1DCED498CBC8CBC9E25 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 7E57A52463D268F3C19AE87A469D142CF6EEA736D0F171F80D94407ED9E775BD8AA6D05CA2 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BD3AE1867D732FCEA07044D68C9C248E1DDD083303722020F0460D40D688FE484B54084B17 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9456C294976DBA05165EE13F4B2D007A444F5E6BD5CA1AE6C8AAAFC926B1A1706A6CCF6A7F + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 35E8CFFCBCD548B8037461E21EDA05C031BC8BD7DA30857C9D0D27C59E9585A35DC0B31695 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 943E727FA108175EEF55F60CE80926615E55A58C1AF0E13E4E684E3215CD8DD0F46D178B9B + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8110FA8F1857B2ADF19A2488A044A3F6E3D47CFCD194D2BC1D36072ACBCDE7F2568952221E + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = D28C4879627FC05A5D1D941822197808709C32121B42AC81BEDDD9B09D07DF05B648DBF5F317 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 4D6D071D9E075AE16251815BC6D3B5A6AC9FE3507E3ECE04E044269921C4B70FC0E662FD63F2 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = DE95C2073AAEDAEE9307DC37F13019EFFFAE15333514844804797E2B1C5E7541553332324A19 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = BCC8DCFE8BF6E17FD488D6880E8E8B0E88429FFE63C66ADBB24FCDC7E8D629583517FA67245B + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 3D2336D0D8A734A96DC43D24590FC44F00001CB3D4487BBC332C8F419680464846048B638660 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 67CA945BF18EE85012A1F47B4CBC722A23FECA4E9C0A35D8999C830F3A541C286649C3FEDF3B + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = C4521C7B6BC73BEA29440F172961E9FB6D1693D5A17436D6B488F791CFC5D416650646B949D3 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = AA07BB0E5ED0D365308D2781CFA28051784F6E718CAEA173C8BB738E00E67E42D75A41776B77 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 792B57DFF3B1D58F2E74CB0A35BF86AE3F113B02D7589275AD418961AE6DC094064BA1C6A42B + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 28E4A5AA0637F8CDEF29520B72FF1F017FF160AB641B400D77B3D6E76E92ED704618AEB8D458 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = DA6E8E738F1E7A9D0281F29AEC80BD4C957BA0D3D520408771E7427ACA439F5037FCF6C56434 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 144E0FCC91ACCCD6B9A8DA3C8489D51BE3B95E6FD36C9456D9F2A0F1E7499CD57774916E65F5 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 57B87E8F13B3285D2359E61AFE5A9D4976B00B12551DA2E1EA303632C51B4AB1D94643A95800 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 6A65A92410CC0252A01D4A6EE39967BDFB7CA498C118418990503EB3C8F207C494FD06588AF7 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 454E71FE13E52E243E4749AE26E6EAF3ABDEE876CC63E5DD07988C2B93DD24AB3BE2F38069F3 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = EC4A39B5237FC0530865D7C432CBCD6D2D5149556CCD854FF6CA3871395714D4E14851F448B8 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = DB5423437843861989626DF14B3120E812D749B39055574416CB3437025673ADFD8917C6DC1D + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = FCCB7601B82A3341FC89045B3A98122B867F76BA053ABFE12D082652609259A100E85546C5A5 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 9E84AF0625255B679ACF530F6C435DC26EB343396BE82D4BC5F5279CE18262A7612848D6E0EE + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4D17004A8AC0C5EBBDCB43100E921009FC653E6FD6FB86E043A952CFE2ACFDAA680404199CD3 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C5198959CCC9BCF0F176B71D0596EEFD178308792F992BCDC81511FEB53941BECF7CE65B80B0 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 849E472593447666AA6715EA10835D229F5909EC1DCD2756957EABB713DF07D2A2AF20085E4C + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 5277CA4E650EEFF707C97FAED9A9BED6659CC95FF285EFDE22B2D2291600BD798C83BA436660 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FEE885DD11CFF26BEB6180BADDB9A2D0217215DB61DF77BEA04CD2DD57D1756770ABEBF18370 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 361A062E9CE154300941FD41574324B423083E47C6A8971B7426327B93765CF587BBFC03AA3A + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4C9B0E9129339D8416215BFAAE9FAF544264DE0E84934340DF16850B6F1BBD6224A65D9428EC + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B40494705C3DF5C800CAE658D704328A67165BD50B7D89372184B4741F29FE83F9D2F70DCC44 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4AA8BA19B27E35329B2F327EAF7E8B38D8DDF565C00977BDE42FFDD52AEA391DD1A13F85E0BF + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5233BDC3AEB50C47BB037AF91B15BD06A73C65C3C035322FC7A0EB53489AA00D6C873FB4BFE1 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9EE7A65AA662A50E0D403F5EB85F39A547715813AC6F2ED6FEDF8B73A6B885519BF9F689824F + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 67F300FFC37EC1D4B80D3B3985696A5BBC7021F46D959C5AA88BE6B0B5C697D43E03EBFB76CC + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E705F2F5D3E0994F67ABB396146BB2381479C1A134643AA491633B99975C83DD4085F0133003 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D9988B8365A59DE7965F2ADE2C3157B3CE34B7E829A9F512DDA07F69B2A0CBDCC2CB27B219F0 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = F3C7B8CA78463963FBF6A9DC76F3DA505123DDEC177F1FEF42F225C50CAD7129853A6EC7FE3ADF + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 25A7A8B2207B7345E287B592C2673D71515DAE73582D687274DFAB2AB61EE0152E22BD3F39038C + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 78392537BC0BB75EDE914913242A8660BBA42B50C2F35683939ED9577709B618C89E100A9385AC + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 2B198B3A992BD2DADD224A373BBF8F17AB9D64900D66057AF608A7F232FC342B707840EC245E28 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 30C06529FE35B697C2A9B06E1EFA8ACB0BCD21632D97728D44825939EC71CC52A05287866049CE + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 6C8F93C782065E4126829A2119029143E824EF907A4AC3D2E04E4DA85ECE4EC4FAA61D56BF4723 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 1A020F5336D1B04D17EBD4563971A8E51F8A25B11E9D09FF45A2617D1123FC8F1276E252F52C33 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 798FDC42E31E86E89A22CFC970B5B71CEFE2C52D941553926D8F602555ED25CE8B54867DECC396 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 588A6C83F4FABE1C766EC0626134FF89F504F0743A915AD8E74A85AF945D4EDAB1F1F04C51DDB1 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = B8E03C0C32B74C18B64FD863DF69888B7C397FB6E17590674295679E88C777CD531324583D6FCB + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = E956D6FDC35D93A7F3F7746CEE215422F9FC0017C6156057BFABCFEBC3E1D2059B26071843188A + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 09933ED6298D61D94EC615BA639860AAA4EFF6D523316E1522F73BBE600EC6DD0B04B7CBCF6AEE + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 8FB96B82571A31945E7678D809687A003D5FFA251E1CC09F9832EE7900B8E22BE3783F52C1CB4D + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = AC87EC6C7C2C676E8FD6FBD3F95D4AA2B65B03BBBEE8EFB69818061D808E7DC9FA3F2B9DF0C212 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = AB9F4AFD846BF4E9D794DA1D757A88588782C3BAA0EBF3789E628714B8B325DCF771D7EB1E4E04 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = ADE6F2A0B08F5EA37DB6B28B2E0388CAD4C002AF5D1E23A8FD6E822DF15C1496242068E7EE6608 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9F22E8B32F0AF7CD552FE270CBFA2F4E7C0D705847FE60521C254409AFF9E8D6ABEEC4F6AE72C4 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6CD8B5FBB36CB484531CDAA24780B7F8B7339CF16EBA3A34F0208023BA90441DCDC4EDC64C4BD0 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 80D0616AE44F420B4C7D71EEE2563B855D00D5C9DA3016AC951D63841AAAD7ED6DBFF04E49B949 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 8309735985C17CF84D412533E9F0C56F070CC2E6A8E81D8C249034D21038E98FD19AC53CE23446 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D82B867BAE4F53985215558D76DAA4DD7E85EC9E71EF2F94B202394C4CA343590BBC5AF48A4FC8 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 054266575E5C79517E90B75F94372D63ED8B1A5E8DDD63D5F548C70A3D8A738C9818B40D920587 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = ED0F65D4927527FEABD013C1EBCA11CD2C4065B9914DEE3D2C0DCE80998C2E2A3090A3C94E73A6 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 51A581B4857D91745693C46BF2015BC517891DA5CA1D37DA06B3AA82AC410386C28FCF321ADDC3 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = CF8D7E947225C5A165EDC371975238D393A43189DB4D6E1194F31621F3E5946CB1CDF093969378 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 27F76193E98DECB3C8E7027771B19561222A8BAB24DD70C7B3E208D13C9BBAF51BC29A5E217872 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C6457A900D80A80E405A7FA395D7566B9DF60D035B77DE54A2A00CC8FB5CBB8C20477B899748BD + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 419825F107A7D393E851892F98946A72CA4B5433A610E53B6F5A153F3F215C2A6CA471F385D1CB + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BFFFFDF01C379E730E2FE8336D3B2D5FBE3D2752D1DE466006A4674E925D2B18A1F3BB4606A85D + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B030D704582BE0D19EF860CB00F91CCB68D7BBE9A274222E1F6152503F0999A01878B1B0FB55B5 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B3C32B1F5916D8738A4EEDB06DC87D5C8B6E14D279AD856FEAAF4336F5960C4E56D126C3420B97 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 03881E947ADD1D687F073961E5F68FBB5DF8FAF876BE38550D091823541E6803F54B4821203722 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 32DBD0332B761E82A3B1CD04512C5DB9983808B0531A9688B58C703C9F859CA47F1598D17171BF + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 4A2AD7D1AE2014A61051D651B78504119C8BCFD73C6907F1A3BB7D4F704112E4B7FF16CC9CCF514F + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = A11B92B0C4EB4675C0CFA97602967F47A478C6778B69B01C76036B6BCCB8A15260257308F4F5E21E + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = A6FA07FCCD3D608D19DB69BD0B7F33137319DC14CD4B8C3A4C6B55434F6927CAF2DBAA80E191C247 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = DDA4895345EE33DD630DC52560E8CD5A7429F4BCEA5CFE1B699FDBAC3C95465BCCAE48DF7FE39B48 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 4A5CA1328B1BB54DCC9EAAB47BF74B5011F797C2EC3240D165A443EFC144816F65F3C8D017F50DE6 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = E2CE3BDD1B498C2F878581F11BF2FAF040DB9892FBE040C06B783DA359AC0B6F14A353BA241326BB + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 13F39ECA72562C6FEB8C79736D3AC33253DE59DCE90FBEEFE142C68D80C19304CD8459AF85A42252 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 7AEEA9DE01D791E7133BE32B13BB72AD3FC30D491DC8FEF605A5A89F7F5C0E4D58D735A63A0B2FAA + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 93C6F090E030AD3EE817B7A43792F70B1ACC5CC1E0891312ABF4ECE1112FBB1A58E2F2B4E901A4CC + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 4128B416524946CC5A2BD2920533773BC5AC4E5892E4A9642758738854DFA3927CF4347A7A5D0FC9 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = E51C536D79613616C7233EF9996E371405899FEB5766211CD7E8D20E1831F54D9F915E684699750C + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 9DE1C7C0D6717C13738F98092B5AA39E56F9CC809D92D095E13CCC0E3128B33FD5A56B29E749CDFE + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = FE891C3C1DBC32F7914666637E28F94096760A61C5DA9AFC48D2DBD0259378E65B49CFFCBA81A319 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = D5FB5C9B8EEC107A0B0BE6E2BDC28346A42835062784788F27C670D68F340CC84ABE95DFAA051C94 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 6D4BF1F779093FCB7A944F59BFB281E31889E6A5B1CE52889553ADD4405C31D30210FCFF3C9A2DC4 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = B474BC5125EA1298433D43DAEFA5FC39235FE2185B06E7F61F7AE431E4C8E9B578A6071DE8A16F4F + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = B615EC7573C73AC0A2F8E46D895F79E172FA5059288C8E8E341D66D28E7AD7F8F60C15DEC677F945 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B0C9EFDD9358817521C03D40AA0DBDD8B18E5661869FB1A7091D4DE6E18C6E1CA512B9EB863D066F + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C13CF96B27BD324161ADD150B328E899E82577AF6678454D59A1446D5BF3CCE8DC254E81EB04808B + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 8EABDD8644C77DBE84CF2477FC35D12F22C3155C68DA5872C8ED109F6ADB439C6A8BA81B3A530D9B + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = EACC3F31D3D54CD51AE3A87E5CFEE6DDA7B694A750F905B5CA773150A380B524288BE46C5487CC4F + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = AE0DF2B1439EEEAEB1D3623DD8EAE8536AACB6AA3669512ACD654429582DBC417775E6AF60BCA511 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C147BF829885AFA090B778B550E0D830CB74FC05857D7BF95CA83B8615E3D009D8A15200997992AC + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = AA79AB7CC97ED24042DD5E7DF09FAA790D5CDE1A0FC5BCE4F473E060B4604B2ABF733523E85BD5E8 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E1145F652B0CDC3BB09F701DD4D8D663C0D28B15AC1DC0EA097AB39F9C0FCE8B65E5D08D7AE94FF4 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DDE21101BFD72326C53D782A899777C3D7A32F395D763A9F2770F7A5F4CDE20B82C34E4E4AB83DB8 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E0AD3634FA42DA5A529E54D50B7FBDEFFBD597D1C38D703F6D22F004263FEE100BC7CB9C4F7F5EA9 + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 024C6F5E4EEA3655952EC3B52E4B8C1ABEDAA85E80D8074A67CB7BA55C2882FC0816127DCE24B915 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 360B22E4CFDBAFDC92E10B54C57AA6361B60D59813CD7EB3839A192B3B158C1E9191BC40D324D86D + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3C16AFC41817B7B8CDD1247DE4A738500FE4A9BB99C13FD918E3F3DCF4C1B8872B16BCE6BBE0795D + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 802A3FAF92D5578C54E232429C90B938D9EB0A1227595729F6D02866563A46B839BE8350FAC43853 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 72EDF980E20123846DA4E85CAF9C37C6EB31859BDD49FD17EE76DE59454823B191A044ABADB01FFE + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 234BAA954317E26B740E4010043132214617ED5B7B5142A25E548A953BF7CC47771B9701C65ECCA5 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = D38B652988BC6FCD36C9D33B2B8B9CA7E3EAB4CCF700E029E27354D070CB0EF8C3FACBD68335A5197A + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 38F346D54BC850123B5EC6A53910A53C4D6DCAC61F8D61C73B6DBF94905B72F122AB4E97D4C1E5FF9E + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = A56B93264FB73A1BF1BD93FD3297A1D381F7BDB378583661E34DA710A2D1CA555143438A5AB4DB8F59 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 0EE41721D4D858B80AD6D2E48C26109888341EA97F98CF06BB3E1198F37D7DADDC87435D6A3A4204ED + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 867B40DF2B60E9C94692AD33F6D323B938C9B46F67112F809A48AA9D65CF4F79AE3E45CAE7C2037A31 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 4908D9B85B63EA1AD1FB956B453EE3B434B9CACF9921D7C31DA4CD099EC48F612D220600E1C4ABC2F5 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 67A1CCADFB248727CF9FB05CBB0320395A927631B5C6A4913DC3A522D4DB383F28A595EC57C9D53925 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 4F78B50C1EC3F528DC33CC9BB5359AB2792A7FE0A2E1B87C62A1369DB65036B16D081D6A4C38438F57 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 02C6EFE7E505F685408698BFB189F94F50BF85EF9EC4AF488EA14D1F90EF85DB45B8B385BFC94D6BE5 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 970C1F87536EB054D018BCA719371AB285AA042CCA490FDE071B95E9FAB8BFC62822077D64EA42AA72 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = FF57BD54ED5F7019A970DDF8281A91C1F2F76F9A8BBE40A9D8CD2F00983F7DA39D0DFC7199BD22F004 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 6C72D0D6E33BA198668CBCE6DA7CB7054B8AD5920C1C1BD6D50DD61E186CA75A371E811F13E755BAEF + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 861F3824C98F811EE8D1728F3607080C80B475227EBE1E73C256C57D948370A9DCA48450B35ED4A8C9 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 7EAA173CF822A8D6801D32CC60BAC9B34E9E2EC2EBAD99B4E9C741B926F5F3ACAD9DBF46D43D73F1D6 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 09BD40F3CB56AC96DAC14C7D153982CC238EF0A83B28667A1D4121E5137B752842CDC35CB22E2B5CB6 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 2F0E8465EA96703F723EDEB7B352F3FDB8909C6B4E1D78A717EB021709A0083E524FE19CF538EAA524 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = EBA9FF223F6912252D260501FC59887DA5280512CC87D144A9C8C9C9E059F186AAB628D80EFDE47FE0 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C2F16FEC618F3894B09840092555C8571EBC26A8A8EBE2534261E3A9F8A109A408CFC62D30C900E436 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7A29084A1C6A40432340B470011C29DBCA0C28814C8AA770F5681F484FFF0CF4CC47523657884AA62B + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4E353CDF44525403730FED6297A59097EBAEE3EAE4751BF472544320BF5DBAB61D60DAF8AE9BAFDB89 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 75ABDC2514FAFBE3F691A5D3E4554353FA8DD87ED2D4945D1E4E20C0B02B511C2FB7937A236A709B20 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2F2A226198C61562FCDEB2C744EF1621058AF95EFF98A2DF6A3719CCCF882F579AE2DCB3264AB62BC2 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E93C575990E7AD9AE413A748E647EFD41A2D8379D173C1AAA59CD62115658B7623F61DC3B4A7D87550 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 686E00C541E3B869691201F92E01FB4CA3EDF1B503758986C9DAFA50156D6F65EF59C43313F8169AB4 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6F64E2D4E91C713935D0715984D85D886B1396A5EA5B013225F96FD997686F32907FFEF1A1172AD59D + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F04E1D4C3D310339FA53BCA242FB188BB59AC0A76A22A6AEECE0F0ACFAB11AFBA74F85C1E3E9DF385F + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 6DD5CF101ECE15FA4E4A26FA3D74C987555CDAED600E659C0B4E98A7FB71D4C2917FE5F98EAC16C946 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FB0652B6E65C0E4D7A5EA779235134437F290F510D787D2D1B377A92DE3778AB9FED837BEA1EA8F055 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B773A399115F37E8226246EAB6C42881F1F6D56DEE865CB8070E5C6FE99C6C42D530FEB66C6A1FB77F + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0960088412F72DF6C41EA884110805DEDF0A324049A6891A4AEBE4FFDB3C1CA63BCFB608FC12BB0230 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F934DB2DCE66120FC5F9D4BB8BBFAC861474E9B80C9A8A00C2ACF5888F68C4E072CA298142E2A78C22 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9FADD96D91093EC525A8C54DB2BA3497FF3891A1E093169452FDBE2AED0D4ADAD5668398305820B664 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 708DD21215716002757B6E1314535A08CBB522011EFC3F3C5F5B00073D5D8331BC8D565D5F657E7E01 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 88BD07898C0152C33D485DD9D26E7521605E8D7C524F59D764AA9B8984B1B26CD4AAB9D6C25F186CB383 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 2D8BF156E592F6A08410E0F86DAAD040D38DAF92A43ED2389EF73DB4051ACC725CCC0D457DA1CA4D427A + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 6B90D6B9596A87D7CAEA10F69506EFE7A5DE02F9844F2873245824B113B6B0824FF1E9F90233F503010F + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 3BE6332A355759B3063D596AFBC9F47A6EF18E454C955FCC0E5DCC55C94C9AA5A90C088ECD10A3B14963 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 58E2B1C30DC3F5FED74758C6C43F293CB2857A9BCCAC52DF24D007088472F2BA1D475DFCA70B9862D3E4 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 4DAC8529B2B89024DFD48FDFEC66C5068A20A5E18ED65194B7EF4B9EA6A844246B9B7571733CDFE44EF5 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 563010B8251F242C8D4388F481275DDF8399DC3920587D91A8503B8D206AD15B0B8EABAE1C71CF80DF34 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 3A8E5493883E49D17321CF0FB3E3C68CDF221945776EFDEB6F969A7DFE698C0AC7D75C004B6ADC1C568D + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 2C15D86C03EEE626488614023092A67BEAC1EB9BB8F49F0DBE8AE35481B95B527FC3589372DB3A86142F + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = BF1C863DD749E115C8D5945AB3E47B013EB9B5F07C259926C1AC229993DD2BCDC057865457C62BF44020 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 3740D28BB9DAD06793286DCEEAE09F8017C1CA617016876CE5B17645F7576BAF5D5AF942B3F8E9D2DA1D + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 9762346C8474FF7D991C20922232443886EC7EA1CE4B28BF0DBB3B48DB7612E2D9BE8B278AC16D16B975 + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 223330E0612E399E6B5BDF5E2EA692F9B8F77463FC5699B24DFBF900BAFCC50653DD3A6DBA6D776235AC + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 9674803580AFF4C81B615165F4DA850F7EA45476D2B1B08559FB2F9212ECB8D02E7D55B96D41EBC713B9 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = E59E0ED292A6863718358AF09AEC4AF47F4BF8373AB7B3785F3FBF17AF6CAF1FDEDB0921555A3A590927 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 594ED59F0837FBEF4043E31CE060FE734C1F2CECA116C19043C7FB077B7EDE6452F2A8B51009EE881140 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = F554B382CCC1AD715F1693B89A3DB61A2CCB49AE71AD7BFAABD4530379C4AF2106A3B1DC8A0261838B7E + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C640622D0042E271F0D9E60BF5A0C8E5A7CDF89E36C30353BDE09E6534DCCD3BB6D149369DFEF1EF220A + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F8B5FE81B671C1E86FDF7C7E1E0A329B8BFB451E3EA155E0175B3986D2AFACD01A2D506A74ECE6687891 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FA532EFFE7CCD96D85ADB9B6860E2F510A1AF85F2C046EBDE3F4B8BA688EDACAD2841B11FB44DEA10F28 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E93805B7B6250E5A873F0C00FA74EA88EBF78D9B29B83B8E5DB0624D9F44D4142D4C64087B59CA58DFF7 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 10817992E3C6A949AE7A46B8DA8D2A5C89F15E29366459D958A6BE13AA5C3465AB5990E6D8549A1A42C1 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 749FD417EEDC551D38B403754646FBCD81EBD7708CC6436C906053D470396116FA196DEA052AEA58F9EE + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B815CCEC636C22404A3A6887A65A998B0AF0F9B1EFFA061F6A708E21054E6875E270BC6820EC38C94B0B + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 291FED1897B4519B8305EB4B9EBA01D806A71959E4F18D79A1AD48D34E94E5F182468201C7DF72E79B93 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 720CE7E0E8CDB2BCE90EA608278ED56ED2FD185B641FD9C98A90CABAE768C4FB0F911819067204BDA44C + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CC3ED0A8157A49A587F76D42D568547BD1EB4F7CC16282EEE7E538471CADBE003AA9F34AD0BB1FD9A24F + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F122A3B6CFD0521FF3CB7B5C9226390BB0253ED9295664AE194ACD9EF881E1A9AD22F1ECC3A2B3B7A862 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E78520E5BB11B8C52A2E5E58E8B2D99AE701E256327C6FD2A4FC3EDF938443AF49FCAA092171B1FC5DA7 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DE9F0DE4DA9811E3A24647E3A1DFFC5569953CDC0B465FCAE8894B288EC658F5CAC3018995EDAD29F716 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 59973823FD3FA05F9D040394ECD09B30A8734F36B75B9506583DE6F3EBF4DA226980F80193B52FC1576B + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0B9C0A518DC263BFB355768637E3E34E94C82DA477396F1241EDF99803BC3FE92727591AD1E311AD8494 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 561D717A8E3510B7E1E793D1AECCF0D40C02DAC1B8559E53C11032B7EBF961D0E92A55F1E405CDA1084B + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = D761A3376F87204B75528C30ED8A713617C7859AAB31C976A03F4A2B0B09A6B2B54128CD631DE825457D6E + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 51B710A12C9C59AED4F008CC38A71D5E14AD4D47AF33DEE74025A340EBAC9C9A88F151B7759A1CBE732020 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 1FFC481083F96FF52DADF81D99333D698DE6CE5D520ED7C24C7B5187797CD9CB86B1B8C5BF9D8E026C7286 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 702D4B0CEC1040A66392C501942A904B686BC624A7E23D96519073ACD66360340F45853C1BDDABE7859D5C + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 6A5F8D8E15839C80370F8882731F5D0E1D953F24C41D1E4EE28E153C60DD944ED57A082BACBB111B2E83A1 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 400A492D4073F4D0713EFB707CCD9DCD6850D4C2A7EC9FCE1D6E67943794AD4CFD7E7B6F8C25FFC7EF2712 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = BF32AABE4451BF8B5190E07C0CBC05C15952D42B55EBC52ED4FB2E947F29EC88449C7F139DA4AB5722DE00 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 810FB216BF78E6938AC6AB7F3E34B3B58DB726B1E765FDE7EE895B10C6DA0CB6C90E1C063166C3D20A7B9C + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 23C18D58D3258CFD3C4703D3CCB1916D97BA72637F1067380569F6B2FA1DDBE861939FE6994ABCAB9AC9D4 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 27348C8B5BF373A31F7910AC16DA445F68E9EDE71DB6C81887698F12ECDA7A16931741C03E589E8756D7B1 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 81AC6D37916E21D41CD703DB03DD0F95BA5C006D04A9C51AA60491A0CB0FA4D8B47E6D4F8C0A84DC472AF8 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 4310F8DCDD0F3795BDBF80D42F5666B49ABA5AB39564C708F81FD643AE7D21657A2719832D14FD2C892C4F + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 549E5C4EE29205BC331E6D885241B8DCCAC25543F1E070F69AA545F65DC574BC85A18FD4153CD7978277E0 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = A2B4AC3AC55734587C13E150AC832253F259600AB245E5E5E4CA2A206B8F04412B9AEF70C28574474A1ACA + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = B270B4882B5E86700BEFEAA717933AFDD7E3084860D3022393317BB657F67A7963BD25C61A88A252923CBF + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 0B5CDE2B6D2F4699B0B4017D54B91E305FFB099597734E61037128A032CF360D50EB48A8611A6EE3B7CEF7 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 84BA62801AFB7B85FE089AB36E490F442F72E2F0BEE73C4BA28C34115132B0D5FB9A69323BA967E83D1081 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8C7ABD78FB83021C55BF05ECF726620BBC72BF4BD957C65867487ECD5D1A6DF62B0A13D473D9DFF8DAAE98 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AD1ECE4EC99B0277E20585E77C8EF7536CDCAD440B0C864F8BA2AB3FC974F73BC6F1A84D2E370B732DB582 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 669BD569993E93031A0FF72C62D5CE12E8BEC230249D7B106BB10689E87D013BA7DB46B748C7D694AE1B37 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 06233AF02C44210EF32274853F6B838E3730E510C25D7D388BEC8E8661D301A9B0A35A63CD3CFD321ACA62 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 089D4E9A20C230D5EA9EB36DA1C4DAA199AA5321F68CA9C080F6A98864BD53D734CB9F21E95679C2C6FE25 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 78C8EF60441D7AD77DC2CC757835E80C0EAC6EDDE4FBEBAAAB2CFA8F5B8611130E8BA850354219755141A0 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3B031EA943CCAD370E1BEF335EB98AAD481F8B8F6FA37205E962E2BD3CD67251409039521C1C82767832F0 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FE9F0743FEEBF88A2444185C316E89D644C0EEA776F1D86B3798F11ED9BC1593A7500CD2A8F0A2063D621D + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BF910AE68B466A660AF1EA3EAD6117424F349ED32DAC569B683F51C88B5FE9ED4D050BCF4A5D36F9377728 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5AFDC10F267E0A94C66C028351C2B2313F12280BF0AD7BA43B8493835E160816F621BD7B5BC117EF198503 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 902F8B481A03811E8DEE69D623FE61239182158AFD0AAFF5279CE98157819C0BB886411CDA2D6352C84851 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1C13B1EB4F1D12F5798C92F32D4E556F75695A91C2308F01BCB1043979E25DF08DB127BCB46C3739F5C263 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1AEA0C137B539555AF84AE67E9BC5D58A278D84CC778084250BDBCC604CC5B868103F8F35FC011A599B5CB + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A4745F6F6FA04B1D4CB8F0CCCC0B58248EF51062CA63D2ECBAA4A9C157B84563DC938DB815395386AB3016 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E639D666E3717E40DD4F58100600CE278AF90FE35D3E44DAB099F726C93662A3994F815231238393CF7A44 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13630B818FAAEA8F29B2F472A778E05B264B17AFC5C7DACD98DAFB33BE449773440686CFE8008BA8F00B86 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 4631EFF7DB7987FF3C788B02EC5EA0D2F8D8E26018AC2EC98492DC412C53589D9B7208F06133EA2D3A4C963D + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = A1F6CBF28B94C36E23F9FACD10231E85E382D804A7B742DA314CDD685A081BA378753951C4D4B624BDCB9B4E + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = E1A2E508B562969153BBD3160203D07E751F6642AFC7E4CA29993A55AF35005B34ADDFB063F1F7F37A7CF80D + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = C0331C5073264CCFED778138CBBDF537191E31F75C28536A1104018C72EB16CB681A7A43209235FE0ED7E7D9 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = D98D834A654986FDDFFDA6FAB3E7CECDC01F16F02340C0F4CE07401AB11E56C8B0DD6708B77318B0809B585D + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 2B3E58BAF5FF96E8D9BD3139E344219D43B01E90A5EFE5F519E2CF8BD57300B0BED504C55348EF77DE176C1F + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = E1CD107BDF5BFDB815272A9F2A9C72BEC1C62F38A850F94ADAB4FE80B4A5EFD23EF54E9EAD41123CE991C40E + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 493B0B17478EDBA7349FEB4A1A826987F340C6C7E0771C79DE51FC2EF73CA5C4F67245D15BB4A61AA49EA78B + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = B5C46A5E9AAE66E5AF7DC3EF1C96752C463891DF1DDFEBFE86355618E6F468A064116A82DA72FD7EA968A70A + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 61EC42CF64C31BACE17EAC22A34452667CB4EB16C2F8B06507422AA8E11EAC430F0AF11D1904E43046A35086 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 8149C0099CD248108BDE503F9BDFC803574D2AA21A69587F9024AD786AAFE038C8BD91D280DA319AA5D9F12B + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = D2A1986D68DA8649B343E63B089B0359314DEDDC9E3A8E2107D07B8976DAD3D128B599A2C2D70BADE2EFCD88 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 878CD786532A21E1C2672C4ABA6EE23F8609855BCD2A797E13E8367047199E26E3882E844B240A359372F8E6 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 480F1733987450F48AB04858CB2693E4630D46D2B7FB1661782FE64E1C2C2A8A0AA6EB4AA8166407B89BD0D0 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 51DFB419555A3F316EE90E1C9E364E535A082068FA965AE88A04E5D8F81A4679CD8C77DBF7803B61A25C7669 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = B4123F0495846AF2F1340734AA48C7092A88D89A893056843D8D7353CBA85271B204FA3AD654E13FE0C62FF3 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 747969F414565232267F45FA9C810D3F749B6A4AB1DD680FA1E702317FF7B839F48D4AF70A707632D1A21E43 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7C79610BA60B3D4A8C56D8C96EC2AE7A9B7BEF4740367BFDA6CB9483947C30EA8B125DFAA00FF3A1F12221FD + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0C9BC5F98E630AE52F18ED9D12E77BAC6FAA398FE42E7AC3159C64CE5B88989A284C90E3FCE9EDE0240DD6FC + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B5A5AC92E62C58B2E473749B876A7367E0E2D66F016C28FAC78CA516FD896124C144303FAB5AAD5BEA3286BC + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D48B3B168C7E6F568D221EC685FAF4B9B1E25019E57894F2DC0128C742489B58828BE45471664E1449E9DA69 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8D8E23D397EF64F1467BF43D1EA4B767757ABAB51AE38ED0D7A3F04849C5702FB444D90213BAB5925BD51AD4 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C090849DC2D0A33407D74B5352E7EB9819781F6BAA2C15C72319620E3122543A1D2CB3B407A7E1AC194A664C + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F5A3B984DE3AC46A856BA0CDA7749AF9DD15D0EEB6A91B4AB8DA41E2D11541891782EA5084658532A84779FD + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 62D84BF1714F586E4418C446F256F5074D46D9A2FA11AAEA77B4DEAA3B5B476B4F725CB9BBFD51620FB9D8F6 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E7566C3FE29738565E11C4729B9C4B4D28D61D4354FB6FA58D0D50A5AC6E905EDF6589D7E0AA63E6997717B3 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3C2DC904094544B213E59AC911BE8835D9979B1663F4732D86A3CE2DC3E43E2AF5DD5985362756C04CCC9C50 + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2BAA26F748D754D2490537D853FE43B428AA1921BBB165FB63EC1D9DCB74DEAECCBD8CB826FF6B37428FB2CC + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 80560D111AF6DC75D5817750E9A66C73484C2C19436F1468278227A6341DC87DD8A0D97A6458869591A86543 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 81478174EDF360A8300F3AFF135AC82C5647DFAB7377D7840A1FE2546479726B658C07E644E95C5D63769D98 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F31F529B3AEBB1735EA531D7E214A12D3F212C73AF448FB8B01BEFF70FF4CCF0AC587F40F39F9B8205B5EC5F + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C810449FB20F619DD887E4D71D47BB06491609F08EBB0C9A37994A0BAEC98AEE8DEF95CA2257A27FFE7B3997 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F1923204C753C122479762FABCAA9427EEDBF21C38902E91EB10EE7137B868AC507A1FD0AA3052FA5EEF866A + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 1D5FC7B222EC034A4F3B1C0FEAA03769923889B747AF3B732C7F6CD5436FDB54773395CC7157423C8C4AF0A673 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 7A674D2E7EADF1F31B832654583BDD0751676E6A518C8E58CADCE98DA2D459DA4D835FFA795A25E03FF02396C9 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = B86086F2B49C0309FC421483CC7D89E6A10EC88B89B57F9F2B9BB971C753A0B1C78D62374DB63B8A63B226A283 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = CF7DBB3EE8553597499EA2BE08EBCBAC34BB92A10BA60746C66B001480507A32F38F872A2AFA0E5A65765D76CA + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 5C99A218493841B0723B15660C0101C9F9B6451B0FF9D1227CE6DF878269A7480EEAAEE3D87B8F780FC50C0368 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 40A209F11A61BD00A6544A98B32CEEFAAF639054F6C4ABAC4429A3F3E90F2578D0796AAC6CD1ABF62DFA01354C + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 1C19F0B78EA9A21B9B12EB2488A8597129DAC0712DC02A502BF4FC9530A563811E7CE05EA58C3651FCF79B8C7E + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = F44D3455123B1ABAF04DB6865031B71117D0C79940B0825DE48C57FDB34E8DC6C05E23358EDDC2AF2115E29A6A + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 240B5A9690B6AF50B64411F23F58E94060E5A98C6EE90556E82912EB5C891203D99EC206A5974B5AF3683745EB + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 37453CF9B8158059F5AC10CC878E8BC179FA99420CB6B4DDB7253D4461EEF7D44C1574A4CDEEE9C02600FC8E18 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 5E248F4574B642257CC76A63A4367B27F05857A8BA6494C928B4CD70A66568E587FD92FCC8CAAD9520A11FF57A + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 4FF832E9F2C124DDB63BAEA96B8287C377E447AF590EAB2DA745D910A8B2E41C18407CDF7E359A5C3FAEB984A7 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 8BCA543C4559E24EC0E33F4B38C83BC37B46F5C895359DD4B6D9E375361BADD553985AE0600FBEE4468293467A + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = E0E1220611DF157D00816DFFCF6DA2439579E58AC1358BF733843577BA51FE051D38C53749188E1A9D7ED59A75 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = EFA53C58F68A0FB7AF4328BD6C2C84C251B7BB1FE2DAE2668D186315299DF56BE49ECB765D969F28C249D13307 + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = 5F755F7480FA7CFD1C0C4875FB0F398C249FD73DE7A62270E99BAE75A4AC4873A2BED916318076AF5D2F1EAD61 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = CBB15E8C959C9511F26ED641B8E8D068406C6F436560F95E295EFEA9BB43863979DCC72767EC65799099719C77 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 351E585B5B901AA3BC8D3A51E582ECBAA18A26C313743AE1B36B01AD2CD8D30C157A5673660385171CB11B5459 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0FC337942AB4A6BB4AF1197F1BAECAD812BF917295E5A8CCDEC2115A49276D7F4F567597251C37A41F0E452C53 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DE176A6A6D84D97C71E7A4D557B8C51D03B0C1B1F49D870AEC61101DE5992E49D753951182919BBFD67C0513F3 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B8B0B0651CA7B0D8599E0FCD27DC93C55215688E1A46DC884B59A2A3748950CAD47E1EB73077FED558960ABA5A + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3F3462D00E5F2353E1CCD1E3CDF029D4948E418E2AAE77B1F01175B897975EF13EAC1DEE49A4592E44AF4C6851 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = BAA9A575C70DA3D192DA9F8289515DA6A896F11887922E0A70407651B57C3A47BCD74DB433009AF7FD59C754B9 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 141676FED8FF33269BEABA626ABE61BD490440987D2D8B5182F77EFE7CDE37B1A7D2C47D65D77A4DD3DC8D201E + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FB5C4BA275A3D68F1237CF79A2536B8FF0CF3E63D9E6C6DC836CB34182A97F6F33D39BF4C451A1E2FF74AE0C7B + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 88E8F4F6297460E851FDEB20C5C27C6699BC7372E3BA6C2B6DA1CAF19DC902637E1E680C33644308459220579B + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A5484211C19284FF26CF3E4634C201B7B8BD7D172B6F1BD32912D7F5B616263D77813694BAA3D1A76C608D929A + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 29F56D5899334FA9CF946FF8E6608CD8F234ADA279811D0E21CC41CC9FF3EB02990C26AB702B5A149C6E5DEAA8 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 07ED7A28ADF93D5D981B20BE1E6B1E47C02FCDFA31144E37D0C545C4DBF64A013598BE4E136995E185D5D27EE4 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D75B850A8AE568256AA0C6699444C281DEF55E3BC54F20E5C8DF4F2272A254B5E2DC9E4DE35E5F1E07D284B7AE + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E0E879B3B760B4D4773BC19C64C418829912AF65DA6B4F6B8377F3171D8D2EF15EF7146BEFE24F263FFF4D5AAA + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 226D2524E9F8231229CE7CB14A2413DAC72D14DB70A4D5C956C46CFA1B66ED7A0D1C000D5CDA9443185AF5C3EE + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = AB1F909FBB0CE337176AEA59DEE56A9BF9F572545337F41BADCC82087D7987A1B807B7E2C0B526B726525AE968 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 3ACE3522F7CAFED97A57F8E021D4A208E56A31965D855B98B26C2DCEC5C84AE6A0692DBD59CD891B8571FE64998F + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 53FA840F0857CB58BB6614FD35DAE26537229B6EA97542A9B3434B37E31D5D4FD27BC04C716C43FD673F97C9B7ED + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 2A38156C2F8DC4939FB0DDB0D2860B276486ABF0C58085CEEAA88DD7C33C3B33FB64378EEDE87290293CC98FAD3F + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = DE9CBDC2E3A1256271F119D08463ADBCDFE28A99BBF5861DD6F80F95C92CC045837D2794323C829EC578AFC95683 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = EE315AC1FAA7667C17F4DFBC793A08CB6368F2A086EE1241E6A805BD14B1F4D5C1E8EAE8853CCF9D6625728E196A + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = CAECBB81E9C0D4EFC30A8979BA50DC4DC2239CA9438994305371E530E0A51F338A75856C5119C500FA504D888E3C + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 5643651105C12AC5A499A7A9EB37C3511C6FDC8BA670303D7D394C2A0A2AC57558B4606FC550758E93E0F9DDFD84 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 1D0AA1274B30BC9B40A416555CB5FCD9EB7D03BDA24504972452340F4D0F72D48F72161E08307341472EAA4A9C05 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = B1F69A00DDEED34B28DF0DA262BD972874865D3A7A01DCA559D3C3E4D7ECE804AE87B74EF10580C52AA3B8CE1FA3 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = C9A1D6AF24D9955B80277DDCE37738714E2E4BB659A3BF86599EE904DE3E64EEF9B62915A2F45FE10351ADAB7A49 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 4114800B6E20919A618D3EF93B03BFF29541CE781E7CF7EEF4DDEC106BD5F39A4EFAF7ADFBAE444F2E43D3E57C98 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 15CFBB19F5700E1C09D614A743EDD0A26456D4B37DE5FF962B21B2289A818132D9F9F251A55A0A7DE9D43B59FB62 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 1A35F426CE6896447C1F8E0968C32AAB683CFC5E45AF52D2DD4A5CD878DC70C4009FBF9C86C729F6A4A87BA5E49B + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 21CFC803ADB6CB66B692193BE575CCBD911B476CBC5FED70FA7B74827A9C1E6D193FAD0ADB26F5792367DAB9D9C9 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = B2334054EDA32B39CC77E0F89D5521476AC0C8CFE0E9DE596F2F7272A3AFC5DA8A57860990B5D99B71C6ADEE02A8 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = A0D83F54749135A7A3D452A3A94CB729E774B049B422E993ED8D55504FF5682CFBD01A415F55F9658B72A3FB4EA3 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = DAA97889A5ABC3B0E6A99B3D86D32DECA8649D568EE931FB59410C7C36253AF75BACE42192E8B8A080479732B3F9 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8087689425F62D214C1A63346FA0BDAF1F32F5618E080CC9A5E412F7281C0633150AF9BE248558AA00060B3212C2 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 02B65E258349443E1B3A51627474C37888B314C476317215C86B3C2C450D5A89F59AF0CE7738794CECC50641F9C4 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3C921841EBFA06AF95FAA51DBC10735B075382114D80055E48CAC9EA89BC5259EB2DB3B31404FB809D7D8D84EF1D + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2FE15423F1F0A8B3FE208A8C5A90F3AFC849C1173FE5C666FFE7609D41F7B5374B93D047CF461F3CBDDD2123D460 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B020E03A4274428E912994CC1552142F407811C63B125A07CCD7B9FC5DF638C2517DC9FF935A2CD1FA2E1A4649BB + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C000025E534FBCDF2E9D4D965F5B06E0F5D0EF15D5288DB2C2A98A7A0AA8FF15E8280716A56F7A7BA585B6DFB868 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3CCD862712B2A1EA67F37B60CF6CD897351E9C59425935A6CA7C1F3AF748407C6C6707D3B330EA8A18F7B64338A5 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 176B82E5AC2E3341D055292E2A6DB5BAEE4F3F048BB44F0980708A532D3C3534E19185689053764A2D7B0E6F5515 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 2A459605DE22AC67F23C75C8870AB5BB10CF607B9A59820D6151D5D1EA8BE7F92FC5B1C9F82EF952B4D3C96A1D82 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 73793B54ADE9C3A03389BC135AB1CAE4633FF66E502144D3C9CB3C9A205A04E21BF0CE4C65CCD62F808C11210EEB + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4F8216113F215F15748BF0CF727DD2AA32BB5DA90886671564D1DA1DBD970846DFAD2F3718F7632847B21CE4DD28 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 025623600DEE49364393D866D48907C6B1C96AA8E470D8923643950660EAC2698A084F70080F5B77D6CBA7F635B1 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 34D5A477CA74195145F060D200AB644036FFDB7FDDF6AA4EECC6823A46150A24927AF4746FF9B6B6CD362E4B87E4 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 619D41FAD0D51172B57386B817A2276473EE509A36F3CD11B670190736853ABA687A6B5B633D4D681B6636398D94 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9F753261BA48B23AE4BD473A450206EB2E28687FB34EEE8C56E720E67743733A9D4466812717FE0D83A4CC6EA3B0 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6EC91161460DE504B64B28C509D0A1CBB5A39B109425B41BE815849AA519C29EDD8BB8024F2CB05F75001F520E5C + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 0A0D9CE64B7D1BBA88B369512A34901D70CB84FF259E51104E0129AEC2B35A50F7CC78C07F5DD490A2A81F433E88AC + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 1CF0BE50A57BB12A178C77DBD19B9D3DFC975FDBE63505B9A407F00FAA2DADCB1418A2D22362E7D625D6CB721EB0D6 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = D5A5A7B1B29F15FB534BF2012990D231C02098C98FFCD9A25D799B088E45B3EAE634121C3F518A31B8370BA28E3769 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = F66D267D766F0110885C2C9E025A3CA3C9AC2BB85EC37B3F3AD8EED652D5E1ACC01172BDBA655806B2AFC82D2D62C1 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 6D5DAC06E3C59454BDCFF731839943E0B74B4713AC443C3C153FF030C5F18C54DB499FF05EE74778B69B624C6563A4 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 53292F0461AE06129AE1E14A348021BBAC30D686AE7BBFEFA66E47CA6DF8F8C569388F1A5EF1DF7F9FD9276BB19CBD + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 4E445C78736E9E0CE84F4162B574A5F18DCD0414CD3B1A76151F167B9BC0F715EE7717A2D901574D5B6D966B09C35B + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 9BEE0F03DB8C980E5CA77D10B6B77A6A84325F28552D8F2EF7A443495DF3A841CA5F988551E2CCE7D4079E1DA0562B + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 5C9147E1AA90EEB328869A97D5B71DF59327B663D8A6C486AF16A663DCDBD3BC5FBE3264B42D48E82C16B89676380A + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 2671EB7FE131EF93B3AD606BCC4A6F045FF665F8D31338CB5BFEF9355E552586FE9AEA0CDB697089005DAB4242F129 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 1FC9ED4F8736B987E68D4BD4E982D2B6EF82DDB379299ECEC0B37683BA23FA02E470932092025474FA8F2DFD861A6A + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 71114726C16213ACA86B935EB5DFC764DC024BA32444684B9934F2EB9265DE62A19A72FA4861FCF4AA090616647C5E + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 36D20D4298EA93354ACE0F044AE38000C6CF6E522F31F7F36CC77E76D3C1E1120F186B0B46A0E63605517B1BCFFAC5 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 5F19C6FD09D4BFA755055E05C1958ABC27C4E2F47D621CD6E15CD93A2CA83886ED9BC9B04DF9A90B6C6EF6060BD954 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 61416684AF33EB225F7A3DAA486AC32B135E1B72E4A369C5A2CA0699FF75E10F8D3E4B1E316B49EFDD65895180D966 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = ECC891842ED26AFE6202B809F851EE161CDCF42C2F4171451AE71CB59AF535D1729B2F5DB5F05F560511890908E62B + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = FB1E98535D0D2F3C667283420B9EA3E3A869827D615D40254D6D5A74ED34E9E6D6CBD51DE4A45F9EAF769B15C025A5 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E78E093CB9888992EA1C980EDE970771A51EAE788052390A8807C101F9E7F199035A7BE439769C48A6F83CBC2DC6C8 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CEC372B32BD75156B814D16FEBA772C593B9F0FF779AF8C3B562D85C815E7203BE3C37DBB1C11E3E92976EBAB0D7AF + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 967841419A04A38512D18BC574989F00B20B87F3454A31083A8373A2B87251E5AB413BAD0E7C1855068C47DE0EF855 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 95708CA357B2076FC4FC4FD8CE39D364C45ADED73FF0C5696D5B56122A84FACFEBA4FCB9705579697CF894C138EB43 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 04D983FB974183F5245EA496C09E33B95878737DBFF2A4A96B82B70ED5AB25FA90D03C3AFEF45E538245449EFDBBB3 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 18C4E384C45578B06BBAE4A830B0D616341D717AE0CECE5E9206D481FA49220167C205AEE99752D7090A4555826FDC + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 1D4681A91800EF16D35B3AC1F226E323C99CE7DCB5EA3769D46C2CF57EAD808899C65FA09B2F60995B68CA4C584030 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F1161A3FBE40754C9F7138D366AECDB9B0E81C5B208997153274DD6F7D88B2737CD07561FCD0D8EAD1376573487B02 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C3C32636A7FB01A2A584A8B13933E19AD0C42595410F95978A266637F393B289A37CB49951A021B9F57A00B96DB902 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BB8F385659ECA4C47C9ADFEEBDB76B89CD8D457565EE36FE408A5B0B21779D0295E3437A1775ECCE516B0A26164C22 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 83311808A1A27E6ABEC29360B6A491AF396B0C2F238A5234F6E79737AA532704FE644AB9201091F2F74BEB80F397A3 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9AD60E25E3E9B9097B2DB10D2DB099CCE25473312E7D58E88914335EFE0F55D9B979B35E9D7FABA3D6F9D89B8BDFDE + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = DA36976E0D5C53DCE0235FDE4E1822A3FBF626CE1B4BE4D246F52A94009951A3259354CF673297B82BEBE1C508E362 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0E8F5D60A50E6C1CBDF45B678DFBEA122F12E6C699397E9731C805DA54EB42FBE12F13A9A444509A21BC5203E01468 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = B36FA867D99603F33A81157B627ECF60A7AC79CF4C01CE1A439EE9918E9D46635E9934F37292DDBA332BE8183F961B + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6875024A0917AF47EEE2FADD447AC46E201ADCCFD2DED76E5A1F011CDA368969448BDDB9A659B2439F4CC646539CD6 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 121172803F4C842365D11D2437577A433D329ED82E6865CC75FD26C1863B6914A7C0D51DD4AE47B8808A329D28E6089B + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = E906E42E5CFD292A42B7493B4B53D18FC730758CC2A233EA446AC819AA09FC2A84138DC0A5A3FD8237EB2F9537FEC1F1 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 8D574D91B45163984D88A6ADA40128F3F4B99F17F99532B4FB13AB08D8BF828F062ACD6D7FFC36E49C46EC403493D15A + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = FAFA4C7492131996E8ABD83D997F54870F25AABF3562A0A10D8C2A0A491AAFF4093309D2B9BFB59DBE20D5ABA24DF95B + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = B09B3ACCF8E07E92B423EEC304391C6C31957056B5C0F47D7AEEC0FD07D4B58ED46A49263E184A6D0477B9926E56523F + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = D2E4869CA046F2F49A2388A9CD48CCC804817C580834B715F748B927D4A1639358325A2BE7BB0229591BC12A55D9F60B + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = A7F3490B210EE5E7E30057C32092B4FE2D1CEDF1C361EEC130D53646CCA1A81AAF47872EB94DE3820C6391556C49D908 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 6E1CB3A06AF48F2B240D3B8E22D2A1C91B6EAFF5F30A7D0E80FD5902E57B77E1224486298155499877730F4AA13DFCCB + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 80E511E01DE9D5A282CAEAB7B5B7D7BA30F4FD9641A71D09E42E644B41964DC60CE53AC332DBB2A5FD7D9FEB637EC995 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = A93D1D09820003202F7C91836E47D2640646181BF3D1030D24DFD87802B2CAC972CF63CD4305E142B623945D6A466CBC + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 7ECF9D81DA6406CAB1C776702C7E54CB63F14721778418B3602735071BA6C2404FF169ADD70554E731DC5E29BE3FC1FD + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 2E3408EC903562B4E8B2D069A180CEB3CA99FCB446E339D54A77A0D917FB04B33CFFBE5DB7189F56E31179D32E0B146C + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = AA820EB70544F5F74403AA13B8A41EE7F01C75401B159A4486FAEAED1FE5152E24A1B0B7645300DDABB93A55BC620C93 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 65E14D474FAAD1FA4447FB6AC45EE337DA59231101D5252B3DF6790EAA32D5FB4FBD2406498AE6525BCD1282E329FCAB + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 5C7B09E7961889CD672CFD91E4C89499A74BB060D279E039BBA2D05BD3A8B4CA792DD7516C11051C035F41B6075682F9 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = BA33826E75864F69E5242E3BD39424291C98EC8FBEF4AB9F6985646E8A01F5666042EED8884C3E142F9DB5D35CB2B28A + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 04EF6DCAA9E933EBA8FE15ADEEC8D27EE607914FD4B7D842E0B9C8221BDF9C29DA42EE7AECD6FA5BF11D51CDE6F7E9AA + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 281290C09E0BD33EF28A164BDABB878C8D1B06169790A5F7834751541CE8080DBAD89C7FDA7AC98FFB4BA2B1519D3046 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1980325769E1DEE75E0896B17FD9762A5BC072A006CA245440B6204E04090878DC24775AC6169C6D69A539658336692B + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DD177EDF1B29124582F70765464F37061A0F3E5FB2B229A4DCF5E665D74D9A8B77105C9DFA10FDD17B4FF4EA03B54A84 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = BC65F8743755EAF00339EA05B481B0D89266D1103B98980CCEC9B3750A493478F069B77419F5D08515B6604576D7AB9F + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 557FD03AE02351A83583A2469FB2724F0A4A8B6E920ED05451A569564E6982446CA1F26555B4176D49263486A9F3AD57 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9418554C386C24004DA2D19CDD89AE1156BCD9290B1AAC07DAA2A384519E72C68801749D8F2E278259094985B1B0056B + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 45E5FF4B9D9F2B263A02D76840EEC759991AEC4D02CDD9B8C98D62BA4BE4F4761DC543720B64E902829B6BCFD7E0BAF3 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3C5556632197EB80DA2C29DBB506A0283052EC24DA548624210BEBAC8E839A55F85CE9E1DC821DE0DDAA1593C4F01022 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 858F555375F98810B5D19035B3269BC6CF444F137F1C94BBE02710DF7E6CF9A4D20DF9A045177EE0623F2F7441B74892 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 757C99569F79DB6FCF1E4100E7912CF77B3F7AB7AC83FB151E5F327542969A1240B94F2023EEE1C22FD5CD01B2BE5FEA + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2CCF850249644E9AD9E9E5939005741627D25833D3505B871572EACFAF9DCA6A38F3458F0D18A72E78DC80FF610AC835 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 71B3115CAFF049F7943AD91A4C99DD2EB42ECA418D9B15DC148263593AE48DFF2030279B00952BB4A48A561153349708 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3CD0CAEEE0710AB21A9A01C6CB161D9A222C40D17C42A239BF3EA735D030B9BAC3539C930F36D9B9128D6702199AF8F8 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F38B4470D6AC2FCB56FDD10ADE6A204822BEA8E9BE73B1A1675C75AC982B0E0B079382CAA28C193D409BF666C40E1695 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 006DD064539E869DF17D7FB9CDB32595C0425AA030554B0A7D5E57F5D5D4563C4DFE1E241B9B53CCE0BAF20724C4BC76 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B0C0D0E0F +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E4C75961EA0A1F4E1509DA3AA6268F30624BBD8083ACF3FF0CACD4E5111A542B6A04B6E51EFFDF4C554C66E58C879CF8 + diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.c b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/api.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/encrypt.c b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..b177c18 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sundae-gift.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128-config.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.c b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-avr.S new file mode 100644 index 0000000..641613a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-avr.S @@ -0,0 +1,2104 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-full-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-full-avr.S new file mode 100644 index 0000000..ff11875 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-full-avr.S @@ -0,0 +1,5037 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r13,X+ + ld r12,X+ + ld r11,X+ + ld r10,X+ + ld r5,X+ + ld r4,X+ + ld r3,X+ + ld r2,X+ + ld r9,X+ + ld r8,X+ + ld r7,X+ + ld r6,X+ + ld r29,X+ + ld r28,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rjmp 768f +30: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +768: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-small-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-small-avr.S new file mode 100644 index 0000000..77ef9fd --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-small-avr.S @@ -0,0 +1,6053 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +678: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + cpse r16,r1 + rjmp 678b + rjmp 1175f +830: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1175: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-tiny-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-tiny-avr.S new file mode 100644 index 0000000..e7a03f1 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-gift128b-tiny-avr.S @@ -0,0 +1,6766 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-util.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.c b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.c new file mode 100644 index 0000000..d192b8e --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sundae-gift.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const sundae_gift_0_cipher = { + "SUNDAE-GIFT-0", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_0_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_0_aead_encrypt, + sundae_gift_0_aead_decrypt +}; + +aead_cipher_t const sundae_gift_64_cipher = { + "SUNDAE-GIFT-64", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_64_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_64_aead_encrypt, + sundae_gift_64_aead_decrypt +}; + +aead_cipher_t const sundae_gift_96_cipher = { + "SUNDAE-GIFT-96", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_96_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_96_aead_encrypt, + sundae_gift_96_aead_decrypt +}; + +aead_cipher_t const sundae_gift_128_cipher = { + "SUNDAE-GIFT-128", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_128_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_128_aead_encrypt, + sundae_gift_128_aead_decrypt +}; + +/* Multiply a block value by 2 in the special byte field */ +STATIC_INLINE void sundae_gift_multiply(unsigned char B[16]) +{ + unsigned char B0 = B[0]; + unsigned index; + for (index = 0; index < 15; ++index) + B[index] = B[index + 1]; + B[15] = B0; + B[10] ^= B0; + B[12] ^= B0; + B[14] ^= B0; +} + +/* Compute a MAC over the concatenation of two data buffers */ +static void sundae_gift_aead_mac + (const gift128b_key_schedule_t *ks, unsigned char V[16], + const unsigned char *data1, unsigned data1len, + const unsigned char *data2, unsigned long data2len) +{ + unsigned len; + + /* Nothing to do if the input is empty */ + if (!data1len && !data2len) + return; + + /* Format the first block. We assume that data1len <= 16 + * as it is will be the nonce if it is non-zero in length */ + lw_xor_block(V, data1, data1len); + len = 16 - data1len; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V + data1len, data2, len); + data2 += len; + data2len -= len; + len += data1len; + + /* Process as many full blocks as we can, except the last */ + while (data2len > 0) { + gift128b_encrypt(ks, V, V); + len = 16; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V, data2, len); + data2 += len; + data2len -= len; + } + + /* Pad and process the last block */ + if (len < 16) { + V[len] ^= 0x80; + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } else { + sundae_gift_multiply(V); + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } +} + +static int sundae_gift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char P[16]; + + /* Compute the length of the output ciphertext */ + *clen = mlen + SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (mlen > 0) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, T, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, T, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, T, 0, 0, m, mlen); + + /* Encrypt the plaintext to produce the ciphertext. We need to be + * careful how we manage the data because we could be doing in-place + * encryption. In SUNDAE-GIFT, the first 16 bytes of the ciphertext + * is the tag rather than the last 16 bytes in other algorithms. + * We need to swap the plaintext for the current block with the + * ciphertext or tag from the previous block */ + memcpy(V, T, 16); + while (mlen >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(P, V, m, 16); + memcpy(c, T, 16); + memcpy(T, P, 16); + c += 16; + m += 16; + mlen -= 16; + } + if (mlen > 0) { + unsigned leftover = (unsigned)mlen; + gift128b_encrypt(&ks, V, V); + lw_xor_block(V, m, leftover); + memcpy(c, T, 16); + memcpy(c + 16, V, leftover); + } else { + memcpy(c, T, 16); + } + return 0; +} + +static int sundae_gift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char *mtemp; + unsigned long len; + + /* Bail out if the ciphertext is too short */ + if (clen < SUNDAE_GIFT_TAG_SIZE) + return -1; + len = *mlen = clen - SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Decrypt the ciphertext to produce the plaintext, using the + * tag as the initialization vector for the decryption process */ + memcpy(T, c, SUNDAE_GIFT_TAG_SIZE); + c += SUNDAE_GIFT_TAG_SIZE; + mtemp = m; + memcpy(V, T, 16); + while (len >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, 16); + c += 16; + mtemp += 16; + len -= 16; + } + if (len > 0) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, (unsigned)len); + } + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (clen > SUNDAE_GIFT_TAG_SIZE) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, V, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, V, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, V, 0, 0, m, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, T, V, 16); +} + +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} + +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.h b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.h new file mode 100644 index 0000000..9040dd5 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift128v1/rhys-avr/sundae-gift.h @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUNDAE_GIFT_H +#define LWCRYPTO_SUNDAE_GIFT_H + +#include "aead-common.h" + +/** + * \file sundae-gift.h + * \brief SUNDAE-GIFT encryption algorithm family. + * + * The SUNDAE-GIFT family consists of several related algorithms: + * + * \li SUNDAE-GIFT-0 with a 128-bit key, a 0-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-64 with a 128-bit key, a 64-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-96 with a 128-bit key, a 96-bit nonce, and 128-bit tag. + * This is the primary member of the family. + * \li SUNDAE-GIFT-128 with a 128-bit key, a 128-bit nonce, and 128-bit tag. + * + * SUNDAE-GIFT is resistant against nonce reuse as long as the combination + * of the associated data and plaintext is unique. + * + * If a nonce is reused (or there is no nonce in the case of SUNDAE-GIFT-0), + * then two packets with the same associated data and plaintext will encrypt + * to the same ciphertext. This will leak that the same plaintext has been + * sent for a second time but will not reveal the plaintext itself. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-0. + */ +#define SUNDAE_GIFT_0_NONCE_SIZE 0 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-64. + */ +#define SUNDAE_GIFT_64_NONCE_SIZE 8 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-96. + */ +#define SUNDAE_GIFT_96_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-128. + */ +#define SUNDAE_GIFT_128_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SUNDAE-GIFT-0 cipher. + */ +extern aead_cipher_t const sundae_gift_0_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-64 cipher. + */ +extern aead_cipher_t const sundae_gift_64_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-96 cipher. + */ +extern aead_cipher_t const sundae_gift_96_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-128 cipher. + */ +extern aead_cipher_t const sundae_gift_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_0_aead_decrypt() + */ +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_0_aead_encrypt() + */ +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_64_aead_decrypt() + */ +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_64_aead_encrypt() + */ +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_96_aead_decrypt() + */ +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_96_aead_encrypt() + */ +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_128_aead_decrypt() + */ +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-12896. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_128_aead_encrypt() + */ +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/LWC_AEAD_KAT_128_64.txt b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/LWC_AEAD_KAT_128_64.txt index 32e6b62..16e4f9c 100644 --- a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/LWC_AEAD_KAT_128_64.txt +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/LWC_AEAD_KAT_128_64.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = -CT = 2EFEABD1C5A2293CE96A9CC702BE2601 - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 00 -CT = D7AF70A2AF187E8EE1BDE824F5239CF8 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 0001 -CT = 0414EE784D0AC23CFA9C20A185095010 - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102 -CT = A9EBA632AEBEF2C22BD35E1DDEB3CC0A - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 00010203 -CT = 32CBABECBB8B7434CC32CB159C15D2A3 - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 0001020304 -CT = E46E6FCAA6248E4B780EB9DA5CDAE66D - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405 -CT = 7D8531D060A3F09A547FECF03CA1CDDD - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 00010203040506 -CT = 4C7E1AB11FC88DBF81E9799290A6455D - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 0001020304050607 -CT = FCAAC8943224BC38D441D60987D1E142 - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708 -CT = F30E53E329C8FD3B41C723F61AF83B7E - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 00010203040506070809 -CT = EA718197F446B789D5F481A12F6EA43E - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A -CT = 83FD695481492886AF4A8C7615B92CCC - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B -CT = AFCEE836CB715ABAB7A0FE5A4951EAC3 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C -CT = 703A2D23CE25B858ADC0027B8015DB47 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D -CT = E0DC2D0821BB4B27F54A887A18831F1A - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E -CT = 1151CC5B870B1F3C0298547B5E0D89A0 - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = CF46FCD5944DD708CB6980B9DDEFE199 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = DE05CDF59ADD1B3328A095F1E15D3693 - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = A9CDF307D9F47956DC66FAB3E63D818E - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E1AE8EA2DC7C3907C6D64FD77A267F78 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = A32D573042BA74DC3AB45896670132BA - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 525E5FA580C9935A34918158BD9A06B9 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 07962AB39F8084DE3DE2309450915C26 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 148BB38F83857EA9C67CD72E048755ED - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = C69407F3C568533856FD22512A366D5A - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = CF20484D82378BF259FCE7982E6859F9 - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 226F4F6F3F24E1F1F4342B67ADB8D91D - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B03E788639DA33C3A24B580A9BFF6DD0 - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 083A53D86B1730E8D085701566362692 - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EED206A8C2B2AF933A0177FC335A2906 - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 01B048F32F886A5FE9C382A49C1EA17D - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9DE12A42014C930DCE7478990F07F9BD - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 1DEBB84A3567FC5522BAAF5A93AB51B3 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = -CT = EBC01ABC73B5E238CB247FF3F323E41BD5 - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 00 -CT = 8AC39819909C617D55655DE74FC1874D2A - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 0001 -CT = CD210C6A2C8ECED864245BA56A9EC5A278 - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102 -CT = E0E187D3C25E2759DD9665778A2BE6FD1A - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 00010203 -CT = B100ABF82EC21A701EDEEBF9C2A3ACA47E - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 0001020304 -CT = A4418F5C9A8648BC4B500978492103E116 - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405 -CT = 0A0241218316F0806A04C86790D410063D - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 00010203040506 -CT = 1F9B966F282832CB008BC563F51F43968D - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 0001020304050607 -CT = 35C23359A27D774933BD4ABFD8563C9F51 - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708 -CT = 50F2E047C829B9496136E57EC2BCAB8979 - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 00010203040506070809 -CT = 0BA22A9200392994D5882E0901B2AC2EFB - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A -CT = 99A0A1011563BDAC25D41381B9F2B8DEDB - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B -CT = 5565DC8ECE0C9BA6EB87100EA268468A61 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C -CT = 1B15D301AC820A0F32648A2875055B1870 - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 9D419DD9F098D34059E8479A89D24ED4A8 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = BD33B30E0A43A097AD024B39884EC462F4 - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 4376FCA8FA857C49AE85C03C86435A36BB - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 1954806438A6E374E72A4B91ED193CC90E - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = BE9C0E0B820D729446C65C5685110694B8 - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 4F4398E34D2B4465B003B3A46572E6A85F - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 595B61AABDEAB4CA42E406A68039E894BB - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = A61A82E50762D8F088EB6880603D4063A3 - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 46BB812714ADDBD81900C1C8A4787FA5CC - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 4D9852B71BC8F32C593EE6AC0CB42E88FF - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 34A47A77C5B5DED8889BF0BF49968A7D0C - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8BF4EB3A1C7A0201D6FECC7BE58ACFE85D - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 345A6A090FD643862700644F81157D390A - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2830B86350AD293ECB768D2B889460E0AE - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B9742E4F2F458D80CEEAB1736AEBFA0334 - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = ADE7C96E0D8E0184BF566D102530CE8159 - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = EE4EA7BDAE37B0C5D71ABFD16993914502 - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5F9667359F20BA4A0CA597395914C3694B - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3B8845CB43C83F7DA6E68D6849A8213330 - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = -CT = F7E3DEDA3B4457C57136395E5A569A9A4484 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 00 -CT = 9600FC4E74D4F6D9F6237531B490E5C418B8 - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 0001 -CT = 7DD87D4E932064EB53584FB652B9F3B77870 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102 -CT = A486618FFAF0100C45BC2A29BE092F0841E3 - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 00010203 -CT = 5416109EEACF6859561ABE3FF23CF40D10ED - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 0001020304 -CT = 08C9914E1483EEA075B34DB4C5668C44F672 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405 -CT = 13C6477F72913AE70F5E3FF2463982A48E29 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 00010203040506 -CT = E82B870894A365E2E9DE6F54E512EEEAD5E9 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 0001020304050607 -CT = 82109A70448ADD74A13561B7B0F4D9DE5F67 - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708 -CT = 0D8186BEA5C120A7423B1F0A1DCE29FD9406 - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 00010203040506070809 -CT = A5A57F648C8981C3D45FB501E1027268F748 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A -CT = D804C6EEA31FAA9493DA5F6AFD70A4F843E2 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B -CT = 05DC0470D20D60E9DD998DA0B18198F390AC - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 8912C1D4F66AB22E7B856EE83B19D12C57D7 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = 37E5CF6BF2161671E30EA0E0E96F1A19B33F - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 327F91112E9AFE10F6F3C352C86819137959 - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = 5B712E8D019D4DEA6DF403B230FD8AD42ADA - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = A92BFE32E855A4D8099CCB26CBBE0CFC8576 - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 3CF9592FEBC04FE9C6FD274B786DDF044128 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 8C6324F3A5592BD8CD28AE23AFEA1012D56D - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 60CFAC87D76A451132CE6905B622887ACA4F - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = D48A44F822A1ED337890C82AF4E4D4042C6F - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = EA2F3687CA7DC48EAEA69898184C9EC58A73 - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = ABDC9710D88265D37BE66C38E58BE0316326 - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F990121CD7AFE0FCB41F2D4E5C508964D343 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 375DFFD188611BCAFC08B4C50AE1197EB659 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7A3B2492371B136BE17D15193831D92D1B7A - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F573FE6A020165826390C92E0140EBA79263 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 24985799C5A836F92633242DC621AF7FB0AB - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EAB0F02D90EBA309692459870F0F6F4D7018 - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 5BB3A25375E0C3ED3DA6892D7B3251A99C57 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FCA00C7F7750C08D435F022811876B0DE1CA - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = B2806DA28D20959CDCB65BA461C429D8C243 - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = -CT = FEC0FBEB5FF8D059B594F88430CCBF1A4CD23B - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 00 -CT = 3C0A71F8272FEE08FA82FCBCCCB6E0B7712A49 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 0001 -CT = 6D4B78BE0A1A8B905FF1959B3212A903F7B124 - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102 -CT = D1560105954C9DE52A4611A23CAE5467B6238C - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 00010203 -CT = 249D1EE321F96DD4A9DE8E9B781B534FEE76D8 - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 0001020304 -CT = 05B36C3031EFC3B838EE777C4DFE9924A6F5AC - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405 -CT = D49B835A2B81BFEF6CF731861538BE55961623 - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 00010203040506 -CT = BBF5C8806710282FFB58A2EE0B5E22F3251EA7 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 0001020304050607 -CT = 77D5D63A6E907D5DF7961D8349898B70FF3EC1 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708 -CT = 58BB4F48238794DFAA54BFC54095EBC188CCCF - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 00010203040506070809 -CT = A74B403B73170F7FE146333C8064D4D4C0228F - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A -CT = E8740A872C449251CC245C7E0D968F6C411D17 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B -CT = F22F65CF48B633CB2E63A4BACB0BC97F84FCF8 - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C -CT = DF2C4E9135F4BBB18E820197D4AC0228565F60 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 4088F6A0011DDDC41AEC658B271EBF7E25C67E - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = B58647E376AB5618A59EFA569A049945C21DB1 - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 8AFC094F385073F6AA279B4026AA45A6D4CA26 - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E305085624B4D497642BA5C3F71B0F007B038A - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = FC1C8845AE8295A8FFC362E47C7F175FFA3346 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = D92881DFA216A44486E98ED7EC72915E2F2206 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6F6A28591D98C4F7F5EC92E4639C91DA6E562E - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 19116EC64827A430791519D12399A099538C1C - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C11E4470FE783642F9AA34B75C78BAB4134DB2 - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 50D0DCA7610FE50F88F61821E5999834077AFE - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = BB405922F4DF5C63EE6C553E0F3097242880F2 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 39DAAADD68E486797C0C52DBAA1D279427DDD7 - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A53920D5936B1DC77D1842359A252DC9C7F754 - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = DBCF2763B2ED3F7ED6A01CED874EADE7079E07 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = CEABD933A68FF920E909374B59AE10FEC4A1B5 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8FDDC90AB6BC5A9ADED06DD54F2FB9D1185830 - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 0A2509990951A014515360755F7187784670D5 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 0F227CBBD90DFD94F818727BE8A1E43F9D7537 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6A0D1F037AFAF04A33DFA6438A2A2A7A90B450 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = -CT = B4FA8F91F37828779303ED0FE0010D41052F9B79 - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 00 -CT = D637D6208CEEB5414A1BDAE691AC8E5BBFC9235C - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 0001 -CT = 4A8A819C33F179C61EE57EC45A475C39572633D6 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102 -CT = 6F00F8CBE8CBFE9C134E8E55A2512545544106E3 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 00010203 -CT = B9113889520D15809D6C6420210A432A55A9A5A2 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 0001020304 -CT = 466ABFFB47263F880C8BA1C18A4E95B8C56E1903 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405 -CT = F16BFCDA7DF4964F12C8B354F67136483A3E7E96 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 00010203040506 -CT = F0CE0A5CAB618F6AFC08B6E635C6710432CF59EF - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 0001020304050607 -CT = 236FC7B65A978785F1F7DC3F7CB04EE394290AB6 - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708 -CT = 7B37B944A86801A15D600B3E9C62409A2790AE2E - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 00010203040506070809 -CT = BCBA5F792A9710C4BEB11DA0EC7972A0C14DD60D - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A -CT = B061799D1829BDA5C2C8AF33F64F2D6299F2B11C - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B -CT = C7ED3CBAC96E85448F7C76619395E5FE7F997586 - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 1899F6444E58E181F38F600FCC362835DEC71D4B - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = FB6388D2E0B6349EEE08AFD62EF0BA4B3BABE44C - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = 65B119A7379D66A903B5BE678A0845269FE69ABA - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = C22D675BA07E82D764CD36E3915B924E502E8E97 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 605E1B679AB32BDC3984FA600F39090E7F80B6B7 - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2F3CF210A470573A60961E0833B69469A6D22A52 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 99AFC5DCBDB25E2923F4AB60E79B8CDD411D789F - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5A79AA952918B6A83EB475892CEF0419F8C5565C - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = A6A09A2C4037CCB57308CD125F892DFDA404D110 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 880D7BF988D01D700F17511FF30AF365978A99AD - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = F41FF499B5951673F0F567F0B0549DA0DF87E7F6 - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 72BBC396914050BCD750A47E3C6CD78BF843B0E2 - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 10864A611BB66FF41BCFEF6F35B63A8FFCC87EDE - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7AD56240A8678EB5CEFF3D7EFB0A1BEAEDB4313E - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A42E50DCA8AB7A4FE931D289E9C7C4B42F592BEB - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 522F6A637E1527B572506389B03A00C087C2EC64 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 05486E81285AE22CE3B0A67013FB2C824215DE60 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = DA9DAB7F8BE9FFAAFD11D6CD63554DBA987530DE - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 3FA20993A855D160C7CEF18E875350A66AD47260 - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3A2A6A9E165D16751E5A43F11C8E2FD6FF0ECA79 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = -CT = 8ED11021278F4A1912D82C67159393E9369883624B - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 00 -CT = B7772FC5A677C32E0DC4416383C8B5181EC5C34C1F - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 0001 -CT = 604ED35E48F5976F7286FFAF58F23D108D4C5304E9 - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102 -CT = CA14074D2D09F533B973EFF7A67911AE678715BB5F - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 00010203 -CT = 97E4FB4EB9D7539332CCF37D69FEBB772DDE3F20BC - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 0001020304 -CT = BFAAE2759DC25B3142C757F0C4E13FA01BD7B7D07D - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405 -CT = 8C0BD9E1CD3338B9A9C47F5CD7A81BF1CC810EAB11 - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 00010203040506 -CT = C52C85F1F22871114F4D2D37D525C0F464382E9263 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 0001020304050607 -CT = 9A7E44ADF94B62B7A6A93FCF05C297D1553F0959BE - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708 -CT = DC2B8F5565B1E36CEAB464E25817AD8A241FC23B76 - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 00010203040506070809 -CT = 9794EA2703C8A91642B327BCF8DE9A1544EAE06148 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A -CT = B74CB8DEE7DA36AD6318DE711DAC234F7E97893F8C - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B -CT = C6DFC377DE68E7D97016B1893B8D0B3F0D8DB7E2BD - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = D67896CFE19A75AE6BBCCE49163C9EC673B5CAE8B9 - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = 8953C4201F0FB8619686A597B1479FCCF24323D2B5 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = BC8DB36D2A7250FD38447D943D30CBBFF4B8750D66 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 0D05C52EC02AA45C97ACC1F32D41FB4EA2D5CF4690 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = AEE361AEBF0A912DB1C291BD5DA3B5DDC0008DB966 - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = AF08E040137BC0F331490C42BA17BB5F48959C934B - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A024B025DA2E7A3E0D43286E7025CC0B8CB0EA98DE - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 7941FC3CD9D3579AA9C19A2C7CF6870A96AC80F021 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = FCD1BDB0F3D6D51935A5DD3E18B9ED2925FBF64F3A - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7C8AF64FEB6DA929C771AFE8CE3D1163246F4832FE - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C6A52135301D76529F2BD50460368467D107605A8E - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 22E62A6FC5BC05E0B89B37EBB23C2466434F83A8D0 - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = FCA24CBF402EC920B1B36D66CF843B165A0CCF9096 - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2AA927123636B9989744ECDDC8BCE9D7472996B706 - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C43E27CE37402DA338631EFB425D90B5830334685C - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = AE7BF1B81C2944F146D4E52D91EEAE7BE11782BC63 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 0BF8771472150B6A9869E18547E1D32B0474E7A056 - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = AE79BD19683C3EB0DBC45F2E12BC3547D6488090DF - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 45206B1D4101DD448C9AA2CEF825BF826579449F25 - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C134FA9C0387E9A582FCD188F30BC1B98AA25A9403 - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = -CT = 262A8EC2DBC9F2484989C138593C56C5800B6F70B9DA - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 00 -CT = 0A2D59D4891ECA1AAAC886A6102B822F28631EBF23C0 - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 0001 -CT = 830389499F63AE596FD4D7ABB7EBC4895BE23834E86D - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102 -CT = BDA34695791EFCB6A61BE84DF28B9306CDA210EC611F - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 00010203 -CT = 4D1F93F18589774ACFC1DDC5DE3BAC70C61FF4052E26 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 0001020304 -CT = BA15BFABB64DE165D3192FFA2D70ABE48577054DE906 - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405 -CT = 121B3075E32CC837A79A712520E72248D22647BC7596 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 00010203040506 -CT = 73EED497E4730AE9CEBE917E375A8C202E3CA57B0E7A - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 0001020304050607 -CT = 171E198646AF7766DDE073175B452961C68957748A32 - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708 -CT = 58E12EAFDA25D76E66B4F5FEFFF7BAF567C4C782CEB3 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 00010203040506070809 -CT = B9A5234A52625510E1F2919190D0A9E793A29CC43968 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A -CT = 58C0FBDE203CAA4E3C22D16C31172EEC3BBAB4707EF8 - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B -CT = 0DE579839DB01BE15545DB056D0B1FA0AB18DC5D339D - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = C94A6979B02563B80C6805C8A935FEAE77486A3D0FBB - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 5239BE7351C4AFAA397027C8CFBC32646CFDB89C055E - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = C6C1C026E99E48821A708AE33D44A65ECC9147578E9E - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = DD92B770A9F4270D3FBA16610C1741A99B6DA044FE50 - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4958D9423E0C5CEFD0D7B1579B5D0900FAD864859E51 - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5041C91CAAE35C6A9A4FC4625F09565BF5C5054ADB9F - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 13B1081F194E75275745E2D40EFC0279613699735366 - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 2662D8A1621EFAB5636592BF6553E667DEF9B3E8A0CC - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = C5418F1235FB2FC06770CD9F1A16E3E7844C02D87981 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 77728B453C8753DB13DD570E6E8EECF2435E043C1AEA - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = BB6CB0AC815EF4173A3FD65B9088E4D9019BAC45DE10 - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3EA643E375170D10C937B133C93B9F5AC5163F2637B4 - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = D0B67BA943036B99CF0BC6F02A1C2DDE2DA409A9143C - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF495B77B89CAC9865ACF760CD208FF3C8DCC65EBFDB - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 72934637CCE6C015D517AC38D7DB3224B39DDEEF8F34 - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 0F780C5ABA285773B04EEA9F0CD44145B15047F7AE1D - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8EB997D47228889C1023BA1879C768B9F74D8AB2EA5F - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 315F399BBB9FC77D09184B85EACDAA9782F8377AF7D0 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 7E9D988D8E075BB3DB14235BB5E3C91059541CC659BA - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = DA592246F421721EE039E3DCEC49FD93818D205A45E6 - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = -CT = BD9FD1DE276BE8958017AE79F031689B93C9AB58B78A90 - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 00 -CT = 5A1302A7F89D101D225836056ED710B2B50E4D60A72537 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 0001 -CT = 96768681AEB949D18F57EE07E5F6200F88CFD2EC62F995 - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102 -CT = 6B16D6465A18FD8C65E1971A952A47866571D676395C2E - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 00010203 -CT = FF823E81422230118D9B2CFFFEE220BE6C8F55EA1C66E4 - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 0001020304 -CT = C30CDB7F411B4543AB2842C2D8C16A284BD7E04661CFBD - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405 -CT = 2672A2ED477DD6498A507C46A30B10F6C54320A2FF37E6 - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 00010203040506 -CT = 360A88F239B6541FBB3E0C6067BFB20570F3F053923BAF - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 0001020304050607 -CT = 0DC9400077D8532B80F7B02178E86EFBBD733EDB8700B2 - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708 -CT = E87E4017629911E2FABC320BC82A170E3D4AC262B25DA8 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 00010203040506070809 -CT = 86C9687C27BF57310F5C60534C8EF3DEAE58A0872FE471 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A -CT = 055C885179A78EE0851B16823A14E68EF8633DD51B51D7 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = C8F8EC4A1240570BE0665F3E0D917BAAFD254525982869 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 42B3EEBA9CAD6B9E40EF5936AD7B231ECBA9A8324597AF - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = 0E8D7B3BDA922C25F43C6115439371E1DC24AD8109A5CC - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = 4C572BBD896777DD1E2D8416C498801E6FA44853FC2E5F - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = C4E7D204A262DEA17B6758091502F4FBF9A7138728F9B1 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 63D73FB2C73C858036B97F1921A25BD6005FF07B90DDAE - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D80A978B52D038F0FF328B6372A4939A3F36BBEA4B7CD8 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E871AA208B3FF58AA59EC9143B89585951FCEDEBEB2444 - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 39E8F4F9B41E924161649102362E8A67002DD8C93DD2B0 - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 40A803CA43CCA5CDE462E1D1C96E58715393F55347C43F - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 561CAFF5431E745EAABD50F1702A1C402CD4051B82EFC0 - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5419C56D669BCB214CDD30802C827AB34AA5FF259DB410 - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = C3E97220EAFFE74520E89E0D1A3C208B6040F14A047B4E - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BF41F3D03EBDF9BA28D03774D0D17EC176D20AA57BD013 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A26E7359B5AE3AA9F0D8BFC64D475FC4C3CD86A1C34B74 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3022551BDE56B5837F8F8B2382F0318F2C3F5BAF634C73 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 05E8ECC6AC1E4DEB2938CD75644BB1CB9A256878A3569F - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C81E9D52B4BCC5B0D95CA168E2315FD6F922B09405B333 - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E31D448C301ABEB4121731E7344E97BD486917E53AAE24 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1E7E47DC02FAA26CC21E31168F847061D5D3A9FA1CF05F - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 459B8D92AF4BE076CCB6E2784D2022FB08ADFD5604F7FB - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = -CT = 392DE479F923BBF2BE90AA43A42992508C11E6DACEB3792B - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 00 -CT = C7385992756B0941780D505F2B07A0F661CF958A119CFFC3 - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 0001 -CT = 178D967ED3EE33076E8460A26AE4759A674F52D0A5ADC0CC - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102 -CT = 003F305B34943DCBB71A96F2A2DC882404ED4BC04E7C9C03 - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 00010203 -CT = 4C3F642C9A82F11A01F7B44F1B6297FEED80FC8762198935 - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 0001020304 -CT = 508378355F3D78841C19F11E94C3EE268AC87ABD0365AD11 - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405 -CT = 4BF76061B5F1E5E667208D202E91FD4B7499B4880D8FD8CF - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 00010203040506 -CT = 5A82ECFA8AAAE202AC71A0EA45A8CA17B725EA365DE8589D - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 0001020304050607 -CT = A1C01FB8DAAAEC42DC702AC183788AECA12C4548A99B9166 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708 -CT = C691624B5405F091E1EEB57B6601893906851D451E0C513B - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 00010203040506070809 -CT = 0042ABD5428C3140E576A9636434AE5001D2A07EB3CC31CA - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A -CT = 0EC7666BB676B97C5C235BB28C3FD499001F3C8B44ACEC5C - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = DC8367E5B86DB9F29FD41945C6A9B96453D726CBFDACF4B5 - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = B710E7AFF979B2B453E3CD89DB641EA59231B0B02AF10AB4 - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = CDB5530D51CA36D708BC23E481FBCC735407E43F92514248 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = 50C04EF5031D1EED16BCC0D5BAD3A1666C0061C1E2C669FF - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = 5B5CF498754B9904DC7E30881BA5D95EB20E820429E3D9F3 - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 9DDEB7A26BB8A7E1DA9D646DCBE9D2F5CA91CF9EACB3B94B - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 020319668478D8D85AFAA2EB3572F7F8211FE976868B9270 - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = AC8357E9FCF4188A8BCB26BAAD091F341741EA2C375D9071 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 00C57017B707074890AB73F1BCE193679CE00706529E7F1A - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 10291ECD0C8A8144497D30CE4352E48FC8E7D004905E306E - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E0670F226A4C633AA64C6ECC4C36F960174ED3A8477623E4 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 265BBED8E53A7502FB82C2FC1563EB92F4BE13DCD9D88C8A - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 2135DA8AF13647EA915C13D2C10C0A0600FF0DE4EC626FA5 - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B78C996BA7527861538BABD54D37A8C385A5ADCD44C74F7A - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 6C6AF0D742674730E1E399E342F02804B450B17F15BE515B - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 9827C05444BECB50F23F7F275C8716E227C2CB63CCEE2823 - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 741D4F953AD471763D3AD6D3B31200D61502B24F52E369FD - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3CDF17AE0F527791388CF606437B443746453E63D4C51FE8 - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 486E386107D673CCBBE2DB3D3DFFEA5E24911862D8733641 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 10CAC800D151C505F37ED9BDA08F261274AEDDA67B3EF34F - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = FAA3BD3BE203A248E0073A86FB4F4AD498DD210AD989E333 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = -CT = FE17058F2A280F3B825CA0BCDF0FC7B6701F0C5558E5EF3A07 - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 00 -CT = 1904AEA99F647E11F0A9717D26202C372919332CC37B36D5B4 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 0001 -CT = BA08C77F82ED78F7DEED71061C794E4EDB30923B84F3E610F5 - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102 -CT = 56C177A9EF9315EF21C6B25329F5FF9ED19DF9052FB717376F - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 00010203 -CT = 8C51EEBC5BC59C649CA36BA2EF05818E4CE480C8F13E52F8BD - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 0001020304 -CT = 04314B2BBECE44F1AC38B1C694F2B3936A875C017616C30C9A - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405 -CT = 4F3D6FA083E5749E808FC855C6F9958EF3E098AC5708041BA9 - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 00010203040506 -CT = BBB8FE533F485B22D7CF57F124AADAA1F7D12B6E424D30C74C - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 0001020304050607 -CT = 4C87BD22634199B6891C01F4C06FBF50D3423321DDD2687359 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708 -CT = 6A19969E3E48818E1F4A5D500A6A92773EE86EBEDD45922344 - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 5B8963C4841C663D751B32C9061973309AA2D88BE2B5C25FDD - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A -CT = B9C33C759633185703EE44FB6F017F0D3DA20EFCC2F10073BD - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = D2C7641451A5EC131B6DB243B2D15DB9A2A7F5F10F2E955AB3 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = 12CC40EBB1E7AF35CADEB03857213EC03E0D783A8D40FDFA2A - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 4CD35BBDC096959459650F7E71BC95A94C959800D69B8942BC - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = CFA04361340A788C07E4E1417EADF6177CA1C9009553FD64CF - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = F69454E8DC2D2FE8F9DB068D56C22F7E36526193F99B478274 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 57A0C4D95B1F8ED69C9AF408C535ECAF929095970D828EC7A9 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 955C4DCA956E2ACA8DC5377F7FC75EE4E7738A4102565EBBE5 - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 918EAC36D7063ED13B3DDAD7D432D6514603BA01B78D05690C - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 87A603EBA5B7509F74224F87255A9B492552C74CB5B46E9228 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = A6E0ED562C845518E1BEEBF29472A5194DB1DD00B73FC2C701 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 2E73FC49E4B116462D82223FCF82943F9E2D7AA13E07AC49EC - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = D254111A0323ACE3F5EF2F6B5C28690D3DF73C58BC0E54874C - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 6BB047A83F7655B2F24CCF8A49B6BF96C80A50CAEF88C8875F - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 4B1E36CE8CC9B560AC8E163BD5AE6143C9E17885D23CDEC00E - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 4436D98CB6D76447C2B5EDEB87BBA1893CD9173E4D7E14AC13 - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3D533A7AA7AAD9110DA25EF6E93360E4E1592C29BC49AA5376 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1FD06BF7658BF642DBEF2FF030AD506E87C6E4425828B7F508 - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 6476CF09DDCA018375642CAFD8F2DDA8212FE212533B07C271 - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6B2AC4DCC3A9267EF3AFC8276FB1E65FE3CE4CCDC5AE393951 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 37EE2B2CC1E32934688C5C5030C9354A221AA366019542576F - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 7FA3670F49F84CE0169894BD836C392C4BFF2E89C07802A070 - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = -CT = 261CE91ADA6CD6B5032785C011617DC4D91873683ABA663857ED - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 00 -CT = A1D8275B9D7F86380411C704AF7CDC65DD15320885E1FB466AD1 - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 0001 -CT = A1A75F7608DC1F85ABFC6FDAD323EB604827067A32C6D03EEFC9 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102 -CT = 457BAB6054218892F26A27F188B9DE6BF4963EC69573006B6D62 - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 00010203 -CT = 6574961BE3FB267106452F3194F755335745E134C4ADCED6391C - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 0001020304 -CT = B550893A0B2178A1B918C390CB7D5EF262BCABAB13CAB9026351 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405 -CT = 64A037247C7ABE130C2D4639BFE1E1DAC179227831A375317D1C - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 00010203040506 -CT = 955E7F66E0E85639C98E38260A95334AC601717E92513AA6381A - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 0001020304050607 -CT = D3F4AD9BA7D8BD1D51FA04FA9CE908B029233D84DA810BFE7E70 - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708 -CT = B379E4EFBFC36215DD0E3A431356D05F8F5FC59BA0549430AAA2 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = CF4AD2CB1380DB856CC1151E06809A53F211A079DC336A69A94B - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = 736251912EE55EDE349C8BA52481B17522D28A9DC729F935F598 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = C965DE705E275B9F0B204EBCF00F7CE6FC4D4B5C833850A2305E - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = 05921BC2F590F9BE631C2EFF2F02F0AF3707D415D1DEA21D3B38 - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = D413A3769DF79144FF71BD84F543541D7ED0860BDAB8F063619F - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = 2DC3C8976C945F4C12B48CF1437C74711DD673D09CC3100553EA - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 1B8FA46A5E335738BE7A1A07C0B0F4821409596A20521072EFFB - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 239E3EA28D15007B49EA72CD964947365513440F64DBC48FDA69 - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E7165F6D3B7C4036431971A80C088B54D1B1677AC1E7FA1EE7EB - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 1B7F932857FD335BB75A35F7990139F9D276E2B5DAC95017A690 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 020B2FD974824A80E817A05FC365924C30979D42F7F94C4044DD - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1693B804DFA3EFA3FDC4365F06922A0CFA8F60C2DDED362A5F03 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7E50E79A46AACC5C968B541C8109B2DC4798503A7EC4A6A84DDD - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 0967D1AC794F65F3DEB6EA59A3B9FB071DFC27B80D915F883A0B - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 8803F081661E3CFB8E68DE1D713A6680DB707E7237C208BBDF96 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = E57B00FEFF3777721991C6A596E88D0408294B2F62B4A7B27C9C - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = E4FAE3E81003F37F81AA70D34EA4B1BD6C73D344E268BEEC9A5A - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B44E90B55AE64ABB938ADDC4C7E8C52513389C19D6CA90C23F6E - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = D3B276381BECDF0AFDAEBFC38E7BBE3195B66C457A0BAE3224F6 - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 456140EC057BB2242FF0D28E2D547D1135B3D162F546633A143F - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 4D3B384594722288A79072C3B46EE8A31B2674FAFCAD65A722D1 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = A1F0762601D1A2F3E1F0A1AD36F5C2BD121F72A09FDCEE140862 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 998FA0052E0F11E66D07645B4EF44ED0E75095BC2AA29058B2F9 - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = -CT = CDCBAFDE5B06DB22ADD8072AB4B631660A0C8BF66D40D09937C5C0 - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 00 -CT = 6DA34AF117CCBD07756F006D5E611EC98EEE48DC5BC27E431898B5 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 0001 -CT = 0FD627EE0979258D8F67CC9B139F3777F6D406FD5BA7D09FAE4FB7 - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102 -CT = 391A7B3953DE2FE4ED15869BC549DFDF4102B66796CB704D0B52E6 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 00010203 -CT = D8593E1F67FC6D5AC2044FBE7BDE2158FF6EF967B08D43D2F438B0 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 0001020304 -CT = DAF6633863D3C12EF78BE5BE4C18E6889CF0AA04EDEF890B2FBB75 - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405 -CT = C322A2529EB181C28B997643D8B7B5A6482762154CA101EFF814E3 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 00010203040506 -CT = 880609570BFFC8DE609521A176626AF75BD8DDAE1DB79005442618 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 0001020304050607 -CT = AF61E43D959A82E9C475C4F5367588ED994BF5A05653D3EFAA364A - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708 -CT = 78659083D78DC6E992D982C13EC9106457B4785B58DAB0585FEE41 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = 07D01C349ABC5C55EE3BF6C6A1A23CDE8DE8F96E1D17F5C84B6B17 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = C1A87DEEE73AEEECB81520218099A8A8E1C2BCF3C9ADFD136A907A - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = 8B522E47903479077A369147E1E5081E5F56324DC38E55877F59E6 - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = D5B0C80B18DA0E419CC96F077C26B6267B6234C30C21BB1650E954 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = BB0A439075EA5350D823484718262953B80B1F144A3F5CC13C2039 - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 138844F81B6A5B4774C8EC77FC3290C196381B80B55266BCDB17B1 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = D1300BC00C75857504F3FAFB2ECFD8D81E58458F62D79AA9F34B7C - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 86BA2FB166CA981ECA3F1F51C93F20780C246801059512F71AE771 - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 97400EC1B990A73E0A64856B6532A359D86570A05A25B69575C49E - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 45370C2BADDEC73B0878531F0CFFF855AFB907593520CB8028E2C6 - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6C83C4A86BF3600630074F5E7FA9974B5078A2CDFE52DC151BA366 - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3423080B3610583A33902E14F2D07FEB1EF95AFEE663B8D04F6A58 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FA9092B2CA39036830D184CFA75C691EAF13AEC5BA70CD1A1BF7E0 - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = CAE48DB0B5C78346D7D84C24825D73DA90CE7E90F2FA934650F876 - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3697FB3B52595781BE90FB4D1179CBE02D9F42610C60A39018EB77 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 1C460110539BC96CC6324B663519C82A03B96F3624CBBF86386387 - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D4DA6EC86F16AD4862C610A474F6A2A9C1308E27150D8FA5DDF77B - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 880711D59FF3CD1F68D9FD9A80C76DAD7A349ADE8A3C18B2991140 - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BAB07638753EE0F978B461205E9346FD8D4516D67ACE857212366D - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 707CE0A8312B2C215C0A29A9645667ACB71D5C2442AAAEFAC1769E - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = D790C2DC43B72E856C038D89B09D78865C149EA12BE3E1E34A80E2 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8BA960A88D7CAB81872DDCDC4788782967237124EE3238B1A9AE4B - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F457F14BABB9B877A833FCE9476B0AF56966415CE8E11F182603EE - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = -CT = 41D740BF4C5E055FD85BC1683417F0BEF0F5E4CE34F172A9F383EF7A - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 00 -CT = 364E08BE2EDD4D1A3F6BB2D89DC7E3AA263C7C6EB3EBFC545A096599 - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 0001 -CT = 7B859A5800E5E5FD193124FA9C50B72CB009BB3F6A46DB83BFF78B89 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102 -CT = 3D13AB80ABC10108B3DBA9C1715D2C1D533231CC4AE475AFE9441E7B - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 00010203 -CT = 8E28112AE91292D72F592605E35CC0B763994D846D49AEDEF185AE3E - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 0001020304 -CT = CF292137ED883B2DCA0F128B82DBC508245578DF5922ED049D077DE0 - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 328DECBD23656680C73805D0413FD59E3E6D41AF62392080B13737E4 - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = 3BBDA2DAEF4576488D9E6ABE335A2FFEEEC3864914E80C82D720A974 - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = CE250C76543E0CFAD241989EB88FCD0B48C80716AFEBDD7BE24891DD - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = FE2422E65FAF944C26E971F1D8D7C0155DC847D1D35DB3ACC5A182F2 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = B75AD166632194D65E9C24C5532B2A034084F528DCD4030B70137BD6 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = 7DC70ED7D8DA8321FFCD4E34831622BE356E667AE8024E2EEFC73ED8 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = 399A503CB7E9E6BB2B00AD2FCC6F5A5A7799C16B690F5C41365B98CA - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = 7A54444DBC754706E8A26F68242B6B0EB9A3E1E24E195DD4ACC065E3 - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = D640DA475E72FBBA2B1FE0E9CA395BC1C3BB73EAA0050CC631783B07 - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = 3CAE1FCD7B39FD70CB16ADDFAEF5F2EF24A1EF1C98E318D5BC381C38 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = F9B536FC7A4D3528417AEF1A7D296AD7C0A0439F74F9895B9CC0EADE - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8E1437FFA186AE58BB8D983DED99CD6780525CDAD2C148CD7E314A55 - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E632C26E1F2E2E8CF92DEB8E301BAB3AE08690B11AA3601405212546 - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = C88F7763108F3CF1EAD1435FCB26FA41866D4C3F29D92EA089C23885 - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B71A8B022B0CB4A43DC1871823398A91B1CAAD54F0C4BC9D3573E0C8 - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1180779720D48F3D312AD49F5CED23659A425A2F516AF9C5F9FC6C59 - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 71C08D422E55AA954B7140086C4D4CABDD9F268982CC07E1DC24CD14 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = EFEBB052E2210BD451F806F18435C64ADC42EABCCFCE7E432CE72492 - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 45F556A29FC22FD5DD9FF74B05EB803D6DAE56DDBAE6CDADEF07BAAF - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = F8957CB3134F04771F07EB9416F171C9711770D03DD8CC405F218826 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B41708B7E77B47F350633F0989A7F1E746327145C92F4D5CDE70FE0E - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BE505FC57563E0D7E67A7FC7830DE81A5612F100689D63E6945633A1 - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E5D6ED040A887748E03A54C6F1D5B4B7AF6DFD8E66C9F86A8EDE6285 - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 22CB1FFD080591343E7E76DBF2936B50951BA00CB2210223D5C31300 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B856BD19CA1CF88C9B3B0256EA4D77CD57C9726842CE6278BEA1F5D8 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FBFE443C49687C4F52D409C48FF1C7CE8664F808BA8019924A6FB873 - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D4F1F7B639EF41ABF3C3F355217501B9594CE64784C74A5242E6917A - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = -CT = BD0FDBC65B384927C2D55CB94712634D0027CE186CFB26D27680BE21CD - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 00 -CT = 97BD6776CA5895CEA08DBDC646FCF88261C73891D8B7FAE5B8DC7C08B5 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 0001 -CT = C14DC2FB7CF0023BCAF70150AC33947E12BCF8C7CC67E1853FAD6CFE66 - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102 -CT = B7C1DD0D715F658756EBBD25284F187C6D6968F8D21A0C14DB6567DEC8 - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = A51C48D597FF44240D2EB36170D7E1A18FD5CE46594AD770401000ECAD - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = E52D84E9674A046C788EF137BC98FF6C2221525CCBB4A80683089D8D22 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 7F3A7A10CDFE58A8046A738E220F6379EC739465E76EA34A54D78FF793 - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = C67D644C39B896031633C774F609049434F29E734127467F62A67D9ACB - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = 206BF350AE44147E1833C317D0784BD67AD6708E1C1A8616AF442D14B0 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 6A6688DE47B8E5558095C9E4E58E218D80A187FF507AB6B8F802EEED98 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 2675CA29902AC64A22EAF66710929B3ED4E32D05006441763EAEF4B53A - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = 55B3BAEE8EB0A119A57DC444A99C4920C74E890BD82B3519C7CA48B0E9 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = CE7475AFB9CD48D6078E3075D3FBB9CB1D3D9A061EB2B169F5E0BF061D - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = EF0CDCAE02A4A09603A5519396F8B60AC92EA2F9310B5F71E48DF929E8 - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = DFAD37C9148CDB25291139D8C0D626DB79B9417B9906D38BD5BE8E33C3 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = A563CE0904CCA0ECBC990089285B729B912C0336067613FCB83CEC815B - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = C45CC75B088AA40996DD63684A68609D9F030B5087E797D45723A1E079 - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 43858D0961B9A95EE8833C6EED2647DDED95D7186553F0C590C07EC28E - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 864426F9CCD42825ECC5F081FBED95D1D3B6918E2B1CC7CD4F23FB4322 - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B4DDB00AB25C88EE2FE390D656257E210AAAA3E7F0D1EA1C31F81A1B49 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6C0F90D1C72E6345CBB97DECBD1FB928B1220FACEBC74C40BCF8DD8BDD - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3E049F76F81A6655F6989412035DAE3A1E246C610B5525C048259EA156 - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 49E8356227D78528030CB487688B38094E92D33C4B47AA88FE9A755088 - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E2A717968BD17EEEDCC940292A0341952F3ABD270FCB20EEE31B6BFF4B - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0288BEC24403DD76670CDA1FE97FC475D8742FC80DDFE9C330C8A4E9FE - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = C76E285A031802C795FC64E21EBD05B51B9CA35C89153077738741479E - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = BC0D3171AA82C26A8B68225CEBD5E153C4C0A5BE237B66772182C632BE - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E70A1F9DF72846C075A79A19FDB126AC23179471E8DF03B19F39E47C5 - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5DF78989C2B35A945793AE4C833C2639B45E945513DE05CDF38456D340 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 01A7485B8365DF929D79F32B84951C0270FA8FCF3230D13E0F9F62F331 - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 73A9C4282AA40D2ACD706D90239B5490AE6D03B22E901165ABD9154C9E - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 6C5F3D0FFA3653C11ACCF29EE7C6D0EE6B2C319CF56596A8F13A72A430 - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = B346C1181B303FADAC2848C88663C3271954724E1A6993B173F77ED9BD - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = -CT = 0A2D84825B90C0F6F516483B9BF50D7CF58B5DA73AA1C246170CE8CA9E89 - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 89D85D42B382B5DE97D1F2AD54167BC828F78D80C8F7D453679B566B7BEF - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = 3D8A8FDE28C9726B15D14D17F0704C9165C784DFE321641274BF59BFED2F - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = B6AECAEA2AB8CFCC2F159301AA8D00A8A1A5EA48CD777C3AA53D75106A64 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = 4FA5054EF07E3F56DFF87B08640EDEFABF4393267FD1A89AEDCBD0881ADD - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = 0F76E5BDA60E0CB584BFB711BD44ECB558EE667EEF275A2D55B27D7FBA73 - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 6B877B5580FBE80C7BFD8BC5AC796DBA9CF8466CB476A8FF1CFD9CB33DFA - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = 139229906D6427562B22993648D2ABF07C058A740987CF38AFEEAFDE67F1 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = 9375AA915A7311B8EAFB0D99163E6C1544510AF15F6498CF8E16D871A5BA - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = 0522F205D1CF03358F1CDD2DCEDCBE03E0D9B337A6FA024B4ED43346824A - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = DB69A8605EAB462AB92DEB217374D01254C3FA541C6E4C9BA57712D524E2 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = E96C360DD9EFCDAEEF85238F69D5375A212B4B8F36E609C2631ADF729B80 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = E514CDC5DDA6A2C3340C5B75C58338A0C3778488A3ED2B07DB82F4406E54 - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = 9F3A0EF76548618A3985F8571706A2FB67EDC0B0282B5823655F176A8395 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = 3D263ED80AB17C745D7E65FC9C53F70E92CF742884BA9F5B622DB24809A2 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = 6BA0F6F2337DACE79BB83EDB6F7C22CD1F069C6D6554EE2235315DF7AAB6 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = D177AD00B721DF7F8848A1C365D62489BCF824D65B33F22D77E7BA44F5E0 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 47AFF604553CC912E595BDE1CEC50571D592ED06F2A9AB2391D77B434FC8 - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 554D582E4FA812AF0A2412681A524259505BD15B39C2AC937ABDDE7B7618 - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = FD2D3CA5F798CBF7B5D766662DAB730F7E86035B1B1556F97A98C408F10B - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 119622E007B41F53F7D063407766EBBAF42B45B3185FF2413842703E8EDE - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = E867DB2A0C0F8B6E83EE4B0A449869B6B8089743B78E5AF3FBC905BEBD07 - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DF04118BADD93AD1446813D329E1803F318A59E721B6417833D2E9AFA7A5 - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 42FBE0C07784EB37382AE0B8EDB5F7A094F827D50546EE7E426D253177EE - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 9E4B035F9533116CFF33B1D73B8042D2223C616F35C06977CD03B5D49A54 - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = ED92D44018A66AF5515608896CA33799843A024589CE402441281D45067B - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 58AA99CCAAC0DA6936FAE23591202E4361621EB443386EDBFC8CCFC5A8A0 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B00A33AB661EBED7D00B8D580CF33F1D76C8EF09645B02CD13013F07156F - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 7BB469E1BCC6441E21A87D2D2B60CF0EBF96E77BE4E63A4606FA2CF02070 - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 3669AB9073DED8B9B01C24658457A454EFBD73B1952739D47CB4FD766C06 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = DD1130C0228BE02F7D10AE893DE0553E85E298F2D9537E4DEB64A4FB84AA - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = BC34FB575D66E2ACE1FB00A36B985B97253BA0D3B6E1A55E1A73EB3ACB52 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 07FEB3C34A101F7A7A762B9929E169DCC3F1AAD65A7FCCFA78662846574E - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 69E09E2A7EB07649E4CC38E55D6A6724828204A438A3DAFAC8946710EAB055 - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = 267052C5DAAE03443751483966D76BA4ABDDA9099CDCBA08BD90AA2538093A - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = 0FBA0DFEE4703F46078165E29016184D7E44415C45BD43E0255FDA7CF7F33D - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = 6685BFE416D8725694EBB46CB8819ECDC7A0076525D50271BB7E782BECE423 - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = 8695B336CE1E70E411C94AA359882F682FD4674C1725394BA46FEB4311CC2E - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 6219481F20FD1AEC40E3C3C13B97C409464B7B28633590829116E45334A4C5 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 2FEB727253583F980B5F373F0D6F4226363348CA5EE96D796DEEA1BC43DF0F - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = 84DD3E51EFCB755D66FBF453EA52EDA4A227FC59CA254274BA676B67C370A4 - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = BA0949AB75B7627C9CF0762C602BF41D923CC2BDCC0D992FB6E96D96225D14 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = 21E79FD030560878482C12A34E82AADB4F2A3A2FE9F222BE771195294CAD2F - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = 83E21B5F3D69FE9364101C729B699CCCDE4804FCCA0BB2D6623A8BF1A91A59 - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = D2D12E48B5D028473C9E99581E1B73D4798465C87176CE03499E7E5C8424B6 - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = D9BFCF49B068A8F575896C2508A23B85B9DD98DB6B631C3F362F19FA6B70FB - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 9719AAA7E46B8B262F7F4873E3D0CBFAF12473A3EF54EFBC8ED71913CE8192 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 872296B635CBEEC0D784BB1D19FEAFBAA08C8771A7323D2568052F246C1278 - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = 624C6FC687261B85BEC8A9B7508005CF66F0B4FEB25BB1C468C7216232BE18 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 516AA26190B32667DDA2A3323470FC3848F36CF2618CABA3AB72A6432C28CB - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6D2594B0B37D008205A023AB44614CA8A7A4511FE4545DDE91E8919105D083 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7348B16B302C4F5590B437C4E87E1F96193766115F85E2C6DD17CCEF3BB89A - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = F7ECEE9D91E5A3A3B5D109A78C2D74E6686B448E2A2A275FA46A9B31323C97 - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = AB9B9669B0A080ED0069C44C85403F232E3D635D7FC2378B634DAB42F07FFE - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5CFE31F9F45E63D7A7BB2AC9912AC58143F2D06D1EB262DBB04FFFE6286FA0 - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = CBC0D4DD34CCAB9E2B13552E888E6191F8BEF37F4E83BA133EDC9AA728E1A7 - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3F4E850987DC09540E90DD05E748F8FB76BBC7961F4029D03117837B2359C9 - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A4964D6996B5EF7385CEB599C093F5206287F9658E5C24C300F509990BA17A - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 898020371D526E95689D07B7467647AC74CBB6BE629294214DB7CBEEDBA604 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = BCDCD0B92B4CBA9EA82A6C7EDE2D2FFA0518B55BB307B3D1F7E8D07B27F674 - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3F11135B47872AEDC35BB909E24E9366491EC3F3334E0A0937CC3A1007E7EB - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 3C9FA0B080B20917125FACF5D903F05CCD4A82CAFA8576A6EADD4997F4BC72 - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 052A1819D59B00D42E8A48CBABE14EA3DCAD1782B71DA53CD5FFA93D31B32C - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B0C046991D6B1F72D99CBFB8961684CD799BE3BB4D48A4ADCAC6565F8F44AB - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9655A916763AC94CDE33AF2A6B8C248B3DD91AAF8E79A2D120F77446EE6F2A - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 37563CCC4CEF0EEA0B8691571C3FC44756D51136C7122EDAEDD59EE004B6BB - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 5435ABB95C58DF4D12D2D9DA05D064C072EF426A153D8B006D04DBB90CC3673B - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 247468EA7740FB5B8A2E3DE62EB74B2CB1A4E020C9471FC6E7FB5D76701E84DC - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = E814FB6CD74A0B77D79BA1A727C0F7D4756EE0DA55B4FDF8B1A7B4FCFF5E4C2A - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = 3D0EE275B43BD6A12B416C55185E811A9CCE8B6F3262579E052454C414C41401 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = 07E7B80B9370635193AE4160543F6D68765E7266E59BE3EC2FABBF99B147F3AC - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = 2C7BFAD8B94C12A422CF26D496D08ED926C2D67EA679687111B5AF9C6921D29C - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 603DFC4643B877D7CF592729235C0F25AC37BC5EA75196A06924E8E00443A42D - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = 4A6F150057C923BBD08FDDC361AA547735215B500ADD47BEFE62D6ABAB810F18 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = BFF08232E8B92076146A46EC6AC416744B787A9BBAC00B829FD4FBD8CA5F9DD2 - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = F2FD6FE5A0B12FE968C429FE3A23B46F9CC06C47B12355AD0C2672BD1F4CFB3A - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = 3963B06F7DA25A937C5AD3A8B451856679D6FE022157A2E42C0942C7060DC5D0 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = 1BC86D042A475F6314FCFE59B73AE99FC49FB35D0E07E72A0257B05F74FDDBDE - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = 9A8ADA39A68624DFEC74616A4B5D21E78CC145E883C5FF55EF5CB9E00240BBA7 - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = B7A38EE69FE153973FF6EFB2C19820EFF6AABA3852BAB9EE315D4B47A963A490 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = A994D63A66F9791F8A68BFD20000A16A60F73DC065131447A8048CB0AA4D7153 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = C0738A82A4F7A79BDF1E9A38A2662C42F70D58CF661DBADC76215E92BE2D20C1 - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = F482AD065984531192FFBAB94D0FFC837803703C57C5B6300E8FDDF5DCB09CB2 - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B3995D1DC6E93F915308A8402C7F3AE8367B40463DBD0ABB60A19BDAA67DF6C4 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5D2A8409A75E90B3CE4E19EC8574FD43CB7AFC26F84F160E832097113CDB912B - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 6FB5DB76FF2C9D69D0BC9896931B5579436B7E9A4690787C38A06EC765B53392 - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 52CF641D0E809F4015FBABAD3CA4CAF28BB425B8FA143F9C23FE0F79F85FFD75 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B472958432F3A45BBD748951BC5F936F15822AD03AD636AECA1754FB90295361 - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 44FFB8581C58A88B9D184288BC3DC0203F9BF7860A23E931F597B1BF7457CD15 - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E041298D1AA155C7A165992DA625EA5B916CBD5222D4BBC5B06895D59B7FC346 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 456609FA8727513F89AFA5CA7A27220EEB3989B5E5C5672BDEDD94263DAFD685 - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0E3E32E10FCD9FB20370D0D64D617016702112955BD89694ED615D7DC904C5A6 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B72655B93882B52D2391E1AF2DC2E7C148F65DB56581168302B7250174673D61 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5395C3E27F6B696F4B6A6CEAC8783F892D8DDF64C250CA8B86FFD4E76C09D900 - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 09664FEB21EC4D4E7F1078D5087B98969EE46DD19C7E358040258AEF98E5DD25 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 77D915E95AB8073B1AA775CF6709BE15E59F02F3D9FC7A498205764637CB26CD - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 50EE4AC315570AC15307D7F46B7A9E685144BF24C0526B29D39BCC62B8B99C65 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5ADF97C4495FACA938C5259CC7BF2AEC129B1D94ADA7E6794FBCC9B9FD6C946F - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E1DDB47A0A3279093104357E76B37BC8EFC2F73EEB988A4366CB49CEB1A05CD5 - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 8252860AF5D7B84C348492F4E9AF90CACEDF9D441BD9E05F2763E41EC2BE275344 - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 6F432A2E30C38152DB2C38167FF67D4A840A407BFD7AC500C87DBF691196D8028A - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = 59749FCF2D3F2033601E29D88DBA5C115A18015ED853B2DD893BAA4564580A892F - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = 6ED66AB049599179634E3439E599707D0A8B41EC32FEC3DA8E0B6C52A219CD0B24 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 624C32A70DC2FBB4BF92CD4BD26654097A2924380E8C95C175A872BEC9A846B0AE - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = B0E81ECD5D38373DD1609962D5B8D7539478515CF7CF2CC74A1DF7417E142380F1 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = EBF2D9B82F2AE8E7E71D6F9FA325155F2F13336291117D927CC42457EE9C7129DA - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 089404E413EBF60D886EA068062877D32E1D39BE0A2A9FC0366FAD28E4A3246A04 - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 5A3CFA86DDB0C1844ABF93BA8B4ABB6204D974C3DB44B41FE95E5F8DB7F5A369B7 - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 7F2D3B3E71771913BBAB5ADBB2D738CD1F616879D4C84D03D870F1332D413D971C - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = CEDDB03D3C983F45CF996A42E591B0D06E5EFD5CEAFE7FC78E8D516FD1C85159B1 - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = 95FB8BE4F34EB92288D3359A666E3AB10EA849B1C6F9D4E6C9AA6A3E7209F149D7 - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = 9E0BC9810B4D9A9950B75D95F7720ECBA30DC8243AB8C7370A7B7721E49D73640F - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 6CEF2F43A5D98D8F3B5F91A782DCC09E56CEBEA8B330A4C53F266CF829AA77D1E5 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = 03900D16126C41318115C9011608A5CFB403A53BCECB0ADF09B558625556001DBC - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = 0A22F90E30ABDD44137BF2F7A84486F0901CC0A3F4FF5E57F28B5CC4AA8489EAF4 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = BC4248F49312696B7BA0DF3EAE3C5697121FEF695F0A9B38F88B9107FD511AADD5 - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 88CF081DB4D0C28FF67039227FDF473E8B3F3BE482CC996D4E30598DF99A58D232 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0465E4ACE5645095B2BC48D62FF30CFCBB28022055F394C5B7AA028B3895D90E02 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ED466E1A9B3254CF1AB636A6112ED8D3B205CFC7735F1A1D50BFE6B8CC3E29C92E - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = A3B8B8D653C7FF9FF77161D7C6AB9E777A3D0A6503DE181B333DA76C9666B6E43D - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 9A9C1FA0EBEAA4AA90EADD15B02DA656A4015AFA6D9F2C4E5F70E54E7F489DC8AF - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E6B8051E01C8DE6A61FA5E3271E8B1AE1B7AF6BCC28CF7909B20922D9FB96EB005 - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6119AC15C3912AD18AE3F9D28371EAF45363805394D5EABC56A5A101F4C2F1C6D5 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F4D2B087D3F8A62F8C56B132A7CC76000282C03DA9700EF11D1BE9CEFF9840F9E6 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 79F9C83810DF73E9E779118B3FC5419B43103E0F6B9E350FE09A7201FC0C7C655F - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9A7372A8A55D9D205443013FD9BF326575CAF448313417B3C6C3C041EEC577835E - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = FBEAFBEAD33812EB6AD78FB701956365EF35B2AF38798DB64F15CDF55ED0AFCAC1 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 0B7897F809C5D7904D6BD83BAC08287B3DAFEBB225488F3BC7D6ED42FC57B0B241 - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EDA5A0CEBB36C63F01E923B14226A79464B57C1C4E848ED0711F1B45582A7CB364 - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B8CD054A67B57E746D221A4A3FD2CA073520C18632CE959B198383A148D16651B3 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = ADC892AA68A781240712068E6F17634CD878CD61CF95CAC8B80E8A9FC4BEEE7AF3 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CA02EA7B8793CB25373FAC7B6A681FD05040A531DE781949FF1089AEA5167707E4 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = D1DF2CAD1BD28C5B0FF163F4F7B268C1360F9006E9FBCCE91EA2D90FD1AE016D529F - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = DBB523DBBFDAEF8BCCAFAC37ED3742790F79B9C78F703F773873BC2AAADDA71F6BB5 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 569D60F72865E6EDC94C35E9E0C2B7E71891F3B61D3BB0C18C6ACAD766BB009D8833 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = 41680DAF9596C7A92202416E08C2955C95A4023E5EC5FFD6CCC113F8708347EBFEB3 - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = E942EA06B702D84A16C4CC21E4F9284831CA52704A9481C636EE6EA98D538E91E7CB - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = DFD4ECC323645719D44AA4CEF2A81CFA3E988DE9B8A6C914F403A96E546DEB9C0D26 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 26BB5D1ACAD7E50158346BDBC20A66A5AF33C2237F0F49FF32CE18C55DFC0D395EEA - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = F0B822FA1489CAC1B872763399A32A63668381DA7FAA215BA10C630088B11625DB57 - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = 5A388490C018DF0CBA5E86A955EE9692EE561289A106B99C4A33FBF251A96BA01362 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 65A218F8FB8C6DFC8E4D3D8170E963AF45CD07463F33B1F3531D70A6D4EC8BF93374 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = C62C5F5838A8400804EC83D57B7D19D88D84C235CDA10287E464DCCD37FD9AE3C670 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = 79F869F958249A0BDD47D89BA739CFFF736C6D5CC34556AF099F20FAF62C4B3BF388 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = 687CEFDF7070DF5790BFB2A21FC03A7B73105E5E4F319432ADED57416CFAD1F917CE - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = 139A6B2B0D8A81677843FEBA6E7596DF92BFB91A4CC8781821045D31EC0B9D59656C - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = BAFC9CBB0D32CB4A7458B8FB1B80EF7EEE2957AB44CFE2DE1F3BD67CD46F661B9C9A - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = EAF9741E8DDBC4B029CA0E57C21AE783FEB7259406CC9B5441CFF7A47538362E82A5 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = 9E4C522B301BA8F0DBDE3A69F106FF2C2F9CC2D683DD13B2F07A82709F00DA8A0276 - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E888460F0783FB85D0B5365152FC6C2BFEA445D71B069FDF1572B728AD7AB0859FEE - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = AC705DCE628F2BA6095608475B510182AB357C776F3C7709D8DEEE9D8296B67D9CC8 - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 25B4990BB1593D8B2850068A946E0BA0FD8E9B6BF443B2B1CF5F800C284C61F485A2 - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = DF318B2F65FC1D556124C7A08404F9ADB2D0A3F7DD50407653288496CCD49E55D113 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 63C76A567AFE5B3B2E0A867627FB294319ABA481C315414F4E1073F2BCD6995F6DDB - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9BC098CA01EACA6D770E928AE32A868E0FAF4BC70BB37755FE9C9E6386ACA9A9A87C - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5DC5298A3AF1A0ACB60F8E676AED09E81C74D1C7A0DE9EEB3E1429F136ABCA899CC0 - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 40D821F1293E74E1788A5837783C90F87E404822932252E16420C73ED14E029D2396 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A27CB1AEDC11C1E0DC8FBC8737A2A31EEFB7D69A799E6DFBA09469054A02132A28A3 - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D3ABA18CB957B4DF0F6308B8F8D0F16D81853D1A266A23E59BB3C038B8049B3B6EF6 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 02A5828CF460857891027B646EF19F69C29CA540E1CC3476DA5DCDA6C9A2763430D3 - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 8AF4D39A1EF34FC5C6FB1EF683CD810E53AFBEAEE46097F4974F18A9124B2043D769 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5ECE4C14943C37FB435717BD37BF82C80F91E26F8E94CE9330CADC8D3CA3E38186C4 - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 57644B9138933386BFD00AD6F6CD59B68B0548BAE73F8E9219AD40D55EFD8F9D1D0A - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F003E33E21A6C753BA19287D319925E258DAEA50AA6D335FC1CA8D58D775273EB9DC - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A1F77FE07C7004056E83605E28B3EADCC5EEF3D4CED3B7835470DBCC8E9E1DA5B238 - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = C2839402A08E1F16558305EF32D854B976E70A14823E34D1DCE5553A8D52306135BC48 - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = A174109F00D1AC3EF74CCFDEC92B06B6EFABE78567698F72A885851029FDA35EF781E8 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = 1CF5161BC6AB38E88E90C134F5AA02458B951276759A3ECDD074F5C8996DBD16DF45E4 - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 5FB83170206731A54ABF9DF566940AEDB471A137B168D299BDAB0EDC3059C48BD9F887 - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = D17B87701B0D8233A15B3EA4B7223049B795AC4F352C232890B1D6C54F597782694C06 - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = 24AED8EEDEE394E346696C6D6432048120B7C122145D92857AFE4736370BE5702BB8A5 - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 19D3113BD399DE11D194B80675188FBFD80A4DD604A0294EA1E0A559CAB4210FDE88A2 - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = FD4A6FA7270EB2DA2B566367F2271653D3464BCED39C6D1C1CEBD6756C90CCF8019A44 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = 8575FBDDE0AE310E2062733798414F2F82C690A5AEDE3A8AD764BDE0E3BDB72B2EF8CC - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 08C53DDEFA95FE9E67A83585E179BB2BEE8AC7C6E17E4E95146830AB61BEAB9820B39F - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = 3AFA97BA41B1D238D2B618ACD96D57A12E46A780102F7E9D51DEDC8F35AB8897610439 - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = 8BB5762A38BEA2DD7A92391850B5DDBE04CD50ED031BC443AE771B106B91D11AF7678E - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = CDB9132DB31A703B7074D609CBAFB818B6F56273DDAAE5D2185478CD09B80FE9FE7A6F - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = C7D9B838E1C874043E2C48D14D3D4DD208AA05C71059DD866BD282D3C47EDF29228AEE - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = 83067169CAEDF0FE0F93637D27BEBDB9F0F904CA9609DC9D7CB9D4DF261504D1BCB722 - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = C3377F6970AEBDCB10A749E6FA37FA721C9EC258E249E5C1C667C768AC1626932661CD - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = CAA7CC6117EF079CADF1BA05BEEBB100E5382297C90B763C7B40DCDFBB1C97AA008CAE - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 2073F52E7295C2010026F386259E9DE179D4BCFB30A5730B84A56A18044FC6E6BC6DE7 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5345B1D0B04775EC49B6247BCD1AE5FBA282339C5E4D4AF1A3F75E0E3482A12E3B2BB0 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = CDA317E890EF3244277274C7C497D4F7336B51BE8CF5BEC950A2FA93E947141E43825B - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 8D62FC69085FE9C5DCB7A3D63D5B70FB8B2E53744D97D02D30219F7B3EE0CD72D827FE - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 84207A5AEC1AA77F8CBF03DE2BFEF518A90680D11A06F3CB5C226726911B99E8BED8A1 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = B9D87D20C026805BDF290A7678EB680C15B8FB2A9DE8465472F83B1309E3095EE2738D - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = BF4E453D412840C72739BCA375900C06500E268CF321526981292464B7C17CB82E715D - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 6E124B8A841525AA2C6E08A8B8DA10CEEBEC1714E6430884D50BDC679874242CE35ED3 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8BA645DAC2BB6E5F8099D41372339F6315C8EB377BC14BD6B215B1DE63DD656659B91B - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 0FE837B425A033007E70BAF472A423BCBA2061B26E9285279F78734123B42FBFBC7164 - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 33A0289F23A37A153287D38FB615806A4A8331AC7FF291F68D2B987EDB4CFE1E0721AE - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 883BF7E19C5EEE67DFE19922769C7BE830FB8DBC929B504BA9F21CB1B726BA238501C0 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 0822DE0D980D524EC56F691677334459392907C202836A17C3098B6AA3305A2BEC7D0B - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 73AA4C68F7A666B3646C6CABD7C09759B8A7ADF6B1403FB7166958DE616928C0B90755 - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1C0FC2FDF0C6CC71344EB3FF40FF7EDD9A1122450C6D067B47DDEE5A5E586B4B4BFA86 - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CBA41B6288D665D8241A90C423FC264044292F1F7E6AFC6F5A44C73825E8854D3B3443 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 07893883EF980512BAA66BCD42A1A479768BA262E9158F73BD3C97B85FC90A5063DC43D4 - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 1873103A5910CB8EC612DAF207B55295298E24CCCA07D3D2DAAD727581A23004964AED3A - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = 855E2F3964F2BC6FF0AE0CA98898C22557A34678624E8456D7C92F6351CD4BACB1E085F4 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = 58B327337BB93578B863DB53C7D336E60019ADBA0C8D3991FE89441F1496373245565913 - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = 252AEF554B179254E862C4B3DA5BB4840BE156A408330C2DE5A7D6AF4FB0B9F4A1AB9341 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = F378B6BA35636065DCA7294F3423C91A98788FAC7F6414009C7B050A653C50EFECAACDB6 - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 0EDF8F10430E648350A6957513EDE947E646246AA0FE1A1CC209BAAC8A4963ECDF5757EC - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = EC687703E24581A9826E16936F67A4673E7488FBF439586F7714C16B8DA5EECF04380C04 - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = C92C6C2FB2AF7A7CBA0B920D1770A535C430CF0BC956210FDBFFA4992E6833BF03ED0CD4 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = 66E27BFD266D02FF083B39FC442BBD7385B487FBCB0F827BC952D02CC6782BF296469E4B - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = B0B09BEE93385A6CBDE393EFCE9D849EA96AAAA9A82889F273B07982CB1F4D4124AE901D - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = 69C2053DD6A69887444BEE2EEA18CE495D3393EFB4606D70E09BD3673F3694735A466F9D - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = 0C6B9C57BAD6BBB7EBE6C7C88D0C67AE313C2953442422B19C23592E9707A003E056D9A6 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 8EA61A7E3541DD8F938AB5BD4CEFF8C5F83C40D042FC9609482ACCBEF5E4A934D0903C5C - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = EFCE87DAF2451343BB3D5798794E0F5E749C158C4AC62A558F657BB8615C8239FD9898F7 - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = 6C5629E2E1AFD2CC946DAE607B1D254D52C748C769ADF6FBC382BD242FE48EADDD5F972F - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 9FB9E06AE47F1D92253635D364274077136E098FA26682953D478C5DCF804E538553C6DA - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8144764D0CC69A2AA9F2506E4E6FDA518EB25132C5497DC819570ED5A9C29A4E97724DCA - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 28DF51A9DCCDAA7163BEC66EE94D3F1F1B2C98FB76BA2E2703E95284FC9538CB7227C990 - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A04783D3BE4327EBF9413051EFDA4BF45BC415E67CAB0785677C1908A7B0648098ED2288 - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 72F53C04ACFBADCFFBB5E740402F175DC8FF6DDDFB3B3936064016CC4E4A2B77B5EF754F - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = AFCDA420054FA45DDCA0CBCC21ECF7401BA7A2F7CA440DA805F5556F9C4D0E778E0A72B4 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3B10570BE49CF619B4BDB133B23E3E10FE845D669B6493FEA294378699C7945CC7C396B2 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E2AB87C7448170802C6916BFB8BB9AE17CF9D3F647DE5892AD673F5505F8CB20547B5091 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 7C5FBF1F1624C7C80774735DDA569330D9B8928F8444F0D5560BDD99B848A5D0B2E985DC - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 9C9A360C65FA895B2E210BB51B413FF100D25E5311A861A132083ECB9B1EBBD053221B13 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A9439193599B62C34CBE4DF0D4E904806179109A349D77ECA9901EB811DE2F270DDED70B - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 8278327C2EBB551180BBEA66BACBA45F52C6ABF60E7D7B6F9C5AF746F77E1103323AD4F0 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B278E323CD53B7FF8C9D982D33B0BC933E0D26011144C2FA1433B8257A41F0767459DCAC - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 64FACA095FDAD37D89622E97C1DDB5F62B6319A217A130A5487B728C9F80DCF6C1CB3FC2 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 3D417847E649C461F41C4E452C398A50D09F3FFE16B1108BC4686ADBD9C7941325158DEE - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8EB519992DF3A511B5C5D8E6C168A52E806B8546DED3A8321D54C8E83DD3BCF6189D6505 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 374D34ECFA23C529FECEFACFBDE75D908D556104CF6C979852D6917B365C78DC4AC73F69 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 8E08874D9BF9D931EB576390E97B7F176674F6B898053CB4BB130723B9F50470A591385EE7 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 29B96C137886FE9148AB224D0F2839FE2362CC0579C7053126048CAC34FF7AAF641D55FCB9 - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = 2DA8225BA7DB8AB309B0B7AA1AC894B13BFF7C6EDCAC10A835E62CED5B4F5DE7A24FC92CB6 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = FBB1AB3B0E5B465C3333DD3D97B960A3F8E8E4388A95C601E77004B0C3F36F58CE35D8B6F3 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = B01F63C8D17F811A4470AD79872C43B4A31FE4B37BA0398B87DC6B06AF1006A68BA6AC5463 - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = 767997A446F566D44916949C3EB439C3937E45EFF025A103A79F8304B0BBCBE9DC8FFB4E0B - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 19AF7DDF55BFE5904A31F4F5A12913FA6BE17CCC269434FE7BFC6A3F2D423FBB0391EE7C86 - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = F2D8AA4AE394098CFA9C42BB3837B1512455519052295E13402DB6889975F5DEF95CCA57D0 - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 28DB696AD5FB4ED6F8DCFA802CC75C9A99B6587123B8061CC107E6F9075C07FB609D09EA9B - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 9439E86DFFD736E50EAFF88A0EB347777B6241543847E4EEBDD96E69174AA878C0E014851B - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 977948ABB9E423D25F810F57E64425C5C0B368ACF3A679597329068D350BFDB9A3DDAA0A99 - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = 9924354E81465D6C9B518DA0942D9B31C93345F74B7E7774C83B68DCCEB481A667BB5DB7F6 - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = 2BB7843554D3582E2D844DE03AE54D68C80FA832A8CD2F9BF000FB08F54382278F64EB8D58 - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = EE119EC3E562A3E7BF795CAD333C9EA29506810C3102BA9737E21907CD73F4084D21AE6A00 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = AB3A457EC7F33D2CF69B1863169191D1EE7E5D8AC11B171205FB32101D6CD39DD98B632E32 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = E3D4E7994D48E023ED28DBEC43186A2814005F1612560AE74FB97F327B9B2580955BE51E0E - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = A60D07A19064F94AC09FECD2B313A92DA7320B39F3368020B11DDF6DFC42CFA80A81D95E75 - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D8196943F69D8A5677F43EE4D7C5EBDFF3AC9B9085B07EDB3640F03A9B3E8B147A517D8008 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = C40B4F34AA9BAA77844BC27A10622CEAB5EBBBB07DD99AA7851C5DE6902B126D30D2A7AB9D - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2BDA54FEAADE36C817A5E3D778ADFA902B3ACFD15EA9B9E16BD0B525B400C3849B94BBD687 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = D9BD249266567831DF7D3FB3E08D19717947D9C9AD1A5EF53E2B5934F9923AAC626840323A - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 4F94AD798744DBFFAC09E8037C3A755A219CCAB357D1B117A3CE5D8E2191483D606B8E16F2 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 353D9A6F64904995D52E3A750B456A9D6ED8344A7FFCCDB23C06C492B30FC53EC1FA6C2DEB - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E53F662779C02CFBB824F3F2C83A439031D75264721D8440B60A1747FBA7834DCBC4387AEB - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 1C9A7A1D79218404752B6472E4F918AA90761A34B1C7C5A21121F670129B3C2A90C2CEF333 - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 3FA9F21120494A8BA84EB19312028E18287494AF444BF5B27B183129313B4992264B6474A2 - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 48BFC3BF2C61F1D62F37A9C979880EF85C47480185E1CDFDB4F2312FE2AEF14F013BDC548F - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = E51EC4DF95E16681CFB22FA140F8EEAC2E0788E0D4E16925EB8758272C42ACA6E5009FC083 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9A3B11DD19CE9E55CC1EAD123C9C7F94D399BFAAB6F7C8BA4CCEB5B03BBC0B9B1E5B9E60A0 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 151E8BE86EEDB21C7A9046EFEFE3CB5AC61680143893A51B5D308C3422D272ED822D5612BA - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 085C42BA88AE04CB8061EB225ADCCB55D9C4C0205BBA2FA0F5C57112C8469BBFE84C8AC892 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8F4D28B1776E640C79CA0E4B4BEF0697664D8047BB6D3E51190F4EB3D77427169C66DDD92E - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = E9FEACF1F4561FD7E1F8ED07BEF96027D0ECF1CE41371A883932B8BE87AA689843C53F5BC1 - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 87F9280646E9795F2DEB49ABCF4E3B168171D9204A91D0918A2E2D99018B2380F592DE50C672 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = F2F747FF7FDDBBAB096AD41D00F2B276E2C4FC89EA8619CABCA8A9A31C025712D1AF80E45F54 - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = 50813869A69157BB8B3ED93134BFD309B1329101358FA0CBD38B53DCED018C1C6615F60236F6 - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = E7B27FBD46FEA2213F4A9AF6D1A261DB0DCC824FAF0480D39DCD9F7B776A3C897F329EC728B1 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = 6F7982E734E940C02A24D729A05B04264B60271611D4AF61789A7EBB472F8398D2501767C5DF - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = 5C2A8D7DB3E54F07DC800A7DE859BB066806B4CB05B78A3F4BDB3A26BC32A22D8CF61548EE96 - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 9996E0F5665B8A4A65141C8A957D49FD6C7380E0A6A7AE0B1A4F43AB0899C42AB8B10AC4E4CA - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 9C41822E9692C0D2FAD3395506C0554689EBBDD4BFCD9D0E8537D624B3B41632C4D4DB3750FB - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 67E7E20D8532B96842AAACB7DF7B155B6B57191D5009E7015126F3B40CBF9C00C16766D0B541 - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = 0F5FF1BDA59A50A2832CA92687DD00E25A74B2FCE194AC2691A1E84A890570D433401AF6D1FC - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = 184DF34B7FD4B035812A506AE9C1B375E720155A4D85CCDB73BA513595C55CEBF6E3BEEC2B50 - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = 45FA7B12C33264BF14C90301634D7EB0E84DCAC44EBF9164B53318F830D658661BD09F1C3E20 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = 2D540457BE4665481D363C5CC8B38EB27642E3BFC146C79D932BC095861397D85E51F7BEE8B0 - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = F02FFFA4D24F5FCC5FDE35E88264C7A46CDF781B37E2F73E3EF745C8E2727A9322D7DAFC1252 - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = D56396D6521E82332762C103588E357DC8E4FBC49D1AAAE78686EFF7A926C4744F501F3BEBBE - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = 31864E1E19C293369157C8B7CBEAB8F7AFF707506FD2D6F2C7FAB276A7D5D6C1D1F4DBEF4C8C - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = B2419B5C9D785AF1AE3DDCD54EC8CAD41A15ED0166DCA45117995C63BB31A49A87F1BA0D2F5A - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = ACE973B506C2F10B7617A61A15E888D2EA4A6C718E18D7F075ACF4A9332C100C5F71BB67FF36 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 8FF6B1722DC986063F32141874906A241C2C4D2C986E0DEFD9414B3D9FD8F6CDA8829DE626DD - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3558D1147A56DC50BB31097FC554AF43E3EBBDF26AE7F3900F43DFDF91B80E7DA3650C867802 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 51DE4A0DA6AEA580441B83DCD3EEF28EEAB01BFDC10A6591AB66ECBBB5EBF77FDA1314D3D41C - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 20371DF58509FA4F2ADD02D22B25E39286882DDC1E777239158EB77594E39671D8C96D92B394 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 86349FF2C2FB47D26425A053FE57C4100160B5233E1B8160A57F78FC9FBFA1C7ACFADAD90375 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B443EC53579A9A93E1F8BE4EAF6DE74C064972A2A2E2E2D0732883651DD0ABD2E43BBA49BC56 - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 229A208BC1FC8E32CDB830B075AE5CC56955148C1889EEB24977DC517ACA555DE4B662C5596C - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = DAA1A26B3F3FDA3AF3F30F299D55D3888C31D19F98E35DE1FAD99DB70331F7BC0DF3718BAAE7 - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 816A1DCF01FBD486A73F15812FE5BBE92AB07AD33473CC39EE6EDECBC211BE3B00B6699363A8 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 496C7E9F3787A116F10E8185DB857E846F9CB3BB686E6BE306666F16467867EA63F536A7E27F - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F0E4FE5970AFB9506E21D59C9426BFF57AF5E106F26A5066626BD908672EA27D73221E788D1F - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = D57DFC18EE34B51858B49CD44452F13DE9774F05DA700B9073A26693A6DDB8EFD375C9EAAC40 - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = CAD85DBE5FFC9EB3A612DFEE0809CC151B67D9632449F6504D1D7FCAFE65536FBDF4F7D16651 - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9D1C7D588AE9E87BABC4846C145A1D1CB8B5F8C675C7BA050E500056F808FF2C0968DC6CED58 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C9AC43DA8CFA28E1D9F9BB6A9B962DF325049B25DF45328AEEA1680042BBB9FC25A1F064C383 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 4B7541D0E9A6623797C9335007E12999850B180CEEF0EC46D57A4AB2218A2B0C8FF900AA0C1315 - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = FD30FD464BB083CBEFECADDCB3A5459FA0782844A2D415699D7B83B22E722FE6B8001A14EB7087 - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = 907B66C9258DB5795B3E5CB74B41E3C1B1206E116787EAAE97B79AF93FF418690C5A49F12FC577 - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = 6EB92B00985CCA20384CCC42B98DF85CD5124E35640BCB0568BD83BB72E57D3C64D09D11760650 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 960399AE29A09E95619D0EAEDD723E621B87197DC0C8156E861157D2A139C513AF24EF698100BF - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = FFC5009AEB636D9BCD154DA71F9EE6A7E0402316EDAFBD13EDB32270BBEA1CC5A6119B886C2A4A - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 3616DB91FF34FF1503C6262490E9B60035D6E28AD7F6C27B1C4D929A8C1248237DE57A967EB1DB - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = D991DCD0FFDDC7BAB57ED3463FED4EBEDB01809D3C3BB5088DBDB9798FBB6DC7FCD0EC04E5A991 - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = 6DFED3B2A62259E90E82465769F724CEFB53A5256476AB24C19AC43F9B27D2FC7109321D14D8F0 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 93FCB43DDEA9AC39C9756948C64D650E337FCE8F812252CFB15715DBA32B22133C4AB65A1F01D7 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = 79225E7328C6C07FA1015D1987E283EB40991068104BEADA807320DA69C5872E2F73B11AC94D34 - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = C8A7ABB0840B81D2C4D05F3299F70680E5A7D37FEE974001163B2829CA56BB2D73FCB10B0D226F - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = 457D90B5EC0CD2EFC6BB35A157B683249B99C44809DFDE131A2E4AA8B880D3F5C2B04EA589C5AE - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = DA30E98237D0F0311B7486A5894E0AFEC8042C45176135B3017417040BAB902DA0381086D06EAA - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 4B3F11F046ED9835FB2EA979716D5382146ECBD2B55D12853D2E632B6A3618924ADA744A39F616 - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = 1B7BB99EF61E0AC80A955124478C8E1D5D07599B1A351C588C907456A395AD47EFADD71473F16C - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = C3814F67930C3B5207C964C335A430F8C9F949A60450E1C9694A027492FA08A47108973F4B3AD2 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6E73DAB3C02788DDE9334288C9D1B80B48123308DDF6894D3DCDFFF94B132DF90425490D752EBF - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4D8F367D0E911A9417BB6343ADF0E86B7DA99242F4E9D5DD978DA95A3C7F6C18E978974702F52 - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ABEFEF686D009A69C85363035A1339974DF562F405879416AE4E4CF8849F24BED542DB6401B0FB - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 3A60CB60249BABCA03CD87241551D8F82643F75E17D6EB3A049B17C8BA90A8C772D3FB3DC4C9E5 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5A9404FCB452F3649843B841CD9A00989735365973D08CC25E4C860E29721F07DBC755E87DA4E4 - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7DC64ACE50DAAF0EEEA2BF2B713ABF9405E53176BE8EB62289B17BB811C50CA7E1637B1001F07E - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B3D7DB2C9CB0C550A2E362FA21651AD3A7ED8FF581CC38B1C5270FDBA9E70F765E97053E39AB6D - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E32AC7E00EC0D14D91155A34B1A08ADB2CF4E37CA7AE0569D63CA1823DA73BAE8B97CC3702FF77 - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8036B0686BF49F0A0F30879D3A3B74BB108EF2EEE1CE90BA0949375F7CDA410A7DDF67C749FA86 - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = EF473A8BD381BD17898C9C7BDE133FDFAE2F8515F15F40F6CDC207DE981962ECC7AC4BCC027236 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C28A0EDD61A36869854C8D3735920D0625EBB82176E93490BFB5D6273682D6C2092C4B049AA408 - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1F9B94D642021DD526820369BBB76294A1C1718D575CFCD0CC79085C3142D6AF9AE88A306A0408 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 4A418EFD0C913996D0E579CF510C965695DA09742342D07ADCE23C00D8DF7F158DA332045B5E08 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 42EA9CA8625AF1FB6CA588482B994F1A7BC66A2884C4613C503AF9F7B9E5F2183A06DFB7FFAF7D - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = EEA882AFF58E0F65008615EF490D2A357DE0D98230D93FC0B2BE443CCA1A45A0AA892BCF1F82EB - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 4C4CDB9639A8D57F07AC6ECFFB91F67BA7065C3A4B70A1D170C8CC780A3696753E4D2EB06C83A8 - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = CF057648D61755493721047B5698E01669BD8CDED00B547840B367C9B15CA0F72C12CBE1B02DDB39 - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = F4BDF08EF0663515B9B03717A03F3E3918281E5B501BC52B6BD4A2F9827176E6E48F34609A8ACE6B - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = A2FCE9FB021BBB2D401BABB9EEFA784959D4F89E28A16DC936932AB4F67298233409C6B95D459DC0 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = 491C00E6520020F86798720C58A839EEB7D23BE08FF8A9641845B3416C713AC13AA4EBE6CC8D9C4A - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = 33712F42F23EED87DDA0E430967152A19F285FD2DC7D84AF565312F6AF3FA8DA8BB0AFC0979BE8C2 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = 30C3099AA13F6393B9E10308BF55E7204CEB907A95332AD793C0A9E3C5964C2A9F801A97F9F3C56B - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 589DCDBC16161F776E3460144CFD1ACF18DB63E0E45FFD573F1379628A512CF63EE7F2C81AAADC65 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = BF80B92277DED3E82875ED87775FAA93FAD2E3E71C5F2FFE96E8DF31395DE86705C27A18A6F8E069 - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = B12050FECE99663E93DCDA72469E6620ED250F9B068AB2FBB76568D8464BFCE9243496688CC74B03 - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 283568C38B0AFBA7BFD12F468266755779752E54BEC984F867AC7371CE2779105149FAC329737DF0 - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = 4EBF1CF270CF53E661A2BE86B12F72AF4D93E609F922F1907C83279AC57CC0AF49806759785580AF - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = 2503D31A581D793CCC2AF2C1C1FAEC3C57B28AB077499D0CBF191D52DEECE94DF05D474825874FFE - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = 8DBBD204ACC263553CD8D1AC2CDF49869436F8E4EC2709FFBD0308DE8002F07EDBD17506C471D889 - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 521AB9B07E515A49D339F5BF1132A2C7CA75387A9E00B2029DFC446D8B94677E067775ABD53153B0 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 3D6608938D5EDC0A5DAD8F3CBD8C4888B73A649EA4473CD0B191128F80C9C340742B2F0C203A3D31 - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = 3AAC1E9B051F12FE7540C10966BD71D5CB9A05895D8085FE929991FF886F5074B2A9F2486274200A - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 94E384511D778963EA7E8A7BC75FEF8595DE31B9369AA332A81DB99AAA2352EAE575B43CE5C94B1B - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 61384123763489FFFB30954A74BCC5CE4DF5E41C3464D8AE032186DD7C7F44EB68AB92F4698AA867 - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E0CFBBE0C7E8AB6AB90EFB9489B09C097D8F5CE58C5246F6BFC01845E01E0433794A4B441B26BB7F - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 572E345A74F3F71C36E9F14D3A375FE7ED5EC8FB92A58CA100FA6E5997689FA567161D3356DDBB03 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C0E6E5B8DB16FF4A53CEE7E66E207D42A7862CFDB9E3A1A1BEF7912B885CCBAB3A519F43D4DCC5AD - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EC380DA01BD779440C4969147B30EC8CA5D3B29B762AB02B385C522505137ADA3F86A3E618EB90F2 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 33A0A41D16FE0AA472064EDB0E65BFA8CDF5373DFD188B387E4C8C433599C220A27BB78198929408 - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6FC9963E9C92C7E50C48BD672A467F0CC1946D36EA018E22ADFDF1748F7A55F2F12B1DBFE0870C23 - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FEFAE39DE73C7884A3B6A95E6C1056FD3383DBDB16A814394EFF4761194D0D9970E45900E9CA929E - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 401E6C8347F88439487984370F943657CD601B60A803EFCBAB5179F410103318295D32E1AC49EC48 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CEC3062347C6A7A7A2C84134DF6B58C77A67261FF579DBDF9B5B5D0F8A643F3BC14719EA5D576A8E - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A43B8B213629F7150E38E6DDB671D3233E6102872F532EDCF6745E3D92539E1C85D3BA5B8EC881D5 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 06029B15A8882411A281DA249FB25DC8FDC5D469CB872EDFCA8C9B80A43492AABB1A5BA0E48098C4 - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C064942B34E003F7B43CDA9E738517A3D9138CD4E68C9B8F046FF02F62D9A123BD4214DEC7124DFF - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E13E8DDE3F215EB2FC6F535B6EFAB7370DC31EB2FF61B86EA9924770C9B77E06D1390D1D3ED16968 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = CE77FF42E770AC934EB3E6A5E34CEAA02156DFCE85A43EE0763DA088E71BD8CC1F3C52CFF8407E86 - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6C7DE7B6135D51A36B4EFBE4F16A5C2D5E0075810EC27A2A6F1AEE030F967E138CCEA94FEEA36C79 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 529C9D6902BF40F126B1C6EEA3D3661C31CB887B98ACDF866D7FD1A448865FBC50F8A00732E6689DA2 - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = A09B9868EB1B83B514307D57BEC2621D8D7401F416CE5B6E9448309B529CA8D32BE0D942568D723EB6 - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = 9DAF7124ACEC4095545C3F4BBD473A9B24265C0D29DF2F92700A902E210B132D5A38DABB937D8C7F17 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = C54A949F276A9A54B683F85AA4C16EFF57B87DEB38C6A1EC5C39A7C21BFDD363804B2D11EAEEBD2AAB - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = F1BC4D9B8EC4FCE9A2735ABE2E7FA58789545210BB45A8DD7EDB9B3FF4FCBDC0FF2E969AFF18193C53 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = 690A64C4EF9825ADB671AC3A4463545B7698BBA8C8BDF012BEF0A630B13B5493ED9FA447324DF95079 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = F6D146DA6020AEC0B73AA4C07484B4D5772D62EB0242DEDF1502A14296BE271C1A02FD5B5A0DDED7BF - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = D865ED516251428F9604865B37A4A4CB3CC5C5C765CC7BC23AF23B4CD43E8A8B913DFA34C7A78E693C - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = D4D5255D22C2D94FB50E6A4322C4B800CD681FD632A4F3DADFA5C2B6D803D8811342FBF5DE6D6C6887 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = C5D8E8ACAEBD53EF7186B5137F91A6920DA5600B194B936052843AA88611CCC3D5C9AA6DDE4F4B4A3E - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = B24D64615219D8752B0C3C072AF504018AD40116426832BE7F846F443E0A490301318593D073DEEDCE - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = D077EE4E54A8B7C40687B288195BBF3D177D04F9915008EA6CED0BD2D3F23D61395EF50526B26AE275 - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = 59179F88A636EA8CA4FBCFA1C5DF4CE99702D1FFC49253F854517406D15058BB92AF807395AF2B9439 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 42DEC3C4D6FEFABEA395B958C115E1053EAD3D050412C59397110286585F35AB13128AB48E85B16AE3 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 2BFBA841AF5CAC47687B71EBA62344F9446E0D754C688E9A5DE75DF069716B9EAE766DD351ED063936 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = AD535802E36EE478163891B3CD78D4949F790C65DA753909D9A9E028F614AFCA5E03ED3FFFC525F8DC - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = FBEB02CD31A187A8FB17C8B199D94ED6EF7DBC4B365DF71471029B2185024A028EA53784FEBD2E003A - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 277610111F72DDF012D71BAB4D4EF79C1AD4D33DE85A0186485162C71F67B35227EC4B30F358C7E59F - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 9552DF5A0A6A2ACDD4146F1B843E9A22AB6F91E13470F63062B13C34A6B6E5D80CD854FB58EC4B87B2 - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = F3FB6BE7E0F6A699388AFD0E045117BB8ABC4253B80A41E86C1CAE9D900027326A80F80D733FF317B5 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B778884AA9370F3EDF28F4D2A407E13788D7C244EFC761339C47F0D2C5FF30C472620911C6AA1189A3 - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EC1F68F33094A29325E1F3DBBA9FFD100D554A0FDB482F3D4B742DD15AE55706786424E1821F301D84 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3007E9F280FF2C840CC421836BB504016557F7485CCABBEFF5D837B2D49F837A2666A4DB64AA1BABD2 - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6D61412549AB8552A1EA5C41E289DBCD14501DFF3575495D2A37A1CF590B0A5FA42AC96D70B008BD68 - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3807EA5C0E6B541CB7D876F4D496453FBCD75F1148A75585CFCEC43E9B347CC1450A410CFC75350450 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 4B12FEB91B7BA3CE2A3A999ECAF173741D7743D0E4D0A1BB79703A379A995107E6D83777019E450E70 - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF9A4B1CD20593052527E8DA2E79493D67CFF585F98AD41E7D2BDC45361CC86A704842A1EE3FAE44F3 - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 31A04A398D9531D56747C05517B6B4F222A344D31DA1C54C11906928DB81BF63D003222EEA1E228E36 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5CA76B55145CE668B7F00B5DCBFCFB20EC5BD5458DA67FEC78620B573905590A32617E5B17B6DCC0F3 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = B35BF21F8E26F5A0E4113DF1302895F9E88ECACF3CC5325BF479A8DAFBFD562EF6DFBEC764EE7570E0 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 0DB9D9A27C7699A1718139A25C106C302A5DC1A07DA7AC7747C6E84A07F459EBB8B6749FEE97A4C6B8 - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 66D91AF6ADD3F3C90C731F63EC7BCA09A334A89E9B31D2E33D88E14DB26A9A91E07779FF833001D178 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BC52E3C910549AD280635201C126FF30A8C35D5438A5223BAF9D7A81DD3B9695DFC682A00F4C8ECFF2 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = D2236B104C7C8EC1AC1A285895A7B8E28A724550E180E2D65EA59FB9A173EE86D23EBF96583AC6696F34 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 2F9273A6A44224262E5CFA4669EC1EA1660D7A5E72B4F2CA05215C6D901AFC9E63FEB6D926A25A382426 - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = 23B2E55F9394720F5F526B48EF3D6E95592550627E280D76E46255907D998EAFA8A0F9D763918D5B17C1 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = 5EF404013889B46AA501BD8F4499740C747F1605336FC8D05DD4495FBF9C1299C0D3F3AD1350292E379E - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = D0F99CE7C21C19685041566F7FE1478BB98224C53339D614B474386F754992DA586190A2DE4864C9375C - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = 57B18D55FD4EB8A51F1D27BB3905C98AB5B00315D0D9CCAD85E6885F0F8C1FF3CD472C8446C0FDD965DF - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 9A1A9F8FA43E4F1E3A0BB5B6340D7C2D10B6FA8FB4D42284646B614C7C5A7E7339E7BF5768B482B82408 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 7689006D1D4DEDBA1EAA354ABFED7F11C2AAD361AF4833CF9FC4619ED657CD6251EC03CC1604095AB3AF - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = C300A3DAF00F57853B3F1438FDC3F99EB16221397A00CD03CAB990F19824F56884DCCD2B1A63C3428137 - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = EE8C3311E532B70C15D40B6C88258A52B2CDBB8BB2E7A173FF263CCA594FD84420DAA28541D2938FF7D0 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = D493859E21426DDF0729FA83B14D79D8930D2DDFFE4D151FC3E5F436BD6D296F62D7869D28EBDA44067F - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = 8E3DD08702E40DB42D77BE0CE212AD31A43FEBBDEE06BEB7649A121C0C8B03DFA3F3C1F0A38E512F4FBE - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = B4994852ABF776D91C4E198A43B2845153CA017A74FECCDB56858D4D12ADE1CCC886480DDAE04B2DF38D - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 545ACD45EF5E085EBE31C2EBB7DFC889C167275415883B5874FD4AC8891317A8E363CCB3C216F985AE12 - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 3196DC477B991759E08F51EFF2ABDE591363E2DA79F3B3DE58EDA3F449EE4F72DEF54B093B3D0FD4B646 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = 94136BD6AD0BFC1639493CBECA119F5358E68D5830F64FC3C6CF103528D430C3A84DC619D1F8C740129D - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 44675858313FAFC239C2AC134825AB9249FA0A1AFEBC0F9E24E3AE81AA00649438BEDA77079C61C508CE - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8F3BBC66F63F79F1E0166CEAF876D37480412467FD2FCE41AA457322FC0430A1E1513522CA10B8B3B605 - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 43453B3B34FDCA85EF36669BABACC1E7880DBD94C129C4B390B06B283C413904DDF9268FF33FD392E47B - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 60E30CFC741961BD80F68C50C89DAE94D50371429FB5F401A77ABC7D8DF5A84708003CD2325425FD7618 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E24A495DDAF3E6F39FBED9D18A0B147C58BE7DC8BA8ED69AFED0A73A14A15FFD468A4A42136C81C9CD36 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 7C7882D78DA5675D4538DD8D4AE0FEECBD3E9F7A72D48714B1BF8A0359694B8CFE0317F6768A35868B78 - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 6A0F6BEDFAEF7654A28C0ECDF9267EA4201216ADAFEBE4D535A27DE2CF379F9005FDD3E992C5D0EC1DFE - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 39CFC009C43DEF2F52246F362A3B2541EAC6D1D6476406C84A44C36F910C38FE0020F48D6144AC531215 - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4E95BA5BB8474A603A98425DBAAE0A2D32C3D4D2AB6601F61D1E17A588B582E10F1A1E41E1B9D50A668C - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 3DE43B508D6EF81242CE4ECD6D53E17AC531E5EF983A5C7513DFE23912121C126EE7B697E422DD414718 - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AED0BD402177AA233E807BEB083F092777E86E574E73BDCF890AC486BBC20E9758A5361158AC63B136CA - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C510B14C8D9C0120BE0582A3E7F53C97DD91CEF554FF92B61BA5C59E49837580959EC32AD198F789B8D2 - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 68789BC8FE865E56FD8BAB17CC096F46A53632055CFA5D0AAAE0CAB3F92B3E56037218C3E8DB8ADDBE42 - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = BE1D9047F02F33A947A3ECEF45B4E95D1B0CB45E1F1F512888C9F3850D2CE1D9213AACE4E75E3AD3B5D0 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 3021CBA8E58422B0B6C83C3FA010A42CF5BD24FEAF5A078790AB83A0CF7512AA70B80F7232776BB11E03 - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 11E8597D331AC825BDDAA3ED96EF73D0FB054223307778C6D08FC98B65C04DF69D43AAF6D067FFA11B57 - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = CDBF73B3BE6C5626105ACB82F0DBC45794524FA30739CBD0511BC22D84945E7592F582C7E9D7BEB28F46 - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = C782CF1F158BD5D2FF869312F2C7FDFEE5570D126A3C9A4A76122CE03CCB892AE9750FD6AF9E5A8C274431 - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = 07C58B1E6067D4200C955A9C5F36C3729CCBDC2F2C8F70BF93E3C84687524E46304F64A8BAC888EE64AC1C - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = FFC463A337973A33D1E5C699CD0B3009B620865EBC12522B787F155A1AF37099FF210EAF8EA33552E2CD11 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 416F7F6463FBE3F053D808B7CCD4EC4CDF2ACEAEE1C2B1AF8123707623FCD92A3345CE6F519FA0C2D9EC36 - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = 394B1EDB67DF452B5EDF045AC0AC472B0DA7AF7AAF3F3CD2586E7CAE5445D52F07C66D08602185B5641B0A - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 13A6048FA1DEB70B3C413E084BB48AD2E6C202F75E8005C1EA5093D88EB2192EA3108C6B94A0C3218BFAEF - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = 084864DCAFBD86FAC5E32DCFCA69F76236E1306E7F93FF43879E7BA31333DB3951FDFA8F210ECA4EBC7CB4 - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = D46824A773434BA7DC771B1D9C68AB6FBC27C50E3CF2756D76279BFC62205B135ECFEB13EC99119D0D64A3 - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = E1A7F6D0A1E65E32E92B69ABF360940880ABA0D71B6F84BFE476DC82B7578258926022A43A1AD726E062A4 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 6409EB43C9C1B16132F0F2B9F6607CF2F7FC7DD50B397F3A6CDB696BB7018775C34CA73D8814679982A0CF - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = 332501749A8E78B2E9489534928D98356A37A9F554372790AF71F735885AEEDEAD61BA75BFA94197AFB198 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = 2D6C0D2925EE6C13DDE199361F9C456F3A1928FBA6DAA187E5AAF7E5F2DD1E6585659B6ABBEB8C2946A634 - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = 56D0DA27BFC072C74CD960781F002BA25B5AE3A50B16DAE8EB8D837620493BDC6447C5BF48B7A86AD14D9E - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 9A9E31780868064748D6EF3695E8ED6AC4346D6C9EA128551848A5EA2F2FB430303D5E74872100BE29537A - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 240C3426F4833D6E3911DE6DFD1DB717284979B5EE90210759A035F2FFEAFA72EDF6BAB122A91130DDAD7A - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 1CF0C49F3EDEDD4074A42C25332C214B1DD4AC49D4EEC8EE323B6275BE83BAC5BAC19340085E47C88CF39B - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = 5DE9378912F6A2B42BE54EAFA85A3BAA6440BFE4405859E4993C1D2781D513B1F00812A5ED64020F862A4A - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B122B04C99ED6CDA248080E2F8990AE52069D8ED84DC153907BFC85D58D7997B4A4F01BE87009B93819B91 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 06B108B3B614DDA420E270FE03CBBE569A87FEC39A2F6AE6AFD719EC8BE2BACCA797F80A19D13903305BA6 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 1B4E4D412244EB0C53A1A737522209C5FF296AE8A67E387A4FC727190F3BFEAB1D9183016F502145C87571 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5974CDE0A9B83D1F7951FE10BF6C7662597BE0614179930E66736C0860FCFB1B39535BA28F83ADB0E9816F - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3A7CE1C904216DFB2A30E0E7F0C6C3B7AAA86E84CAA3793091F52950C8CD74CCEF17C0147C69D322D62D07 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = A9EBA79480F30F234E26987AF6D5DE451A1A9FA50651B725DC8F858F7BE6ABCF345DBB3FE25922A5853818 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 28C2E3DE9945D3F657BED141EB433EAE62F588EAC3F04D69F306887E21216E80C350B2D53ABFCC0035BEC0 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 1AEC1B2188CB20A1484E4A4F71D32265C91BE55585D04D803E0F40FAC4C81C32810037B17BEC25C6D21DE8 - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = D3C564FB9FE0414DB1EB86F17D87048CA4353F069FA4B5F11AE9AA21BE69C8A5D4C91744FB3C6274738D03 - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = BECAA3E99D01F25374BCCDE07909F67AD06556152ECD18AC701EBFF4F212639BB6BEB97D7DF982865B5CCB - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5B1B4173838FF8EC00FBBF37476093C2B17722577E82E01647BF9E6A2838E0356580F9FD4A34A17668F4F7 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1C0231D7C536C55446913F0FD1AB80D453FB2C542E1DFE424A507731212DD76C5218A9A988A6E7E72B74FD - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5CDE44B6D87CE86AB718A3F7027811FCEFF6DC00C779718C864A3D8886A38AF8A7254890605F2C2C31893D - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = AB9A402279CC153D47A8C30C47349977BCDECCB56B492153F0D458643BDBC20E0FE1C3E8554C34B6975184 - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1E1A7A2CC3B969021C7269C434D90EC3DEF52EBF5B2EBD1A581ED366139ABAE80F1CE564C8AF7F8C89A073 - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 490A471CD779A86FA89BF076897CD94C89DC927A70613DC18329626EBB9DC576E48CF37D6F2643A3BCE8CC - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = EFDCC729CB26CC5FC9536290E50306094BAFC7278717A6D3282A7831FACBEA1AE8D2788B02A184533C26DEF2 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 952088531D590CF43464B37508B2F1CEE7905742857020A6C79E3A3398B90CD6F6979F4C93D8CBF8C0B570A0 - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = 1C6A69272D18A71FAEF991937EB5CC496DE1D95DA0EE703F7127CAF8D1DBB51C529EB77764F82BFA33C1B452 - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = 18ED2C2513FB63984A64697AE5BC6E4E0A18A7612485B4235043890C6B26F31ED65AEC51ED8B1B69E1326677 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = 4024341D5C6A7684094D2ECC62577F534665DA0D866694BBB05389F45283E8C782F642A4AF2FAFC4BCA50B7D - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 80E8CAC86A144B20037FE75F5996F33808E9BBC59CBF830C0EF4415F94D5AC6EE09FA1FD8F021A77CC282DB3 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 67B3A520B9D69B61CC135AD8EC0C336327F17FB5D00F06075194A0AA48CE19BE3C71D38EE48E64F000969FF2 - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = B7A10EEE85001B62E3FE3051A81653E08E98EB1051074625219CECFA1F7ED427F664CBDB59691EA40FC95EE5 - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = 377CDDC78EAE377B7B996255E737FF74A194BA5BFEDF0FDC3963DE5A4240E11BDB0451A4C1C0831EA8B93C87 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = B6EE48757E0AE6082D3168821FC70C126C2CB6F24BA7C528B28F2387FEC2424387B46F65C4955AB76083751C - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 479E9E6F3B8AB7F16E5D8E7CA497B0843FF3572B019C8FDDBA77FCACF089CC1C8B69F83E2E4015FEE7F6623E - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = 2A2E5A32624F836829EDF5455200D8C742C844B3FA908B06BECA71D8C870B4581C9049B8FB9DF5CA75FC6A4C - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = D05FADC3A0D9494E34905B40809350042ADBC3A15BDA667C60CE2ED523732749318DB5BF1178CD57D42CA2F4 - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = B1B950C10A17215AF3910A12FD10F77F77C33CF0E6C838F27F12358CB29163E8E9EA686BBC21967BC2D217EB - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = 6F860E2351E6EB94CEBBD8A1E7DDE04BC10358C5AD9566DC3D687C0E1B6590F16EF9C0C3C1EFA180C203C7B6 - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = FF3A0DA46F25DCE37116163CAD0F29A0E5D3F3FE771AAE97AB8C9C726099E1C2B4CA8EA2BCBA9E0DF14BD17E - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 9D54FB303E30C36D7B278957981F397DF8BDDAEF77D646ACF4B6276A8069DFC0F25480EC4ADC2912606E945F - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 3C2CFC559DDA230939746F0D34360C0D8A6F74150397D220CD953CF943ACD650C2499CEB9627A779FA7ECDDD - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 399C962219976AB61A80EF095A0FF626155348ACDE7CB147DCC47333FBA88F7E3F73544475772EED52C093C8 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 50096C6D903BB46959C03F80F76BF77790A088D4CD0206EAEB4339B5528B275666B02B904FF52DD3C401FDAC - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = EB43A18BCBC8A5FB061558A5A2BF7641BA51DB1D5609C90DB1EF3F4578820DB41CF062E0DC2888E31D2A10E4 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 121D62D6D91747DEECC06C68C2387681F3E6007B5D985B02FE1C52BF278160615E2145897EDD60B89C7DF2FF - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C8FE19F1A2DE050F3481B7805646106B4A7324D671880B751F5B9296F03920AB8C7A8650388E4C9CC4C6F02C - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 7F7AC537C2D15A4CD3F99E72F47CD03966940F8911F30BD0AF9620C9ACE11B400101A7705C06659CAFD25EA6 - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D9AB5EF662184007EC14B8428E13B47F8E072E4ECCD59A59A8503386B539AEE42AE541D9DA342EB3905D0172 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 48908D93866C65CF4A6AE1BE0496A7090F216588E7E533FBBE42B8B0889E818A0F5A733F952F058A8626B55C - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 98F131F5BCADA19431C9D0773CA033CF1A441045640ED789F320392270F10FBD7F8E8F23126039F13CADB6DA - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 43E4BF112ED18CC793B5EA33A596988B9CDAEF510525C9249BEC334801DC46169A531D2D7698CCA6EDC5A5FB - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1EDF9942EB3B5FCA901D29F18FC5FFBFD73D94C37434D67E75607E763868F1DF2147813ED88B7B61142E5EEE - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = FE931F5F2C33A501EF676C4360068F7E0DA7919EB77F761FA0800FD561D48EE0FC650E16585E8EFC794D3FEC - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 412CCDF8856FC281F4C1C4B1C5BD1EC1F06FAD48A61340B0877ADD97AB42CB65F3F1475E5BA4F9CA5858F4AF - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 792F60E34E0E8E2F97399772C9FA287BBBC408DBC788E3929D712EB30BCB3C5E568877BED694A899FF7F1A55 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 6492735ED0AB3767C24B44CE0E75971503A43F649D77A3643FFD3C6744E8A901E6FE21DDB1D60F2A4E5BE736 - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 2D02CB07F81D15B0CF3CFC33508A4D18C132B585C359DEC9BD95D3ABAA2A7F77DD56B158BD74C3B5AAB8DEE264 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = B8A279BEB87E3B754CBC70969EBA93E33D18F6A87703FF2CC3B0D2247C557AA05228592667F787011CD18F15AE - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = C83DB584EAFD20D4D0698942B901049DB1C07B11FCF71E0AF10E29866480FFAD717CD596256CCB08D97916CFAC - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = 29E00E82C1881E1644DE8FA656BF751A26A35EFF73853ED83819ABE6CAD5BFA8A47ED8E95D52DCC57937156D57 - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 94DDE6FBFEC29AEF1BADEF02FCB91CC6436B901A86000AFA02E18E14A2BC6418FE5AAED6550E54B0C75C22C790 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 030FDD1965AC30C43722947C71F71CBD6F7F09DCBF1BE15F9FD33C401B43CFB4EF413DCAA2938BBD9B0F523FFE - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 7FAE53F078CA65CBD1A98B1078DF19F3957E9B445495C4AB65092E3C7525CEEA95DB70BB03E0727CE53C6A35BA - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = 884A1004008AA3C99DF9CF7421A36C807CC5184793F358DBE67CEF17580B2F0254D28AD87E0BF26E8F99752609 - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = B7AEF3DDB247580D4788C520F03213FE9E7E45CFC8438CA722E2D9DE12CE4FB84BA884389CBC03D67EA5E612F6 - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 4CB0EE5B066C62708F33B7448F81D90915BFE4846AE871CA4FF11D307A7B20A353C42B8A174EA49610B381107C - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = DAF29B164A2030A37B9EF7588FA77A3AA14C026B3AD9238278B02F9A6E8D5F1851F1CF868D3B83FE6E55B4A666 - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = 8AA3947D0B39B8EE2F443741B9CC2D8678BDC0E809759E04F46CBA16B59EBFC68E33582B9AF745B7818D87F39F - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = 3EA9D960B2026A503706FCA8CEE080E4A67183403588CF8C37FD15F3DE4583F83D1FA00CFA453E5D30B28F7247 - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = ADF9658E9071D7C2EE55023DB6F7D778B19C0FCE13399E99C93EDC235A80C6D6B9E543D30AE4B212F65D917FE1 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = BDA0FA837F31091ADC378B480E9717335243B6CA237BD6190FB31B50C28803319913BB28437927722EA7FFFF96 - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = F9C5AEB97858EDD584AAC20DCF3E45DC97B3FC72CE6411B919ECB8046905CDC57C0FF46F1ABFA03253681A1051 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 5BA44589251A30313254026A564E4E943CE89AAA831F1DC4F2C8DFCFF67BBED0F86704177134BF16FB4A44D656 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 63E278ADFF540F1E938DE1F8275AE000661978817840054CAE8D17AEC221D55A8B7511ABB33A05D43A93A817C2 - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D6EE25900CD8FC4B0109679D9D86E36CCC395B5A39AF5F1340DC38E1BE6C1A9612F1ABBFFB2E7EC49FFDDD818B - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 457FEAF082D01B32D77B026CA7415C02F91500C780CDE269F3002EFCFDDDE2FB8DDAE81D3416B73054024F0040 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 06C2D6B93C9059A3732B1B088E6E6F47E45D59B5A4BB5EEE8E3C4F6FB13B21FCBFACE3692E51F33325E29584C6 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 187EEFAF01DCDBA9C58D4631EEB8A78973CDA648850A7F4DF3225FDDB75F42302D7E763E3CAF3AC6AA5E9D737C - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7BD3128CFEB387A632C903087D01B8B27F0A761D2C01B0F143260EB317C7238D9E57592B1D990BCF8F240B7E2D - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DD9AD952745F9882A89C1249A0DFC4DC31C4DA5F54CDEDE66DAF328647FD2A92B8ECC7246A3E571B4EF7E876C1 - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 8C2EE9657F692651EF7BABFF288842E399AE842256073DFA898A97A9755742C28883B2DAAFF6F69FF2BCC59A16 - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 522B7777043A396FA25CE42794B49E947B81F96AE3853A418DE57AC7E6E93FCAFCB0A24303C7850ED75917C03A - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 4CF197D921C6755E2C46BE7C1974922D7B58901429915B956C8F564C9376B7AC83D3D0BEFFE8961B532D929F0E - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4893293B161B3F5C7ACEA31AB2D659A3014F2E656503CD9C46BD0D17678A23D6D7AFCC685C4F9010933F395010 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B62B92183BF72C0EE76276C5F27C7B7266CC87D0C94FA59B83D08C5EBECFB1B9A1275126FE32C07B26097C1614 - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 59AD0157687E9D086F3C9F3B2BAC29FBEE5282C7F19AF8CED84A0C63D88F5F9DA0912E4D2CBA4823A23B1403DB - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C7DF6D472DA48173B39D981AA8B1538B3E89FBCCD586353F3BC43543854D4F49D70C447DB1826DC90029A08AD4 - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1B7EF6B397E852E526161E174628510BB2FDE85C7E7F80CFB709738FD16BB3E9848193322838CF33A707F66F14 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2FF0BF977E592B3C20A5A4FCBC729E6D9A4F55B1B0EC38908462FB270EE51E75582947F10C8B0D000EF7EB69D9 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = AC3BA4D8FD1FB7E4E4EB8AB50552F9D4FDD4FD3889350677B3C4093558B4BCAED1A3DFEF4B583AAF8AA239C10046 - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = B91BF645DEC78F44F10C97ECD539C7F78E46D6BA8A2CEE1AFB9493A92E816A9243DA94CAC3D4A89B854F3A521648 - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = A42F699565581D0AB2E63F9DC7A713A4C6853E2D82DA113116B8D52CF6886CB57EBE624A02A52117EE4235E35AE3 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = 379ECBBF47B6E1DA03D4478EB812FDBF14B684873270F4FE485475922607D6152226C8FA21DD2F80CEF0A606DE1A - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = FD3AA86A08FD4717F72B4AAEF3C7602625473D01D1F1FC9AC3888F19643C21DF912A000561C6B4D03E6B9FFFC6C1 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = F2F7A126BB0F6201D6FE6C8C0DDBFEABB9F268A5E32C706D862BC1D044E1BBFDCD5A0D7C2D7552DCA07C93263667 - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 93241CB3F9692301FA92CE432B41A738A97C8C963A1070BE5B94272432962CA185A60B80D8E2381A06BB3B17ED49 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = F926755417B14E2A2311666E859AC442300D6F34EA2EAF7686DC8D479E14C50695CAD3148B115D0049729DF688FF - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = F9264345789E4D04D34E11975F30531399178E347E16C40655DFEDB427EE48BE87D6FBB118D8BFC7640DA98AB628 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 8A9502076BC037BA0151DBD9CAE99271E374D0392F4CAF24387EC5D78A62DE6F90F66196D56C7FA672C17E2BB80F - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 5E09FCC818B7A030950ACE776ADE597DD9A6C94205B96880882A8126C8050198DB00FB8041058B0653A89398CD78 - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = 125EC25CFB9D5560DB280AA64770F4C75C693C8CD7B13850415B14ED80E9E4611A53C20F3F0A535E4ACE65D4D3CA - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = 47D044733CDE7772675885438D74BEF03C1B1259830C72D88785000F2527E5BEC89368A284BA670383A8CC30D9C5 - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = AB1604655F43A48BB54EEB0806404DEDE9E0737215E6F059B68EDF6D3AFE757639F5B4E775D4933DAB15240CBE27 - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 30FAC67EF992281C6E5DAD77E993742921F25F9355C8E5C0CA8FB92E8F26648571068D292578EADD631E9EB81B3F - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = 58FE5607046968199AE075CF2F45D7BBA1D0E9BA3E974CCE7AB8A0800AFD0DD0F77060B5FED3D92D5574A25BDAA5 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 2E68AFE0E999EF4D857F6DF87E255F8A5E23F789FD17E4DD5B3A013B8BCED8E98D2E9CE17CB131FF267B5A72C964 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = ECF0737A2A834AB186038F33B79D8B71010DF93B61E3318B82C8E63746F8A62C61665D9425C7C5511ECBE469279B - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 88215258ECEB460D7504344F4ADABB498655D69987AAE0640792D3A9DB16169FCC2E02715F61B59A3E0E69222287 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DCFBD0CF6175AB114EA0B1C9039F850CE9D9C0226E4FC5D3BE9E261AE00DBA980F76F5327710C9F6A25A13D5A40B - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 09703EFAA0EC551EB94104A04A8FA2DB44EE9545482DF2DC5E99B59F3607C6054BC07FAA2DA0C76A670AF58344C8 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = E35DC7B74BEE47C906A2F61C0D91155B62882EA23411BFA56449C7060B2FC348B84E5F74616FB0D2F386D1622BD3 - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3847B9F973C6E4C4FC5FF29E933AEC5704E144E8B15E3CB72B6C5F560E6957B0013C927ACF155475C86585812C30 - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 6BA4DC49A181BBE13EC0933EB404E856E6DF801C003BB95170D63225C3D8A27501DEF5D7F50D0BB5F53C69CE1D6E - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D45170DF12038131A4C49174E4EB57424F440DF6DB0E532200A4FC7DC6A7ABCDCEA28ACE19184265BDCAB3135F03 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = E3C8D311096371EEF95F4E829FC8B98A2E4DCE3A4504E0AD3A72476F7DDD9A0EF43F40FD1AA580A5D76C7E9642CF - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 258C445427EEDB7046D755AC809ED35FD28A06ED7F4F9F6675E334F7DC3E50FF1182C20A4C08E163E7C4D91A33EA - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4A75598458FF4B69585F655B96397BB0ED234539D766DCED53ADC54349B755A062EF527C8AF5322A1CCD2884EC21 - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 0340DCDB13DA236BC7C11A2F81A1F47A59B4565E5AE97C505AE46A5A210C149C24A5F3D155B77D4C356665BE9D62 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 35FD64FA299CB7F1F8FB9B64CC34FF89A306AE9C4A4969252A7D6897BF74CC21AB8B90F7F10A3C6321DCF06519AA - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = FAECECB82D672AD5016280DB308DFF96AECD3B32766D315D37D8D95732DBC0E7437EFD3855EC073499FD234B8A97 - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = BD5D0BC4174AAAE88A91FE7541DE277C611F2F2A948AE3EE5CA73A00818B70AD3AE94D5D1CB32875F2F805B4A119 - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 69D9D819CDB976732D217582C728E704A11F102D43551AB6AB1DB5ECCE3E098989B2A74B298D5580A2E1B7EC10A1 - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 4D9ADC0BF02AF70A2814CDE85C6FA9B3FA02D0CBEEEBB049E3D90EFC5C5C6C8F13DD817FECEB941DE126B47BC0A95B - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = AACEAA4A8BBC11ED8E154F1261B0D2669A4E9143A293FBAF451657D2DD1A17C5CD9715D9AF76B4581CCB69668E2DF8 - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = 3DC4981029727CD4C7CA62011A46888A2278C94E26BBA178FB4B3AFAD3775BAA8EB9C5E29AB34F047CCD395C0BF564 - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = 8BEAA4CBB05E3311C352E7214AE46D01C3763D02571F5719A90387789AC654B9CC17BE390AD7AC7468085B487F6000 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = 9F3D1141314525F81BFC7677DA5B0B5717BEFBBEC818A53002251125369F8D9F7D72E659AA4CD41A24C719FD47109F - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = 6B140EE248DB6ADE5555ADFAECE58752258B93ADEE3CBDEA86E5738B21CF0FD6C4BEA32371D907039F8080341E10D4 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 01173950930C548848D0D07743C450D1882F0764A275094B33F6B25617580FA834CD6B3A1224B39BE2EC96C04D8CAA - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 30DC22068F913550F8BD014E755796188F075A7032A8FA20996BCD6D7E908FB1F1CB3E00822E3272FD54B437A6D166 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = 154436B0F082322A3168FF8DA130D4855824ADE87CC9F501030445D091EE1E1B7A4FBC68DE29233A8D040DBBA52714 - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 4056571BEBE4B2FA1B8B5CA421E84778193F5EF213C810C761BF61CE9A7C0591BB4E6179589B248A52680630662CAC - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 7AD7E4D7715BD8E38B31061F4FB432BF8E74383FAE381AF3FF112AC75794C763A55EA28C96BE3AB8640511769DE761 - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = 97BE5BCF9463930CE53636607562FE30C3E5CA28F7AC25675F683E9F02CFC64C71A29BBFC2DA8656F2FDFC6C56071D - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = 9FA7311184278879BB443D88EFF9FB9EBA8BC93E9D75ECEAAF8891D5A75EEC1B102F012246B1D2DA6FC50A75B49F51 - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = A6377BA5B18249B8FB572B8107404CF18AD87A63D0EA1C45314500CC1AF12A8F80754DC7A05E48D200995A281BB3D5 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = DB691E7C99268642EC19D0C8799750151F064B9B649E0ACA692FE78A28FEE7751C4F79C053B16D670EFF65B0AD590D - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = 446776A386FFF07AD1B58D2292C14B1BE445E342528A8B450543D530523959A4AAF16D545DBA739DD0EA9C63A6EBDA - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = 2FE478180C687501D71A7017893FF11853B6D7EC57743A0A87D6F3267B0E7601CED4A1E3F7E6FE7483332FC9AB308D - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B899B04CC6D25404F63ADFFE48FB9F58C50D8BA04DFD78C938C1DD4DC128C9444AE31F012E82296CB25F1E386FD2A7 - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 17719EFC83717F5C7B6D26DE3B655D8B2083FAB3B82E3DE29A1AAAE416E5218021D8EF4DD3B25C104BB6AC88EDD335 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = C32018CEAE2120FA9F74BC65B008BCF8F48A120C750059FE26D44404A1F34FBB3D093BE24683DA8CF07CE8A146F463 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 03BA31A007E9B85F54C8E7EDD151CA68392351B658C125C931C802B8A88E73172404793B23F2FFA4CDF5E3CEC8BA40 - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5E5874F5A33939D59D7989C7A0A07BFF9FAE81E3E34EE0717C4D55ACD22561AE2B99E3E55066EE9740228CC8D66226 - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E55BD12271CAF0CFF53665421B4FA84F3C47D3D682D787E37D5923B627CC7EF2458099833BA7EA8589858367B446E5 - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B5F4F9B75FA113EBB64CC9FE47BB53E9CBCD424F8EEFD39303CDF53A2580E636E59ACE5656732BC1C27068AF678BF0 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 8A74C5947AA10528D7C468C788105833E306BCA70D26FBA7952110997046809E201EF3B6BE79A07DC6DEF2F9082949 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = FC9C817488E7ED024138BC8F17FB226D0E67E9D88ABE18D46BE7EBD8CFA47E88F173B73E7DD1DA096BB53156847404 - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 01F3832DB7CAF37954437F0B7D3C2FE3EE1E77BBE6D10621CB0C4D9AFC93F3E32AD9FA54B249DAA329EB6F2E177B4B - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 62D5D334CCDB01CEC98064D0DB12F7B6A5FA0229599ECF8B529C79CB3AA8F36031D41C2D56B11C9DE39412CEA9EE9B - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 865427141166FBE5DD2C51D8D76B360CF465920D6F04C6815D273BF2928964E230419E29380F63E5F0D8A4F23870F5 - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 2B01D0C619CAA175858FA196805F6E07540AE43FA62DCF77168A668C001CF55DA189BAD81CAEF0D7D5FE9D4FC6D78F - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6984E144A2E91D905218A94C0B141AFE92F7E0E355B43B8A48B9988D4B3201B0DEF89F501043DD3C2E0B9D119D3FC7 - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 209685C1C5FEDD1D7F8E984982B57DDB56670A723B0CEB4CF5F91B88CE1354F4FE2FCCFBC822CAF113210D837978CC - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C3B38384384A023B5F6CF0713AE069EE8E2A27AA2AEF46571D8345F6D9DBCDE0F1439AEB19375B825251191B391E2C - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 27371D8ADC21BCAA8B25D7728467F7D5034ADF5843E37C600A8C37B993253C09FFEFF0A3309EFA8C6FDB6F08E8A71B90 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = CA8C5690399601E7D0878BFA71929BB5043DC51ECA6A3066001154D45395AAC1BD7EF7EF72103E90259B62FDB7A9ECCC - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = 5762AE4D9DB66EA180B231295508B4D41D4F8DFE74B2F1E910B939FE76C5CDBD8097D1120AAF76A0EEDA77A9CF22FE2E - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = 8E52294D268420E22B8EE6996E302D2142BFF1EC46D48BF5B239F1B88D344F2DC12C7ED3198485D730F16FEC0E4006C0 - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = 6B1DD272D0BF487600751A65A8AAE690DA8B67D61E1960A6FECA9FAD46650E266C7282B7AE9EEDD8E3FD8A1F1B12DE88 - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = 6AC21EF1FD293FDA27605C0E3B7EFA9ED2C80792342A56754625D6D1593F871A7014353B6E321F1AC068B1AF6A2144A7 - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = F7E0B99656D311A8FC85559DAA1F3015B29F781EC2CC1A53E0600B0D91BD07181BE184FA7AA55F2B9ECC29DB8185DE29 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 8DE19B6CBD291D900DF3BAF1400D3B496C0A56C34DB4D52F22433B6D3417C19FE62BF66727E6492465910B0128100504 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = 98B73C7783FE45C5CD3558FE4E9CC4974BADC60ADAD8D480A2A97DE44DD268DADDBAD4EB3A17966A038AD5AE2C6CCFC1 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = 2C2C80C46D20C6A1B6E8DD1C45E82834617DB1DD20908631C06550F3984BEBCEEB4C3E6B57CF825C3AD342E0B1F4B546 - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = B4BBB437B5ED41802A4FB33DAFD1BEED7209E77DBDB2B8D02ECF771E9F029A82EF76175774BB74F523128DC29741D231 - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = 73A31AF12EFD0C38477A7C82EA47D22702E2B02ABBF3A226D937B5AE83763E75FDCD9F18556713E8FBF0D140693BBEDF - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = D86476282B18B397ACDB84E197710AAD02584F427CD38020447D891D0DDF8E9C52E845BD496D51621156FA79FB53A9B0 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 3E739C1937822B89501DC8E81C5B42033E3A37E304108C27FDD00CB4C67DC041C067B120B348799BE333E1DA39084F01 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 50848D70E65BF3C6C029395AF5D94798B2DDD548E701491CFE5C7D59F14CDEE6D8611933145568FA885E95EAC2FE3C72 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = 9593262E35221CCDA7938F3C408962A988877C699ED9AA291252CD2383CEF284D7DDF9F8076449E083A89A8A7527C8E4 - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 2FDD9017A1FFF250633402F655D418B4A2D02CDAA97CDE29242B6F6EED9C995DEC8FEE9516090542D48822815E62614B - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = BB6DEE1831D5DE9BAC5CB3CAD00F7D488D97BDDE62599EE5CDBBC993C7C349A9278AA94C4743DC2E120713DF8AB32EEF - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 05F26CE65857393802D6EE03C52A97D5BF1D88F6B6257E2680B9DFB9EED70161691CCCB237E4F4F40619B92ACD659951 - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B615E3B4E109DE3851AFAF6FD2C78CA29B6F5147374EF1DA331C28222AD1460D758FF202C0944E2432188B2D4A529627 - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 34763C8B76DBC6F32E686B6DD25D203DCFDEDE1EB9B68F5331EFC779665FEEBC63D95CA349A1D45796A62326BA263446 - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = D9C7D0FD9AB9E1173FDEFD4934306B30C60FF1ED77F2B1F1116092196AD1E0D90E47709117D53AD185F6E2781DC4080A - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 897A8221995015E16BE3A494F0FD56A98BB3516575EB4E50958E01BCF36567F40DDB1CE10C332B06285352C8BE1F93B3 - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 4B3AFD6B39606AFDF8FF6B516BC427BE3411D0A8E89A3D04879310DBB30E319ADEA6AA25A53E009925CFAE230DE44CDD - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 56CF988F23409C0AF729AF79DFB0870F0F541874B1900D453BE70037F2075CC53B1102E33FBE0A8332199889E7734929 - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8EBD6A35B6FDACC31F91D782984D6C5568DC890102835506F94E162CCFB5930035D1A6C0303F76409B6CA5C13EC0FBA2 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2A4C3F95434BF2BEE60363D605E8ECB6F2715521EF381FC90D2C030AE5A2D5528BA42C2EFA2127A526819BB6F3778D77 - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4226EDDA3AD70DE3ED6234599D2BD67CF04C145FACD8B0D1B9EB92C69F724EE104C8894261C58F8C9699E741EF9C3AC2 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = DD8719547E0EAA3E6B60D31044EB55D2B461AE679156360FE78EBF665829D1643AF4AE873EED02E4493489A39F9498CB - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 6442195505A743BC1AF5184978F845AE48D821DC264292576DD8FC2EE82D082924A317108F6C131184F500E336B5B3F5 - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 6BB9CDFFE53C0369453B3B4CCA9DD45E5063F294A12BB2902C83B9309880B229AA25B9E7C7CA06920327E75279B27CD5 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 9F8B67445D2191D9B19F0BB29C5ABFD5B2144B562D660DD2EC3E64C3B8ED8C735714EAD76FDF5D94BE66CEB7A4A3A679 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 0001020304050607 -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 13B7E23CA4D9BA48C512F552C3DA0A40D2F4459954B6D11DB1A598812DEAF417FADD8FE2A153FA8D52CF6B2DA5749500 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = +CT = 2EFEABD1C5A2293CE96A9CC702BE2601 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 00 +CT = D7AF70A2AF187E8EE1BDE824F5239CF8 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 0001 +CT = 0414EE784D0AC23CFA9C20A185095010 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102 +CT = A9EBA632AEBEF2C22BD35E1DDEB3CC0A + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 00010203 +CT = 32CBABECBB8B7434CC32CB159C15D2A3 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 0001020304 +CT = E46E6FCAA6248E4B780EB9DA5CDAE66D + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405 +CT = 7D8531D060A3F09A547FECF03CA1CDDD + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 00010203040506 +CT = 4C7E1AB11FC88DBF81E9799290A6455D + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 0001020304050607 +CT = FCAAC8943224BC38D441D60987D1E142 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708 +CT = F30E53E329C8FD3B41C723F61AF83B7E + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 00010203040506070809 +CT = EA718197F446B789D5F481A12F6EA43E + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A +CT = 83FD695481492886AF4A8C7615B92CCC + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B +CT = AFCEE836CB715ABAB7A0FE5A4951EAC3 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C +CT = 703A2D23CE25B858ADC0027B8015DB47 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D +CT = E0DC2D0821BB4B27F54A887A18831F1A + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 1151CC5B870B1F3C0298547B5E0D89A0 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = CF46FCD5944DD708CB6980B9DDEFE199 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DE05CDF59ADD1B3328A095F1E15D3693 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = A9CDF307D9F47956DC66FAB3E63D818E + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E1AE8EA2DC7C3907C6D64FD77A267F78 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A32D573042BA74DC3AB45896670132BA + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 525E5FA580C9935A34918158BD9A06B9 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 07962AB39F8084DE3DE2309450915C26 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 148BB38F83857EA9C67CD72E048755ED + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C69407F3C568533856FD22512A366D5A + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CF20484D82378BF259FCE7982E6859F9 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 226F4F6F3F24E1F1F4342B67ADB8D91D + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B03E788639DA33C3A24B580A9BFF6DD0 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 083A53D86B1730E8D085701566362692 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EED206A8C2B2AF933A0177FC335A2906 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 01B048F32F886A5FE9C382A49C1EA17D + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9DE12A42014C930DCE7478990F07F9BD + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 1DEBB84A3567FC5522BAAF5A93AB51B3 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = +CT = EBC01ABC73B5E238CB247FF3F323E41BD5 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 00 +CT = 8AC39819909C617D55655DE74FC1874D2A + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 0001 +CT = CD210C6A2C8ECED864245BA56A9EC5A278 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102 +CT = E0E187D3C25E2759DD9665778A2BE6FD1A + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 00010203 +CT = B100ABF82EC21A701EDEEBF9C2A3ACA47E + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 0001020304 +CT = A4418F5C9A8648BC4B500978492103E116 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405 +CT = 0A0241218316F0806A04C86790D410063D + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 00010203040506 +CT = 1F9B966F282832CB008BC563F51F43968D + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 0001020304050607 +CT = 35C23359A27D774933BD4ABFD8563C9F51 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708 +CT = 50F2E047C829B9496136E57EC2BCAB8979 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 00010203040506070809 +CT = 0BA22A9200392994D5882E0901B2AC2EFB + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A +CT = 99A0A1011563BDAC25D41381B9F2B8DEDB + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B +CT = 5565DC8ECE0C9BA6EB87100EA268468A61 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C +CT = 1B15D301AC820A0F32648A2875055B1870 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 9D419DD9F098D34059E8479A89D24ED4A8 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = BD33B30E0A43A097AD024B39884EC462F4 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 4376FCA8FA857C49AE85C03C86435A36BB + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 1954806438A6E374E72A4B91ED193CC90E + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = BE9C0E0B820D729446C65C5685110694B8 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4F4398E34D2B4465B003B3A46572E6A85F + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 595B61AABDEAB4CA42E406A68039E894BB + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A61A82E50762D8F088EB6880603D4063A3 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 46BB812714ADDBD81900C1C8A4787FA5CC + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4D9852B71BC8F32C593EE6AC0CB42E88FF + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 34A47A77C5B5DED8889BF0BF49968A7D0C + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8BF4EB3A1C7A0201D6FECC7BE58ACFE85D + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 345A6A090FD643862700644F81157D390A + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2830B86350AD293ECB768D2B889460E0AE + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B9742E4F2F458D80CEEAB1736AEBFA0334 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = ADE7C96E0D8E0184BF566D102530CE8159 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = EE4EA7BDAE37B0C5D71ABFD16993914502 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5F9667359F20BA4A0CA597395914C3694B + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3B8845CB43C83F7DA6E68D6849A8213330 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = +CT = F7E3DEDA3B4457C57136395E5A569A9A4484 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 00 +CT = 9600FC4E74D4F6D9F6237531B490E5C418B8 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 0001 +CT = 7DD87D4E932064EB53584FB652B9F3B77870 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102 +CT = A486618FFAF0100C45BC2A29BE092F0841E3 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 00010203 +CT = 5416109EEACF6859561ABE3FF23CF40D10ED + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 0001020304 +CT = 08C9914E1483EEA075B34DB4C5668C44F672 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405 +CT = 13C6477F72913AE70F5E3FF2463982A48E29 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 00010203040506 +CT = E82B870894A365E2E9DE6F54E512EEEAD5E9 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 0001020304050607 +CT = 82109A70448ADD74A13561B7B0F4D9DE5F67 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708 +CT = 0D8186BEA5C120A7423B1F0A1DCE29FD9406 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 00010203040506070809 +CT = A5A57F648C8981C3D45FB501E1027268F748 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A +CT = D804C6EEA31FAA9493DA5F6AFD70A4F843E2 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B +CT = 05DC0470D20D60E9DD998DA0B18198F390AC + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 8912C1D4F66AB22E7B856EE83B19D12C57D7 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 37E5CF6BF2161671E30EA0E0E96F1A19B33F + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 327F91112E9AFE10F6F3C352C86819137959 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5B712E8D019D4DEA6DF403B230FD8AD42ADA + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = A92BFE32E855A4D8099CCB26CBBE0CFC8576 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3CF9592FEBC04FE9C6FD274B786DDF044128 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 8C6324F3A5592BD8CD28AE23AFEA1012D56D + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 60CFAC87D76A451132CE6905B622887ACA4F + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D48A44F822A1ED337890C82AF4E4D4042C6F + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EA2F3687CA7DC48EAEA69898184C9EC58A73 + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = ABDC9710D88265D37BE66C38E58BE0316326 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F990121CD7AFE0FCB41F2D4E5C508964D343 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 375DFFD188611BCAFC08B4C50AE1197EB659 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7A3B2492371B136BE17D15193831D92D1B7A + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F573FE6A020165826390C92E0140EBA79263 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 24985799C5A836F92633242DC621AF7FB0AB + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EAB0F02D90EBA309692459870F0F6F4D7018 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 5BB3A25375E0C3ED3DA6892D7B3251A99C57 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FCA00C7F7750C08D435F022811876B0DE1CA + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B2806DA28D20959CDCB65BA461C429D8C243 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = +CT = FEC0FBEB5FF8D059B594F88430CCBF1A4CD23B + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 00 +CT = 3C0A71F8272FEE08FA82FCBCCCB6E0B7712A49 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 0001 +CT = 6D4B78BE0A1A8B905FF1959B3212A903F7B124 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102 +CT = D1560105954C9DE52A4611A23CAE5467B6238C + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 00010203 +CT = 249D1EE321F96DD4A9DE8E9B781B534FEE76D8 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 0001020304 +CT = 05B36C3031EFC3B838EE777C4DFE9924A6F5AC + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405 +CT = D49B835A2B81BFEF6CF731861538BE55961623 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 00010203040506 +CT = BBF5C8806710282FFB58A2EE0B5E22F3251EA7 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 0001020304050607 +CT = 77D5D63A6E907D5DF7961D8349898B70FF3EC1 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708 +CT = 58BB4F48238794DFAA54BFC54095EBC188CCCF + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 00010203040506070809 +CT = A74B403B73170F7FE146333C8064D4D4C0228F + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A +CT = E8740A872C449251CC245C7E0D968F6C411D17 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B +CT = F22F65CF48B633CB2E63A4BACB0BC97F84FCF8 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C +CT = DF2C4E9135F4BBB18E820197D4AC0228565F60 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 4088F6A0011DDDC41AEC658B271EBF7E25C67E + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = B58647E376AB5618A59EFA569A049945C21DB1 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8AFC094F385073F6AA279B4026AA45A6D4CA26 + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E305085624B4D497642BA5C3F71B0F007B038A + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = FC1C8845AE8295A8FFC362E47C7F175FFA3346 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D92881DFA216A44486E98ED7EC72915E2F2206 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6F6A28591D98C4F7F5EC92E4639C91DA6E562E + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 19116EC64827A430791519D12399A099538C1C + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C11E4470FE783642F9AA34B75C78BAB4134DB2 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 50D0DCA7610FE50F88F61821E5999834077AFE + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = BB405922F4DF5C63EE6C553E0F3097242880F2 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 39DAAADD68E486797C0C52DBAA1D279427DDD7 + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A53920D5936B1DC77D1842359A252DC9C7F754 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = DBCF2763B2ED3F7ED6A01CED874EADE7079E07 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = CEABD933A68FF920E909374B59AE10FEC4A1B5 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8FDDC90AB6BC5A9ADED06DD54F2FB9D1185830 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0A2509990951A014515360755F7187784670D5 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0F227CBBD90DFD94F818727BE8A1E43F9D7537 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6A0D1F037AFAF04A33DFA6438A2A2A7A90B450 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = +CT = B4FA8F91F37828779303ED0FE0010D41052F9B79 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 00 +CT = D637D6208CEEB5414A1BDAE691AC8E5BBFC9235C + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 0001 +CT = 4A8A819C33F179C61EE57EC45A475C39572633D6 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102 +CT = 6F00F8CBE8CBFE9C134E8E55A2512545544106E3 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 00010203 +CT = B9113889520D15809D6C6420210A432A55A9A5A2 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 0001020304 +CT = 466ABFFB47263F880C8BA1C18A4E95B8C56E1903 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405 +CT = F16BFCDA7DF4964F12C8B354F67136483A3E7E96 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 00010203040506 +CT = F0CE0A5CAB618F6AFC08B6E635C6710432CF59EF + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 0001020304050607 +CT = 236FC7B65A978785F1F7DC3F7CB04EE394290AB6 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708 +CT = 7B37B944A86801A15D600B3E9C62409A2790AE2E + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 00010203040506070809 +CT = BCBA5F792A9710C4BEB11DA0EC7972A0C14DD60D + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A +CT = B061799D1829BDA5C2C8AF33F64F2D6299F2B11C + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B +CT = C7ED3CBAC96E85448F7C76619395E5FE7F997586 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 1899F6444E58E181F38F600FCC362835DEC71D4B + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = FB6388D2E0B6349EEE08AFD62EF0BA4B3BABE44C + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 65B119A7379D66A903B5BE678A0845269FE69ABA + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = C22D675BA07E82D764CD36E3915B924E502E8E97 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 605E1B679AB32BDC3984FA600F39090E7F80B6B7 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2F3CF210A470573A60961E0833B69469A6D22A52 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 99AFC5DCBDB25E2923F4AB60E79B8CDD411D789F + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5A79AA952918B6A83EB475892CEF0419F8C5565C + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A6A09A2C4037CCB57308CD125F892DFDA404D110 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 880D7BF988D01D700F17511FF30AF365978A99AD + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = F41FF499B5951673F0F567F0B0549DA0DF87E7F6 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 72BBC396914050BCD750A47E3C6CD78BF843B0E2 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 10864A611BB66FF41BCFEF6F35B63A8FFCC87EDE + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7AD56240A8678EB5CEFF3D7EFB0A1BEAEDB4313E + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A42E50DCA8AB7A4FE931D289E9C7C4B42F592BEB + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 522F6A637E1527B572506389B03A00C087C2EC64 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 05486E81285AE22CE3B0A67013FB2C824215DE60 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DA9DAB7F8BE9FFAAFD11D6CD63554DBA987530DE + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 3FA20993A855D160C7CEF18E875350A66AD47260 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3A2A6A9E165D16751E5A43F11C8E2FD6FF0ECA79 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = +CT = 8ED11021278F4A1912D82C67159393E9369883624B + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 00 +CT = B7772FC5A677C32E0DC4416383C8B5181EC5C34C1F + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 0001 +CT = 604ED35E48F5976F7286FFAF58F23D108D4C5304E9 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102 +CT = CA14074D2D09F533B973EFF7A67911AE678715BB5F + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 00010203 +CT = 97E4FB4EB9D7539332CCF37D69FEBB772DDE3F20BC + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 0001020304 +CT = BFAAE2759DC25B3142C757F0C4E13FA01BD7B7D07D + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405 +CT = 8C0BD9E1CD3338B9A9C47F5CD7A81BF1CC810EAB11 + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 00010203040506 +CT = C52C85F1F22871114F4D2D37D525C0F464382E9263 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 0001020304050607 +CT = 9A7E44ADF94B62B7A6A93FCF05C297D1553F0959BE + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708 +CT = DC2B8F5565B1E36CEAB464E25817AD8A241FC23B76 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 00010203040506070809 +CT = 9794EA2703C8A91642B327BCF8DE9A1544EAE06148 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A +CT = B74CB8DEE7DA36AD6318DE711DAC234F7E97893F8C + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B +CT = C6DFC377DE68E7D97016B1893B8D0B3F0D8DB7E2BD + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = D67896CFE19A75AE6BBCCE49163C9EC673B5CAE8B9 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 8953C4201F0FB8619686A597B1479FCCF24323D2B5 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = BC8DB36D2A7250FD38447D943D30CBBFF4B8750D66 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0D05C52EC02AA45C97ACC1F32D41FB4EA2D5CF4690 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = AEE361AEBF0A912DB1C291BD5DA3B5DDC0008DB966 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AF08E040137BC0F331490C42BA17BB5F48959C934B + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A024B025DA2E7A3E0D43286E7025CC0B8CB0EA98DE + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7941FC3CD9D3579AA9C19A2C7CF6870A96AC80F021 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = FCD1BDB0F3D6D51935A5DD3E18B9ED2925FBF64F3A + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7C8AF64FEB6DA929C771AFE8CE3D1163246F4832FE + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C6A52135301D76529F2BD50460368467D107605A8E + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 22E62A6FC5BC05E0B89B37EBB23C2466434F83A8D0 + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FCA24CBF402EC920B1B36D66CF843B165A0CCF9096 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2AA927123636B9989744ECDDC8BCE9D7472996B706 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C43E27CE37402DA338631EFB425D90B5830334685C + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = AE7BF1B81C2944F146D4E52D91EEAE7BE11782BC63 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0BF8771472150B6A9869E18547E1D32B0474E7A056 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = AE79BD19683C3EB0DBC45F2E12BC3547D6488090DF + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 45206B1D4101DD448C9AA2CEF825BF826579449F25 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C134FA9C0387E9A582FCD188F30BC1B98AA25A9403 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = +CT = 262A8EC2DBC9F2484989C138593C56C5800B6F70B9DA + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 00 +CT = 0A2D59D4891ECA1AAAC886A6102B822F28631EBF23C0 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 0001 +CT = 830389499F63AE596FD4D7ABB7EBC4895BE23834E86D + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102 +CT = BDA34695791EFCB6A61BE84DF28B9306CDA210EC611F + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 00010203 +CT = 4D1F93F18589774ACFC1DDC5DE3BAC70C61FF4052E26 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 0001020304 +CT = BA15BFABB64DE165D3192FFA2D70ABE48577054DE906 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405 +CT = 121B3075E32CC837A79A712520E72248D22647BC7596 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 00010203040506 +CT = 73EED497E4730AE9CEBE917E375A8C202E3CA57B0E7A + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 0001020304050607 +CT = 171E198646AF7766DDE073175B452961C68957748A32 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708 +CT = 58E12EAFDA25D76E66B4F5FEFFF7BAF567C4C782CEB3 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 00010203040506070809 +CT = B9A5234A52625510E1F2919190D0A9E793A29CC43968 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A +CT = 58C0FBDE203CAA4E3C22D16C31172EEC3BBAB4707EF8 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 0DE579839DB01BE15545DB056D0B1FA0AB18DC5D339D + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = C94A6979B02563B80C6805C8A935FEAE77486A3D0FBB + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 5239BE7351C4AFAA397027C8CFBC32646CFDB89C055E + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = C6C1C026E99E48821A708AE33D44A65ECC9147578E9E + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = DD92B770A9F4270D3FBA16610C1741A99B6DA044FE50 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4958D9423E0C5CEFD0D7B1579B5D0900FAD864859E51 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5041C91CAAE35C6A9A4FC4625F09565BF5C5054ADB9F + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 13B1081F194E75275745E2D40EFC0279613699735366 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 2662D8A1621EFAB5636592BF6553E667DEF9B3E8A0CC + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C5418F1235FB2FC06770CD9F1A16E3E7844C02D87981 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 77728B453C8753DB13DD570E6E8EECF2435E043C1AEA + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BB6CB0AC815EF4173A3FD65B9088E4D9019BAC45DE10 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3EA643E375170D10C937B133C93B9F5AC5163F2637B4 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D0B67BA943036B99CF0BC6F02A1C2DDE2DA409A9143C + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF495B77B89CAC9865ACF760CD208FF3C8DCC65EBFDB + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 72934637CCE6C015D517AC38D7DB3224B39DDEEF8F34 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0F780C5ABA285773B04EEA9F0CD44145B15047F7AE1D + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8EB997D47228889C1023BA1879C768B9F74D8AB2EA5F + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 315F399BBB9FC77D09184B85EACDAA9782F8377AF7D0 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7E9D988D8E075BB3DB14235BB5E3C91059541CC659BA + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = DA592246F421721EE039E3DCEC49FD93818D205A45E6 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = +CT = BD9FD1DE276BE8958017AE79F031689B93C9AB58B78A90 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 00 +CT = 5A1302A7F89D101D225836056ED710B2B50E4D60A72537 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 0001 +CT = 96768681AEB949D18F57EE07E5F6200F88CFD2EC62F995 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102 +CT = 6B16D6465A18FD8C65E1971A952A47866571D676395C2E + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 00010203 +CT = FF823E81422230118D9B2CFFFEE220BE6C8F55EA1C66E4 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 0001020304 +CT = C30CDB7F411B4543AB2842C2D8C16A284BD7E04661CFBD + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405 +CT = 2672A2ED477DD6498A507C46A30B10F6C54320A2FF37E6 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 00010203040506 +CT = 360A88F239B6541FBB3E0C6067BFB20570F3F053923BAF + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 0001020304050607 +CT = 0DC9400077D8532B80F7B02178E86EFBBD733EDB8700B2 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708 +CT = E87E4017629911E2FABC320BC82A170E3D4AC262B25DA8 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 00010203040506070809 +CT = 86C9687C27BF57310F5C60534C8EF3DEAE58A0872FE471 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A +CT = 055C885179A78EE0851B16823A14E68EF8633DD51B51D7 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = C8F8EC4A1240570BE0665F3E0D917BAAFD254525982869 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 42B3EEBA9CAD6B9E40EF5936AD7B231ECBA9A8324597AF + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 0E8D7B3BDA922C25F43C6115439371E1DC24AD8109A5CC + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = 4C572BBD896777DD1E2D8416C498801E6FA44853FC2E5F + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = C4E7D204A262DEA17B6758091502F4FBF9A7138728F9B1 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 63D73FB2C73C858036B97F1921A25BD6005FF07B90DDAE + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D80A978B52D038F0FF328B6372A4939A3F36BBEA4B7CD8 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E871AA208B3FF58AA59EC9143B89585951FCEDEBEB2444 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 39E8F4F9B41E924161649102362E8A67002DD8C93DD2B0 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 40A803CA43CCA5CDE462E1D1C96E58715393F55347C43F + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 561CAFF5431E745EAABD50F1702A1C402CD4051B82EFC0 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5419C56D669BCB214CDD30802C827AB34AA5FF259DB410 + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C3E97220EAFFE74520E89E0D1A3C208B6040F14A047B4E + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BF41F3D03EBDF9BA28D03774D0D17EC176D20AA57BD013 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A26E7359B5AE3AA9F0D8BFC64D475FC4C3CD86A1C34B74 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3022551BDE56B5837F8F8B2382F0318F2C3F5BAF634C73 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 05E8ECC6AC1E4DEB2938CD75644BB1CB9A256878A3569F + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C81E9D52B4BCC5B0D95CA168E2315FD6F922B09405B333 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E31D448C301ABEB4121731E7344E97BD486917E53AAE24 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1E7E47DC02FAA26CC21E31168F847061D5D3A9FA1CF05F + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 459B8D92AF4BE076CCB6E2784D2022FB08ADFD5604F7FB + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = +CT = 392DE479F923BBF2BE90AA43A42992508C11E6DACEB3792B + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 00 +CT = C7385992756B0941780D505F2B07A0F661CF958A119CFFC3 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 0001 +CT = 178D967ED3EE33076E8460A26AE4759A674F52D0A5ADC0CC + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102 +CT = 003F305B34943DCBB71A96F2A2DC882404ED4BC04E7C9C03 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 00010203 +CT = 4C3F642C9A82F11A01F7B44F1B6297FEED80FC8762198935 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 0001020304 +CT = 508378355F3D78841C19F11E94C3EE268AC87ABD0365AD11 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405 +CT = 4BF76061B5F1E5E667208D202E91FD4B7499B4880D8FD8CF + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 00010203040506 +CT = 5A82ECFA8AAAE202AC71A0EA45A8CA17B725EA365DE8589D + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 0001020304050607 +CT = A1C01FB8DAAAEC42DC702AC183788AECA12C4548A99B9166 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708 +CT = C691624B5405F091E1EEB57B6601893906851D451E0C513B + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 0042ABD5428C3140E576A9636434AE5001D2A07EB3CC31CA + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 0EC7666BB676B97C5C235BB28C3FD499001F3C8B44ACEC5C + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = DC8367E5B86DB9F29FD41945C6A9B96453D726CBFDACF4B5 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = B710E7AFF979B2B453E3CD89DB641EA59231B0B02AF10AB4 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = CDB5530D51CA36D708BC23E481FBCC735407E43F92514248 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 50C04EF5031D1EED16BCC0D5BAD3A1666C0061C1E2C669FF + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5B5CF498754B9904DC7E30881BA5D95EB20E820429E3D9F3 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9DDEB7A26BB8A7E1DA9D646DCBE9D2F5CA91CF9EACB3B94B + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 020319668478D8D85AFAA2EB3572F7F8211FE976868B9270 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = AC8357E9FCF4188A8BCB26BAAD091F341741EA2C375D9071 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 00C57017B707074890AB73F1BCE193679CE00706529E7F1A + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 10291ECD0C8A8144497D30CE4352E48FC8E7D004905E306E + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E0670F226A4C633AA64C6ECC4C36F960174ED3A8477623E4 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 265BBED8E53A7502FB82C2FC1563EB92F4BE13DCD9D88C8A + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2135DA8AF13647EA915C13D2C10C0A0600FF0DE4EC626FA5 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B78C996BA7527861538BABD54D37A8C385A5ADCD44C74F7A + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 6C6AF0D742674730E1E399E342F02804B450B17F15BE515B + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 9827C05444BECB50F23F7F275C8716E227C2CB63CCEE2823 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 741D4F953AD471763D3AD6D3B31200D61502B24F52E369FD + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3CDF17AE0F527791388CF606437B443746453E63D4C51FE8 + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 486E386107D673CCBBE2DB3D3DFFEA5E24911862D8733641 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 10CAC800D151C505F37ED9BDA08F261274AEDDA67B3EF34F + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FAA3BD3BE203A248E0073A86FB4F4AD498DD210AD989E333 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = +CT = FE17058F2A280F3B825CA0BCDF0FC7B6701F0C5558E5EF3A07 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 00 +CT = 1904AEA99F647E11F0A9717D26202C372919332CC37B36D5B4 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 0001 +CT = BA08C77F82ED78F7DEED71061C794E4EDB30923B84F3E610F5 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102 +CT = 56C177A9EF9315EF21C6B25329F5FF9ED19DF9052FB717376F + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 00010203 +CT = 8C51EEBC5BC59C649CA36BA2EF05818E4CE480C8F13E52F8BD + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 0001020304 +CT = 04314B2BBECE44F1AC38B1C694F2B3936A875C017616C30C9A + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405 +CT = 4F3D6FA083E5749E808FC855C6F9958EF3E098AC5708041BA9 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 00010203040506 +CT = BBB8FE533F485B22D7CF57F124AADAA1F7D12B6E424D30C74C + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 0001020304050607 +CT = 4C87BD22634199B6891C01F4C06FBF50D3423321DDD2687359 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708 +CT = 6A19969E3E48818E1F4A5D500A6A92773EE86EBEDD45922344 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 5B8963C4841C663D751B32C9061973309AA2D88BE2B5C25FDD + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A +CT = B9C33C759633185703EE44FB6F017F0D3DA20EFCC2F10073BD + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = D2C7641451A5EC131B6DB243B2D15DB9A2A7F5F10F2E955AB3 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 12CC40EBB1E7AF35CADEB03857213EC03E0D783A8D40FDFA2A + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 4CD35BBDC096959459650F7E71BC95A94C959800D69B8942BC + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = CFA04361340A788C07E4E1417EADF6177CA1C9009553FD64CF + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = F69454E8DC2D2FE8F9DB068D56C22F7E36526193F99B478274 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 57A0C4D95B1F8ED69C9AF408C535ECAF929095970D828EC7A9 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 955C4DCA956E2ACA8DC5377F7FC75EE4E7738A4102565EBBE5 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 918EAC36D7063ED13B3DDAD7D432D6514603BA01B78D05690C + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 87A603EBA5B7509F74224F87255A9B492552C74CB5B46E9228 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = A6E0ED562C845518E1BEEBF29472A5194DB1DD00B73FC2C701 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 2E73FC49E4B116462D82223FCF82943F9E2D7AA13E07AC49EC + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D254111A0323ACE3F5EF2F6B5C28690D3DF73C58BC0E54874C + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6BB047A83F7655B2F24CCF8A49B6BF96C80A50CAEF88C8875F + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4B1E36CE8CC9B560AC8E163BD5AE6143C9E17885D23CDEC00E + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4436D98CB6D76447C2B5EDEB87BBA1893CD9173E4D7E14AC13 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3D533A7AA7AAD9110DA25EF6E93360E4E1592C29BC49AA5376 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1FD06BF7658BF642DBEF2FF030AD506E87C6E4425828B7F508 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6476CF09DDCA018375642CAFD8F2DDA8212FE212533B07C271 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6B2AC4DCC3A9267EF3AFC8276FB1E65FE3CE4CCDC5AE393951 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 37EE2B2CC1E32934688C5C5030C9354A221AA366019542576F + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7FA3670F49F84CE0169894BD836C392C4BFF2E89C07802A070 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = +CT = 261CE91ADA6CD6B5032785C011617DC4D91873683ABA663857ED + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 00 +CT = A1D8275B9D7F86380411C704AF7CDC65DD15320885E1FB466AD1 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 0001 +CT = A1A75F7608DC1F85ABFC6FDAD323EB604827067A32C6D03EEFC9 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102 +CT = 457BAB6054218892F26A27F188B9DE6BF4963EC69573006B6D62 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 00010203 +CT = 6574961BE3FB267106452F3194F755335745E134C4ADCED6391C + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 0001020304 +CT = B550893A0B2178A1B918C390CB7D5EF262BCABAB13CAB9026351 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405 +CT = 64A037247C7ABE130C2D4639BFE1E1DAC179227831A375317D1C + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 00010203040506 +CT = 955E7F66E0E85639C98E38260A95334AC601717E92513AA6381A + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 0001020304050607 +CT = D3F4AD9BA7D8BD1D51FA04FA9CE908B029233D84DA810BFE7E70 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708 +CT = B379E4EFBFC36215DD0E3A431356D05F8F5FC59BA0549430AAA2 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = CF4AD2CB1380DB856CC1151E06809A53F211A079DC336A69A94B + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 736251912EE55EDE349C8BA52481B17522D28A9DC729F935F598 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = C965DE705E275B9F0B204EBCF00F7CE6FC4D4B5C833850A2305E + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 05921BC2F590F9BE631C2EFF2F02F0AF3707D415D1DEA21D3B38 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = D413A3769DF79144FF71BD84F543541D7ED0860BDAB8F063619F + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 2DC3C8976C945F4C12B48CF1437C74711DD673D09CC3100553EA + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 1B8FA46A5E335738BE7A1A07C0B0F4821409596A20521072EFFB + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 239E3EA28D15007B49EA72CD964947365513440F64DBC48FDA69 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E7165F6D3B7C4036431971A80C088B54D1B1677AC1E7FA1EE7EB + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1B7F932857FD335BB75A35F7990139F9D276E2B5DAC95017A690 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 020B2FD974824A80E817A05FC365924C30979D42F7F94C4044DD + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1693B804DFA3EFA3FDC4365F06922A0CFA8F60C2DDED362A5F03 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7E50E79A46AACC5C968B541C8109B2DC4798503A7EC4A6A84DDD + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 0967D1AC794F65F3DEB6EA59A3B9FB071DFC27B80D915F883A0B + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8803F081661E3CFB8E68DE1D713A6680DB707E7237C208BBDF96 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E57B00FEFF3777721991C6A596E88D0408294B2F62B4A7B27C9C + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = E4FAE3E81003F37F81AA70D34EA4B1BD6C73D344E268BEEC9A5A + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B44E90B55AE64ABB938ADDC4C7E8C52513389C19D6CA90C23F6E + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = D3B276381BECDF0AFDAEBFC38E7BBE3195B66C457A0BAE3224F6 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 456140EC057BB2242FF0D28E2D547D1135B3D162F546633A143F + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4D3B384594722288A79072C3B46EE8A31B2674FAFCAD65A722D1 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A1F0762601D1A2F3E1F0A1AD36F5C2BD121F72A09FDCEE140862 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 998FA0052E0F11E66D07645B4EF44ED0E75095BC2AA29058B2F9 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = +CT = CDCBAFDE5B06DB22ADD8072AB4B631660A0C8BF66D40D09937C5C0 + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 00 +CT = 6DA34AF117CCBD07756F006D5E611EC98EEE48DC5BC27E431898B5 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 0001 +CT = 0FD627EE0979258D8F67CC9B139F3777F6D406FD5BA7D09FAE4FB7 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102 +CT = 391A7B3953DE2FE4ED15869BC549DFDF4102B66796CB704D0B52E6 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 00010203 +CT = D8593E1F67FC6D5AC2044FBE7BDE2158FF6EF967B08D43D2F438B0 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 0001020304 +CT = DAF6633863D3C12EF78BE5BE4C18E6889CF0AA04EDEF890B2FBB75 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405 +CT = C322A2529EB181C28B997643D8B7B5A6482762154CA101EFF814E3 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 00010203040506 +CT = 880609570BFFC8DE609521A176626AF75BD8DDAE1DB79005442618 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 0001020304050607 +CT = AF61E43D959A82E9C475C4F5367588ED994BF5A05653D3EFAA364A + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 78659083D78DC6E992D982C13EC9106457B4785B58DAB0585FEE41 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 07D01C349ABC5C55EE3BF6C6A1A23CDE8DE8F96E1D17F5C84B6B17 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = C1A87DEEE73AEEECB81520218099A8A8E1C2BCF3C9ADFD136A907A + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 8B522E47903479077A369147E1E5081E5F56324DC38E55877F59E6 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = D5B0C80B18DA0E419CC96F077C26B6267B6234C30C21BB1650E954 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = BB0A439075EA5350D823484718262953B80B1F144A3F5CC13C2039 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 138844F81B6A5B4774C8EC77FC3290C196381B80B55266BCDB17B1 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = D1300BC00C75857504F3FAFB2ECFD8D81E58458F62D79AA9F34B7C + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 86BA2FB166CA981ECA3F1F51C93F20780C246801059512F71AE771 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 97400EC1B990A73E0A64856B6532A359D86570A05A25B69575C49E + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 45370C2BADDEC73B0878531F0CFFF855AFB907593520CB8028E2C6 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6C83C4A86BF3600630074F5E7FA9974B5078A2CDFE52DC151BA366 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3423080B3610583A33902E14F2D07FEB1EF95AFEE663B8D04F6A58 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FA9092B2CA39036830D184CFA75C691EAF13AEC5BA70CD1A1BF7E0 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = CAE48DB0B5C78346D7D84C24825D73DA90CE7E90F2FA934650F876 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3697FB3B52595781BE90FB4D1179CBE02D9F42610C60A39018EB77 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1C460110539BC96CC6324B663519C82A03B96F3624CBBF86386387 + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D4DA6EC86F16AD4862C610A474F6A2A9C1308E27150D8FA5DDF77B + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 880711D59FF3CD1F68D9FD9A80C76DAD7A349ADE8A3C18B2991140 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BAB07638753EE0F978B461205E9346FD8D4516D67ACE857212366D + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 707CE0A8312B2C215C0A29A9645667ACB71D5C2442AAAEFAC1769E + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D790C2DC43B72E856C038D89B09D78865C149EA12BE3E1E34A80E2 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8BA960A88D7CAB81872DDCDC4788782967237124EE3238B1A9AE4B + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F457F14BABB9B877A833FCE9476B0AF56966415CE8E11F182603EE + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = +CT = 41D740BF4C5E055FD85BC1683417F0BEF0F5E4CE34F172A9F383EF7A + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 00 +CT = 364E08BE2EDD4D1A3F6BB2D89DC7E3AA263C7C6EB3EBFC545A096599 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 0001 +CT = 7B859A5800E5E5FD193124FA9C50B72CB009BB3F6A46DB83BFF78B89 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102 +CT = 3D13AB80ABC10108B3DBA9C1715D2C1D533231CC4AE475AFE9441E7B + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 00010203 +CT = 8E28112AE91292D72F592605E35CC0B763994D846D49AEDEF185AE3E + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 0001020304 +CT = CF292137ED883B2DCA0F128B82DBC508245578DF5922ED049D077DE0 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 328DECBD23656680C73805D0413FD59E3E6D41AF62392080B13737E4 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 3BBDA2DAEF4576488D9E6ABE335A2FFEEEC3864914E80C82D720A974 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = CE250C76543E0CFAD241989EB88FCD0B48C80716AFEBDD7BE24891DD + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = FE2422E65FAF944C26E971F1D8D7C0155DC847D1D35DB3ACC5A182F2 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = B75AD166632194D65E9C24C5532B2A034084F528DCD4030B70137BD6 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 7DC70ED7D8DA8321FFCD4E34831622BE356E667AE8024E2EEFC73ED8 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 399A503CB7E9E6BB2B00AD2FCC6F5A5A7799C16B690F5C41365B98CA + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 7A54444DBC754706E8A26F68242B6B0EB9A3E1E24E195DD4ACC065E3 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = D640DA475E72FBBA2B1FE0E9CA395BC1C3BB73EAA0050CC631783B07 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = 3CAE1FCD7B39FD70CB16ADDFAEF5F2EF24A1EF1C98E318D5BC381C38 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = F9B536FC7A4D3528417AEF1A7D296AD7C0A0439F74F9895B9CC0EADE + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8E1437FFA186AE58BB8D983DED99CD6780525CDAD2C148CD7E314A55 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E632C26E1F2E2E8CF92DEB8E301BAB3AE08690B11AA3601405212546 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C88F7763108F3CF1EAD1435FCB26FA41866D4C3F29D92EA089C23885 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B71A8B022B0CB4A43DC1871823398A91B1CAAD54F0C4BC9D3573E0C8 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1180779720D48F3D312AD49F5CED23659A425A2F516AF9C5F9FC6C59 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 71C08D422E55AA954B7140086C4D4CABDD9F268982CC07E1DC24CD14 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = EFEBB052E2210BD451F806F18435C64ADC42EABCCFCE7E432CE72492 + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 45F556A29FC22FD5DD9FF74B05EB803D6DAE56DDBAE6CDADEF07BAAF + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F8957CB3134F04771F07EB9416F171C9711770D03DD8CC405F218826 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B41708B7E77B47F350633F0989A7F1E746327145C92F4D5CDE70FE0E + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BE505FC57563E0D7E67A7FC7830DE81A5612F100689D63E6945633A1 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E5D6ED040A887748E03A54C6F1D5B4B7AF6DFD8E66C9F86A8EDE6285 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 22CB1FFD080591343E7E76DBF2936B50951BA00CB2210223D5C31300 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B856BD19CA1CF88C9B3B0256EA4D77CD57C9726842CE6278BEA1F5D8 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FBFE443C49687C4F52D409C48FF1C7CE8664F808BA8019924A6FB873 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D4F1F7B639EF41ABF3C3F355217501B9594CE64784C74A5242E6917A + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = +CT = BD0FDBC65B384927C2D55CB94712634D0027CE186CFB26D27680BE21CD + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 00 +CT = 97BD6776CA5895CEA08DBDC646FCF88261C73891D8B7FAE5B8DC7C08B5 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 0001 +CT = C14DC2FB7CF0023BCAF70150AC33947E12BCF8C7CC67E1853FAD6CFE66 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102 +CT = B7C1DD0D715F658756EBBD25284F187C6D6968F8D21A0C14DB6567DEC8 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = A51C48D597FF44240D2EB36170D7E1A18FD5CE46594AD770401000ECAD + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = E52D84E9674A046C788EF137BC98FF6C2221525CCBB4A80683089D8D22 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 7F3A7A10CDFE58A8046A738E220F6379EC739465E76EA34A54D78FF793 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = C67D644C39B896031633C774F609049434F29E734127467F62A67D9ACB + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 206BF350AE44147E1833C317D0784BD67AD6708E1C1A8616AF442D14B0 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 6A6688DE47B8E5558095C9E4E58E218D80A187FF507AB6B8F802EEED98 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 2675CA29902AC64A22EAF66710929B3ED4E32D05006441763EAEF4B53A + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 55B3BAEE8EB0A119A57DC444A99C4920C74E890BD82B3519C7CA48B0E9 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = CE7475AFB9CD48D6078E3075D3FBB9CB1D3D9A061EB2B169F5E0BF061D + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = EF0CDCAE02A4A09603A5519396F8B60AC92EA2F9310B5F71E48DF929E8 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = DFAD37C9148CDB25291139D8C0D626DB79B9417B9906D38BD5BE8E33C3 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = A563CE0904CCA0ECBC990089285B729B912C0336067613FCB83CEC815B + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = C45CC75B088AA40996DD63684A68609D9F030B5087E797D45723A1E079 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 43858D0961B9A95EE8833C6EED2647DDED95D7186553F0C590C07EC28E + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 864426F9CCD42825ECC5F081FBED95D1D3B6918E2B1CC7CD4F23FB4322 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B4DDB00AB25C88EE2FE390D656257E210AAAA3E7F0D1EA1C31F81A1B49 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6C0F90D1C72E6345CBB97DECBD1FB928B1220FACEBC74C40BCF8DD8BDD + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3E049F76F81A6655F6989412035DAE3A1E246C610B5525C048259EA156 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 49E8356227D78528030CB487688B38094E92D33C4B47AA88FE9A755088 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E2A717968BD17EEEDCC940292A0341952F3ABD270FCB20EEE31B6BFF4B + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0288BEC24403DD76670CDA1FE97FC475D8742FC80DDFE9C330C8A4E9FE + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = C76E285A031802C795FC64E21EBD05B51B9CA35C89153077738741479E + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BC0D3171AA82C26A8B68225CEBD5E153C4C0A5BE237B66772182C632BE + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E70A1F9DF72846C075A79A19FDB126AC23179471E8DF03B19F39E47C5 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5DF78989C2B35A945793AE4C833C2639B45E945513DE05CDF38456D340 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 01A7485B8365DF929D79F32B84951C0270FA8FCF3230D13E0F9F62F331 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 73A9C4282AA40D2ACD706D90239B5490AE6D03B22E901165ABD9154C9E + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6C5F3D0FFA3653C11ACCF29EE7C6D0EE6B2C319CF56596A8F13A72A430 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B346C1181B303FADAC2848C88663C3271954724E1A6993B173F77ED9BD + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = +CT = 0A2D84825B90C0F6F516483B9BF50D7CF58B5DA73AA1C246170CE8CA9E89 + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 89D85D42B382B5DE97D1F2AD54167BC828F78D80C8F7D453679B566B7BEF + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 3D8A8FDE28C9726B15D14D17F0704C9165C784DFE321641274BF59BFED2F + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = B6AECAEA2AB8CFCC2F159301AA8D00A8A1A5EA48CD777C3AA53D75106A64 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 4FA5054EF07E3F56DFF87B08640EDEFABF4393267FD1A89AEDCBD0881ADD + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 0F76E5BDA60E0CB584BFB711BD44ECB558EE667EEF275A2D55B27D7FBA73 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 6B877B5580FBE80C7BFD8BC5AC796DBA9CF8466CB476A8FF1CFD9CB33DFA + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 139229906D6427562B22993648D2ABF07C058A740987CF38AFEEAFDE67F1 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 9375AA915A7311B8EAFB0D99163E6C1544510AF15F6498CF8E16D871A5BA + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 0522F205D1CF03358F1CDD2DCEDCBE03E0D9B337A6FA024B4ED43346824A + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = DB69A8605EAB462AB92DEB217374D01254C3FA541C6E4C9BA57712D524E2 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = E96C360DD9EFCDAEEF85238F69D5375A212B4B8F36E609C2631ADF729B80 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = E514CDC5DDA6A2C3340C5B75C58338A0C3778488A3ED2B07DB82F4406E54 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 9F3A0EF76548618A3985F8571706A2FB67EDC0B0282B5823655F176A8395 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 3D263ED80AB17C745D7E65FC9C53F70E92CF742884BA9F5B622DB24809A2 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 6BA0F6F2337DACE79BB83EDB6F7C22CD1F069C6D6554EE2235315DF7AAB6 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = D177AD00B721DF7F8848A1C365D62489BCF824D65B33F22D77E7BA44F5E0 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 47AFF604553CC912E595BDE1CEC50571D592ED06F2A9AB2391D77B434FC8 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 554D582E4FA812AF0A2412681A524259505BD15B39C2AC937ABDDE7B7618 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FD2D3CA5F798CBF7B5D766662DAB730F7E86035B1B1556F97A98C408F10B + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 119622E007B41F53F7D063407766EBBAF42B45B3185FF2413842703E8EDE + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E867DB2A0C0F8B6E83EE4B0A449869B6B8089743B78E5AF3FBC905BEBD07 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DF04118BADD93AD1446813D329E1803F318A59E721B6417833D2E9AFA7A5 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 42FBE0C07784EB37382AE0B8EDB5F7A094F827D50546EE7E426D253177EE + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 9E4B035F9533116CFF33B1D73B8042D2223C616F35C06977CD03B5D49A54 + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ED92D44018A66AF5515608896CA33799843A024589CE402441281D45067B + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 58AA99CCAAC0DA6936FAE23591202E4361621EB443386EDBFC8CCFC5A8A0 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B00A33AB661EBED7D00B8D580CF33F1D76C8EF09645B02CD13013F07156F + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7BB469E1BCC6441E21A87D2D2B60CF0EBF96E77BE4E63A4606FA2CF02070 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 3669AB9073DED8B9B01C24658457A454EFBD73B1952739D47CB4FD766C06 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DD1130C0228BE02F7D10AE893DE0553E85E298F2D9537E4DEB64A4FB84AA + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = BC34FB575D66E2ACE1FB00A36B985B97253BA0D3B6E1A55E1A73EB3ACB52 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 07FEB3C34A101F7A7A762B9929E169DCC3F1AAD65A7FCCFA78662846574E + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 69E09E2A7EB07649E4CC38E55D6A6724828204A438A3DAFAC8946710EAB055 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 267052C5DAAE03443751483966D76BA4ABDDA9099CDCBA08BD90AA2538093A + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 0FBA0DFEE4703F46078165E29016184D7E44415C45BD43E0255FDA7CF7F33D + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 6685BFE416D8725694EBB46CB8819ECDC7A0076525D50271BB7E782BECE423 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 8695B336CE1E70E411C94AA359882F682FD4674C1725394BA46FEB4311CC2E + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 6219481F20FD1AEC40E3C3C13B97C409464B7B28633590829116E45334A4C5 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 2FEB727253583F980B5F373F0D6F4226363348CA5EE96D796DEEA1BC43DF0F + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 84DD3E51EFCB755D66FBF453EA52EDA4A227FC59CA254274BA676B67C370A4 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = BA0949AB75B7627C9CF0762C602BF41D923CC2BDCC0D992FB6E96D96225D14 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 21E79FD030560878482C12A34E82AADB4F2A3A2FE9F222BE771195294CAD2F + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 83E21B5F3D69FE9364101C729B699CCCDE4804FCCA0BB2D6623A8BF1A91A59 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = D2D12E48B5D028473C9E99581E1B73D4798465C87176CE03499E7E5C8424B6 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = D9BFCF49B068A8F575896C2508A23B85B9DD98DB6B631C3F362F19FA6B70FB + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 9719AAA7E46B8B262F7F4873E3D0CBFAF12473A3EF54EFBC8ED71913CE8192 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 872296B635CBEEC0D784BB1D19FEAFBAA08C8771A7323D2568052F246C1278 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 624C6FC687261B85BEC8A9B7508005CF66F0B4FEB25BB1C468C7216232BE18 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 516AA26190B32667DDA2A3323470FC3848F36CF2618CABA3AB72A6432C28CB + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6D2594B0B37D008205A023AB44614CA8A7A4511FE4545DDE91E8919105D083 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7348B16B302C4F5590B437C4E87E1F96193766115F85E2C6DD17CCEF3BB89A + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F7ECEE9D91E5A3A3B5D109A78C2D74E6686B448E2A2A275FA46A9B31323C97 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = AB9B9669B0A080ED0069C44C85403F232E3D635D7FC2378B634DAB42F07FFE + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5CFE31F9F45E63D7A7BB2AC9912AC58143F2D06D1EB262DBB04FFFE6286FA0 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = CBC0D4DD34CCAB9E2B13552E888E6191F8BEF37F4E83BA133EDC9AA728E1A7 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3F4E850987DC09540E90DD05E748F8FB76BBC7961F4029D03117837B2359C9 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A4964D6996B5EF7385CEB599C093F5206287F9658E5C24C300F509990BA17A + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 898020371D526E95689D07B7467647AC74CBB6BE629294214DB7CBEEDBA604 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BCDCD0B92B4CBA9EA82A6C7EDE2D2FFA0518B55BB307B3D1F7E8D07B27F674 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3F11135B47872AEDC35BB909E24E9366491EC3F3334E0A0937CC3A1007E7EB + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3C9FA0B080B20917125FACF5D903F05CCD4A82CAFA8576A6EADD4997F4BC72 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 052A1819D59B00D42E8A48CBABE14EA3DCAD1782B71DA53CD5FFA93D31B32C + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B0C046991D6B1F72D99CBFB8961684CD799BE3BB4D48A4ADCAC6565F8F44AB + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9655A916763AC94CDE33AF2A6B8C248B3DD91AAF8E79A2D120F77446EE6F2A + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 37563CCC4CEF0EEA0B8691571C3FC44756D51136C7122EDAEDD59EE004B6BB + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 5435ABB95C58DF4D12D2D9DA05D064C072EF426A153D8B006D04DBB90CC3673B + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 247468EA7740FB5B8A2E3DE62EB74B2CB1A4E020C9471FC6E7FB5D76701E84DC + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = E814FB6CD74A0B77D79BA1A727C0F7D4756EE0DA55B4FDF8B1A7B4FCFF5E4C2A + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 3D0EE275B43BD6A12B416C55185E811A9CCE8B6F3262579E052454C414C41401 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 07E7B80B9370635193AE4160543F6D68765E7266E59BE3EC2FABBF99B147F3AC + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 2C7BFAD8B94C12A422CF26D496D08ED926C2D67EA679687111B5AF9C6921D29C + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 603DFC4643B877D7CF592729235C0F25AC37BC5EA75196A06924E8E00443A42D + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 4A6F150057C923BBD08FDDC361AA547735215B500ADD47BEFE62D6ABAB810F18 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = BFF08232E8B92076146A46EC6AC416744B787A9BBAC00B829FD4FBD8CA5F9DD2 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = F2FD6FE5A0B12FE968C429FE3A23B46F9CC06C47B12355AD0C2672BD1F4CFB3A + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 3963B06F7DA25A937C5AD3A8B451856679D6FE022157A2E42C0942C7060DC5D0 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 1BC86D042A475F6314FCFE59B73AE99FC49FB35D0E07E72A0257B05F74FDDBDE + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 9A8ADA39A68624DFEC74616A4B5D21E78CC145E883C5FF55EF5CB9E00240BBA7 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = B7A38EE69FE153973FF6EFB2C19820EFF6AABA3852BAB9EE315D4B47A963A490 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = A994D63A66F9791F8A68BFD20000A16A60F73DC065131447A8048CB0AA4D7153 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = C0738A82A4F7A79BDF1E9A38A2662C42F70D58CF661DBADC76215E92BE2D20C1 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = F482AD065984531192FFBAB94D0FFC837803703C57C5B6300E8FDDF5DCB09CB2 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B3995D1DC6E93F915308A8402C7F3AE8367B40463DBD0ABB60A19BDAA67DF6C4 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5D2A8409A75E90B3CE4E19EC8574FD43CB7AFC26F84F160E832097113CDB912B + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6FB5DB76FF2C9D69D0BC9896931B5579436B7E9A4690787C38A06EC765B53392 + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 52CF641D0E809F4015FBABAD3CA4CAF28BB425B8FA143F9C23FE0F79F85FFD75 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B472958432F3A45BBD748951BC5F936F15822AD03AD636AECA1754FB90295361 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 44FFB8581C58A88B9D184288BC3DC0203F9BF7860A23E931F597B1BF7457CD15 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E041298D1AA155C7A165992DA625EA5B916CBD5222D4BBC5B06895D59B7FC346 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 456609FA8727513F89AFA5CA7A27220EEB3989B5E5C5672BDEDD94263DAFD685 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0E3E32E10FCD9FB20370D0D64D617016702112955BD89694ED615D7DC904C5A6 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B72655B93882B52D2391E1AF2DC2E7C148F65DB56581168302B7250174673D61 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5395C3E27F6B696F4B6A6CEAC8783F892D8DDF64C250CA8B86FFD4E76C09D900 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 09664FEB21EC4D4E7F1078D5087B98969EE46DD19C7E358040258AEF98E5DD25 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 77D915E95AB8073B1AA775CF6709BE15E59F02F3D9FC7A498205764637CB26CD + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 50EE4AC315570AC15307D7F46B7A9E685144BF24C0526B29D39BCC62B8B99C65 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5ADF97C4495FACA938C5259CC7BF2AEC129B1D94ADA7E6794FBCC9B9FD6C946F + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E1DDB47A0A3279093104357E76B37BC8EFC2F73EEB988A4366CB49CEB1A05CD5 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 8252860AF5D7B84C348492F4E9AF90CACEDF9D441BD9E05F2763E41EC2BE275344 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 6F432A2E30C38152DB2C38167FF67D4A840A407BFD7AC500C87DBF691196D8028A + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 59749FCF2D3F2033601E29D88DBA5C115A18015ED853B2DD893BAA4564580A892F + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 6ED66AB049599179634E3439E599707D0A8B41EC32FEC3DA8E0B6C52A219CD0B24 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 624C32A70DC2FBB4BF92CD4BD26654097A2924380E8C95C175A872BEC9A846B0AE + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = B0E81ECD5D38373DD1609962D5B8D7539478515CF7CF2CC74A1DF7417E142380F1 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = EBF2D9B82F2AE8E7E71D6F9FA325155F2F13336291117D927CC42457EE9C7129DA + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 089404E413EBF60D886EA068062877D32E1D39BE0A2A9FC0366FAD28E4A3246A04 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 5A3CFA86DDB0C1844ABF93BA8B4ABB6204D974C3DB44B41FE95E5F8DB7F5A369B7 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 7F2D3B3E71771913BBAB5ADBB2D738CD1F616879D4C84D03D870F1332D413D971C + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = CEDDB03D3C983F45CF996A42E591B0D06E5EFD5CEAFE7FC78E8D516FD1C85159B1 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 95FB8BE4F34EB92288D3359A666E3AB10EA849B1C6F9D4E6C9AA6A3E7209F149D7 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 9E0BC9810B4D9A9950B75D95F7720ECBA30DC8243AB8C7370A7B7721E49D73640F + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 6CEF2F43A5D98D8F3B5F91A782DCC09E56CEBEA8B330A4C53F266CF829AA77D1E5 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 03900D16126C41318115C9011608A5CFB403A53BCECB0ADF09B558625556001DBC + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 0A22F90E30ABDD44137BF2F7A84486F0901CC0A3F4FF5E57F28B5CC4AA8489EAF4 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = BC4248F49312696B7BA0DF3EAE3C5697121FEF695F0A9B38F88B9107FD511AADD5 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 88CF081DB4D0C28FF67039227FDF473E8B3F3BE482CC996D4E30598DF99A58D232 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0465E4ACE5645095B2BC48D62FF30CFCBB28022055F394C5B7AA028B3895D90E02 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ED466E1A9B3254CF1AB636A6112ED8D3B205CFC7735F1A1D50BFE6B8CC3E29C92E + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A3B8B8D653C7FF9FF77161D7C6AB9E777A3D0A6503DE181B333DA76C9666B6E43D + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9A9C1FA0EBEAA4AA90EADD15B02DA656A4015AFA6D9F2C4E5F70E54E7F489DC8AF + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E6B8051E01C8DE6A61FA5E3271E8B1AE1B7AF6BCC28CF7909B20922D9FB96EB005 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6119AC15C3912AD18AE3F9D28371EAF45363805394D5EABC56A5A101F4C2F1C6D5 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F4D2B087D3F8A62F8C56B132A7CC76000282C03DA9700EF11D1BE9CEFF9840F9E6 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 79F9C83810DF73E9E779118B3FC5419B43103E0F6B9E350FE09A7201FC0C7C655F + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9A7372A8A55D9D205443013FD9BF326575CAF448313417B3C6C3C041EEC577835E + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FBEAFBEAD33812EB6AD78FB701956365EF35B2AF38798DB64F15CDF55ED0AFCAC1 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0B7897F809C5D7904D6BD83BAC08287B3DAFEBB225488F3BC7D6ED42FC57B0B241 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EDA5A0CEBB36C63F01E923B14226A79464B57C1C4E848ED0711F1B45582A7CB364 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B8CD054A67B57E746D221A4A3FD2CA073520C18632CE959B198383A148D16651B3 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = ADC892AA68A781240712068E6F17634CD878CD61CF95CAC8B80E8A9FC4BEEE7AF3 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CA02EA7B8793CB25373FAC7B6A681FD05040A531DE781949FF1089AEA5167707E4 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = D1DF2CAD1BD28C5B0FF163F4F7B268C1360F9006E9FBCCE91EA2D90FD1AE016D529F + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = DBB523DBBFDAEF8BCCAFAC37ED3742790F79B9C78F703F773873BC2AAADDA71F6BB5 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 569D60F72865E6EDC94C35E9E0C2B7E71891F3B61D3BB0C18C6ACAD766BB009D8833 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 41680DAF9596C7A92202416E08C2955C95A4023E5EC5FFD6CCC113F8708347EBFEB3 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = E942EA06B702D84A16C4CC21E4F9284831CA52704A9481C636EE6EA98D538E91E7CB + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = DFD4ECC323645719D44AA4CEF2A81CFA3E988DE9B8A6C914F403A96E546DEB9C0D26 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 26BB5D1ACAD7E50158346BDBC20A66A5AF33C2237F0F49FF32CE18C55DFC0D395EEA + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = F0B822FA1489CAC1B872763399A32A63668381DA7FAA215BA10C630088B11625DB57 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 5A388490C018DF0CBA5E86A955EE9692EE561289A106B99C4A33FBF251A96BA01362 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 65A218F8FB8C6DFC8E4D3D8170E963AF45CD07463F33B1F3531D70A6D4EC8BF93374 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = C62C5F5838A8400804EC83D57B7D19D88D84C235CDA10287E464DCCD37FD9AE3C670 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 79F869F958249A0BDD47D89BA739CFFF736C6D5CC34556AF099F20FAF62C4B3BF388 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 687CEFDF7070DF5790BFB2A21FC03A7B73105E5E4F319432ADED57416CFAD1F917CE + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 139A6B2B0D8A81677843FEBA6E7596DF92BFB91A4CC8781821045D31EC0B9D59656C + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = BAFC9CBB0D32CB4A7458B8FB1B80EF7EEE2957AB44CFE2DE1F3BD67CD46F661B9C9A + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = EAF9741E8DDBC4B029CA0E57C21AE783FEB7259406CC9B5441CFF7A47538362E82A5 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9E4C522B301BA8F0DBDE3A69F106FF2C2F9CC2D683DD13B2F07A82709F00DA8A0276 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E888460F0783FB85D0B5365152FC6C2BFEA445D71B069FDF1572B728AD7AB0859FEE + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = AC705DCE628F2BA6095608475B510182AB357C776F3C7709D8DEEE9D8296B67D9CC8 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 25B4990BB1593D8B2850068A946E0BA0FD8E9B6BF443B2B1CF5F800C284C61F485A2 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = DF318B2F65FC1D556124C7A08404F9ADB2D0A3F7DD50407653288496CCD49E55D113 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 63C76A567AFE5B3B2E0A867627FB294319ABA481C315414F4E1073F2BCD6995F6DDB + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9BC098CA01EACA6D770E928AE32A868E0FAF4BC70BB37755FE9C9E6386ACA9A9A87C + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5DC5298A3AF1A0ACB60F8E676AED09E81C74D1C7A0DE9EEB3E1429F136ABCA899CC0 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 40D821F1293E74E1788A5837783C90F87E404822932252E16420C73ED14E029D2396 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A27CB1AEDC11C1E0DC8FBC8737A2A31EEFB7D69A799E6DFBA09469054A02132A28A3 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D3ABA18CB957B4DF0F6308B8F8D0F16D81853D1A266A23E59BB3C038B8049B3B6EF6 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 02A5828CF460857891027B646EF19F69C29CA540E1CC3476DA5DCDA6C9A2763430D3 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 8AF4D39A1EF34FC5C6FB1EF683CD810E53AFBEAEE46097F4974F18A9124B2043D769 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5ECE4C14943C37FB435717BD37BF82C80F91E26F8E94CE9330CADC8D3CA3E38186C4 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 57644B9138933386BFD00AD6F6CD59B68B0548BAE73F8E9219AD40D55EFD8F9D1D0A + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F003E33E21A6C753BA19287D319925E258DAEA50AA6D335FC1CA8D58D775273EB9DC + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A1F77FE07C7004056E83605E28B3EADCC5EEF3D4CED3B7835470DBCC8E9E1DA5B238 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = C2839402A08E1F16558305EF32D854B976E70A14823E34D1DCE5553A8D52306135BC48 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = A174109F00D1AC3EF74CCFDEC92B06B6EFABE78567698F72A885851029FDA35EF781E8 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 1CF5161BC6AB38E88E90C134F5AA02458B951276759A3ECDD074F5C8996DBD16DF45E4 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 5FB83170206731A54ABF9DF566940AEDB471A137B168D299BDAB0EDC3059C48BD9F887 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = D17B87701B0D8233A15B3EA4B7223049B795AC4F352C232890B1D6C54F597782694C06 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 24AED8EEDEE394E346696C6D6432048120B7C122145D92857AFE4736370BE5702BB8A5 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 19D3113BD399DE11D194B80675188FBFD80A4DD604A0294EA1E0A559CAB4210FDE88A2 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = FD4A6FA7270EB2DA2B566367F2271653D3464BCED39C6D1C1CEBD6756C90CCF8019A44 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 8575FBDDE0AE310E2062733798414F2F82C690A5AEDE3A8AD764BDE0E3BDB72B2EF8CC + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 08C53DDEFA95FE9E67A83585E179BB2BEE8AC7C6E17E4E95146830AB61BEAB9820B39F + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 3AFA97BA41B1D238D2B618ACD96D57A12E46A780102F7E9D51DEDC8F35AB8897610439 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 8BB5762A38BEA2DD7A92391850B5DDBE04CD50ED031BC443AE771B106B91D11AF7678E + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = CDB9132DB31A703B7074D609CBAFB818B6F56273DDAAE5D2185478CD09B80FE9FE7A6F + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = C7D9B838E1C874043E2C48D14D3D4DD208AA05C71059DD866BD282D3C47EDF29228AEE + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 83067169CAEDF0FE0F93637D27BEBDB9F0F904CA9609DC9D7CB9D4DF261504D1BCB722 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = C3377F6970AEBDCB10A749E6FA37FA721C9EC258E249E5C1C667C768AC1626932661CD + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = CAA7CC6117EF079CADF1BA05BEEBB100E5382297C90B763C7B40DCDFBB1C97AA008CAE + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 2073F52E7295C2010026F386259E9DE179D4BCFB30A5730B84A56A18044FC6E6BC6DE7 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5345B1D0B04775EC49B6247BCD1AE5FBA282339C5E4D4AF1A3F75E0E3482A12E3B2BB0 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = CDA317E890EF3244277274C7C497D4F7336B51BE8CF5BEC950A2FA93E947141E43825B + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8D62FC69085FE9C5DCB7A3D63D5B70FB8B2E53744D97D02D30219F7B3EE0CD72D827FE + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 84207A5AEC1AA77F8CBF03DE2BFEF518A90680D11A06F3CB5C226726911B99E8BED8A1 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = B9D87D20C026805BDF290A7678EB680C15B8FB2A9DE8465472F83B1309E3095EE2738D + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BF4E453D412840C72739BCA375900C06500E268CF321526981292464B7C17CB82E715D + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 6E124B8A841525AA2C6E08A8B8DA10CEEBEC1714E6430884D50BDC679874242CE35ED3 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8BA645DAC2BB6E5F8099D41372339F6315C8EB377BC14BD6B215B1DE63DD656659B91B + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0FE837B425A033007E70BAF472A423BCBA2061B26E9285279F78734123B42FBFBC7164 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 33A0289F23A37A153287D38FB615806A4A8331AC7FF291F68D2B987EDB4CFE1E0721AE + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 883BF7E19C5EEE67DFE19922769C7BE830FB8DBC929B504BA9F21CB1B726BA238501C0 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 0822DE0D980D524EC56F691677334459392907C202836A17C3098B6AA3305A2BEC7D0B + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 73AA4C68F7A666B3646C6CABD7C09759B8A7ADF6B1403FB7166958DE616928C0B90755 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1C0FC2FDF0C6CC71344EB3FF40FF7EDD9A1122450C6D067B47DDEE5A5E586B4B4BFA86 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CBA41B6288D665D8241A90C423FC264044292F1F7E6AFC6F5A44C73825E8854D3B3443 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 07893883EF980512BAA66BCD42A1A479768BA262E9158F73BD3C97B85FC90A5063DC43D4 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 1873103A5910CB8EC612DAF207B55295298E24CCCA07D3D2DAAD727581A23004964AED3A + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 855E2F3964F2BC6FF0AE0CA98898C22557A34678624E8456D7C92F6351CD4BACB1E085F4 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 58B327337BB93578B863DB53C7D336E60019ADBA0C8D3991FE89441F1496373245565913 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 252AEF554B179254E862C4B3DA5BB4840BE156A408330C2DE5A7D6AF4FB0B9F4A1AB9341 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = F378B6BA35636065DCA7294F3423C91A98788FAC7F6414009C7B050A653C50EFECAACDB6 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 0EDF8F10430E648350A6957513EDE947E646246AA0FE1A1CC209BAAC8A4963ECDF5757EC + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = EC687703E24581A9826E16936F67A4673E7488FBF439586F7714C16B8DA5EECF04380C04 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = C92C6C2FB2AF7A7CBA0B920D1770A535C430CF0BC956210FDBFFA4992E6833BF03ED0CD4 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 66E27BFD266D02FF083B39FC442BBD7385B487FBCB0F827BC952D02CC6782BF296469E4B + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = B0B09BEE93385A6CBDE393EFCE9D849EA96AAAA9A82889F273B07982CB1F4D4124AE901D + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 69C2053DD6A69887444BEE2EEA18CE495D3393EFB4606D70E09BD3673F3694735A466F9D + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 0C6B9C57BAD6BBB7EBE6C7C88D0C67AE313C2953442422B19C23592E9707A003E056D9A6 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 8EA61A7E3541DD8F938AB5BD4CEFF8C5F83C40D042FC9609482ACCBEF5E4A934D0903C5C + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = EFCE87DAF2451343BB3D5798794E0F5E749C158C4AC62A558F657BB8615C8239FD9898F7 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 6C5629E2E1AFD2CC946DAE607B1D254D52C748C769ADF6FBC382BD242FE48EADDD5F972F + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9FB9E06AE47F1D92253635D364274077136E098FA26682953D478C5DCF804E538553C6DA + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8144764D0CC69A2AA9F2506E4E6FDA518EB25132C5497DC819570ED5A9C29A4E97724DCA + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 28DF51A9DCCDAA7163BEC66EE94D3F1F1B2C98FB76BA2E2703E95284FC9538CB7227C990 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A04783D3BE4327EBF9413051EFDA4BF45BC415E67CAB0785677C1908A7B0648098ED2288 + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 72F53C04ACFBADCFFBB5E740402F175DC8FF6DDDFB3B3936064016CC4E4A2B77B5EF754F + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = AFCDA420054FA45DDCA0CBCC21ECF7401BA7A2F7CA440DA805F5556F9C4D0E778E0A72B4 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3B10570BE49CF619B4BDB133B23E3E10FE845D669B6493FEA294378699C7945CC7C396B2 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E2AB87C7448170802C6916BFB8BB9AE17CF9D3F647DE5892AD673F5505F8CB20547B5091 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 7C5FBF1F1624C7C80774735DDA569330D9B8928F8444F0D5560BDD99B848A5D0B2E985DC + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9C9A360C65FA895B2E210BB51B413FF100D25E5311A861A132083ECB9B1EBBD053221B13 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A9439193599B62C34CBE4DF0D4E904806179109A349D77ECA9901EB811DE2F270DDED70B + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 8278327C2EBB551180BBEA66BACBA45F52C6ABF60E7D7B6F9C5AF746F77E1103323AD4F0 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B278E323CD53B7FF8C9D982D33B0BC933E0D26011144C2FA1433B8257A41F0767459DCAC + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 64FACA095FDAD37D89622E97C1DDB5F62B6319A217A130A5487B728C9F80DCF6C1CB3FC2 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3D417847E649C461F41C4E452C398A50D09F3FFE16B1108BC4686ADBD9C7941325158DEE + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8EB519992DF3A511B5C5D8E6C168A52E806B8546DED3A8321D54C8E83DD3BCF6189D6505 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 374D34ECFA23C529FECEFACFBDE75D908D556104CF6C979852D6917B365C78DC4AC73F69 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 8E08874D9BF9D931EB576390E97B7F176674F6B898053CB4BB130723B9F50470A591385EE7 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 29B96C137886FE9148AB224D0F2839FE2362CC0579C7053126048CAC34FF7AAF641D55FCB9 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 2DA8225BA7DB8AB309B0B7AA1AC894B13BFF7C6EDCAC10A835E62CED5B4F5DE7A24FC92CB6 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = FBB1AB3B0E5B465C3333DD3D97B960A3F8E8E4388A95C601E77004B0C3F36F58CE35D8B6F3 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = B01F63C8D17F811A4470AD79872C43B4A31FE4B37BA0398B87DC6B06AF1006A68BA6AC5463 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 767997A446F566D44916949C3EB439C3937E45EFF025A103A79F8304B0BBCBE9DC8FFB4E0B + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 19AF7DDF55BFE5904A31F4F5A12913FA6BE17CCC269434FE7BFC6A3F2D423FBB0391EE7C86 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = F2D8AA4AE394098CFA9C42BB3837B1512455519052295E13402DB6889975F5DEF95CCA57D0 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 28DB696AD5FB4ED6F8DCFA802CC75C9A99B6587123B8061CC107E6F9075C07FB609D09EA9B + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 9439E86DFFD736E50EAFF88A0EB347777B6241543847E4EEBDD96E69174AA878C0E014851B + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 977948ABB9E423D25F810F57E64425C5C0B368ACF3A679597329068D350BFDB9A3DDAA0A99 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 9924354E81465D6C9B518DA0942D9B31C93345F74B7E7774C83B68DCCEB481A667BB5DB7F6 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 2BB7843554D3582E2D844DE03AE54D68C80FA832A8CD2F9BF000FB08F54382278F64EB8D58 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = EE119EC3E562A3E7BF795CAD333C9EA29506810C3102BA9737E21907CD73F4084D21AE6A00 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = AB3A457EC7F33D2CF69B1863169191D1EE7E5D8AC11B171205FB32101D6CD39DD98B632E32 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = E3D4E7994D48E023ED28DBEC43186A2814005F1612560AE74FB97F327B9B2580955BE51E0E + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = A60D07A19064F94AC09FECD2B313A92DA7320B39F3368020B11DDF6DFC42CFA80A81D95E75 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D8196943F69D8A5677F43EE4D7C5EBDFF3AC9B9085B07EDB3640F03A9B3E8B147A517D8008 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = C40B4F34AA9BAA77844BC27A10622CEAB5EBBBB07DD99AA7851C5DE6902B126D30D2A7AB9D + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2BDA54FEAADE36C817A5E3D778ADFA902B3ACFD15EA9B9E16BD0B525B400C3849B94BBD687 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = D9BD249266567831DF7D3FB3E08D19717947D9C9AD1A5EF53E2B5934F9923AAC626840323A + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4F94AD798744DBFFAC09E8037C3A755A219CCAB357D1B117A3CE5D8E2191483D606B8E16F2 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 353D9A6F64904995D52E3A750B456A9D6ED8344A7FFCCDB23C06C492B30FC53EC1FA6C2DEB + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E53F662779C02CFBB824F3F2C83A439031D75264721D8440B60A1747FBA7834DCBC4387AEB + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1C9A7A1D79218404752B6472E4F918AA90761A34B1C7C5A21121F670129B3C2A90C2CEF333 + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3FA9F21120494A8BA84EB19312028E18287494AF444BF5B27B183129313B4992264B6474A2 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 48BFC3BF2C61F1D62F37A9C979880EF85C47480185E1CDFDB4F2312FE2AEF14F013BDC548F + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = E51EC4DF95E16681CFB22FA140F8EEAC2E0788E0D4E16925EB8758272C42ACA6E5009FC083 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9A3B11DD19CE9E55CC1EAD123C9C7F94D399BFAAB6F7C8BA4CCEB5B03BBC0B9B1E5B9E60A0 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 151E8BE86EEDB21C7A9046EFEFE3CB5AC61680143893A51B5D308C3422D272ED822D5612BA + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 085C42BA88AE04CB8061EB225ADCCB55D9C4C0205BBA2FA0F5C57112C8469BBFE84C8AC892 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8F4D28B1776E640C79CA0E4B4BEF0697664D8047BB6D3E51190F4EB3D77427169C66DDD92E + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = E9FEACF1F4561FD7E1F8ED07BEF96027D0ECF1CE41371A883932B8BE87AA689843C53F5BC1 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 87F9280646E9795F2DEB49ABCF4E3B168171D9204A91D0918A2E2D99018B2380F592DE50C672 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = F2F747FF7FDDBBAB096AD41D00F2B276E2C4FC89EA8619CABCA8A9A31C025712D1AF80E45F54 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 50813869A69157BB8B3ED93134BFD309B1329101358FA0CBD38B53DCED018C1C6615F60236F6 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = E7B27FBD46FEA2213F4A9AF6D1A261DB0DCC824FAF0480D39DCD9F7B776A3C897F329EC728B1 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 6F7982E734E940C02A24D729A05B04264B60271611D4AF61789A7EBB472F8398D2501767C5DF + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 5C2A8D7DB3E54F07DC800A7DE859BB066806B4CB05B78A3F4BDB3A26BC32A22D8CF61548EE96 + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 9996E0F5665B8A4A65141C8A957D49FD6C7380E0A6A7AE0B1A4F43AB0899C42AB8B10AC4E4CA + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 9C41822E9692C0D2FAD3395506C0554689EBBDD4BFCD9D0E8537D624B3B41632C4D4DB3750FB + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 67E7E20D8532B96842AAACB7DF7B155B6B57191D5009E7015126F3B40CBF9C00C16766D0B541 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 0F5FF1BDA59A50A2832CA92687DD00E25A74B2FCE194AC2691A1E84A890570D433401AF6D1FC + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 184DF34B7FD4B035812A506AE9C1B375E720155A4D85CCDB73BA513595C55CEBF6E3BEEC2B50 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 45FA7B12C33264BF14C90301634D7EB0E84DCAC44EBF9164B53318F830D658661BD09F1C3E20 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 2D540457BE4665481D363C5CC8B38EB27642E3BFC146C79D932BC095861397D85E51F7BEE8B0 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = F02FFFA4D24F5FCC5FDE35E88264C7A46CDF781B37E2F73E3EF745C8E2727A9322D7DAFC1252 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = D56396D6521E82332762C103588E357DC8E4FBC49D1AAAE78686EFF7A926C4744F501F3BEBBE + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 31864E1E19C293369157C8B7CBEAB8F7AFF707506FD2D6F2C7FAB276A7D5D6C1D1F4DBEF4C8C + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = B2419B5C9D785AF1AE3DDCD54EC8CAD41A15ED0166DCA45117995C63BB31A49A87F1BA0D2F5A + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = ACE973B506C2F10B7617A61A15E888D2EA4A6C718E18D7F075ACF4A9332C100C5F71BB67FF36 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8FF6B1722DC986063F32141874906A241C2C4D2C986E0DEFD9414B3D9FD8F6CDA8829DE626DD + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3558D1147A56DC50BB31097FC554AF43E3EBBDF26AE7F3900F43DFDF91B80E7DA3650C867802 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 51DE4A0DA6AEA580441B83DCD3EEF28EEAB01BFDC10A6591AB66ECBBB5EBF77FDA1314D3D41C + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 20371DF58509FA4F2ADD02D22B25E39286882DDC1E777239158EB77594E39671D8C96D92B394 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 86349FF2C2FB47D26425A053FE57C4100160B5233E1B8160A57F78FC9FBFA1C7ACFADAD90375 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B443EC53579A9A93E1F8BE4EAF6DE74C064972A2A2E2E2D0732883651DD0ABD2E43BBA49BC56 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 229A208BC1FC8E32CDB830B075AE5CC56955148C1889EEB24977DC517ACA555DE4B662C5596C + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DAA1A26B3F3FDA3AF3F30F299D55D3888C31D19F98E35DE1FAD99DB70331F7BC0DF3718BAAE7 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 816A1DCF01FBD486A73F15812FE5BBE92AB07AD33473CC39EE6EDECBC211BE3B00B6699363A8 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 496C7E9F3787A116F10E8185DB857E846F9CB3BB686E6BE306666F16467867EA63F536A7E27F + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F0E4FE5970AFB9506E21D59C9426BFF57AF5E106F26A5066626BD908672EA27D73221E788D1F + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = D57DFC18EE34B51858B49CD44452F13DE9774F05DA700B9073A26693A6DDB8EFD375C9EAAC40 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = CAD85DBE5FFC9EB3A612DFEE0809CC151B67D9632449F6504D1D7FCAFE65536FBDF4F7D16651 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9D1C7D588AE9E87BABC4846C145A1D1CB8B5F8C675C7BA050E500056F808FF2C0968DC6CED58 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C9AC43DA8CFA28E1D9F9BB6A9B962DF325049B25DF45328AEEA1680042BBB9FC25A1F064C383 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 4B7541D0E9A6623797C9335007E12999850B180CEEF0EC46D57A4AB2218A2B0C8FF900AA0C1315 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = FD30FD464BB083CBEFECADDCB3A5459FA0782844A2D415699D7B83B22E722FE6B8001A14EB7087 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 907B66C9258DB5795B3E5CB74B41E3C1B1206E116787EAAE97B79AF93FF418690C5A49F12FC577 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 6EB92B00985CCA20384CCC42B98DF85CD5124E35640BCB0568BD83BB72E57D3C64D09D11760650 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 960399AE29A09E95619D0EAEDD723E621B87197DC0C8156E861157D2A139C513AF24EF698100BF + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = FFC5009AEB636D9BCD154DA71F9EE6A7E0402316EDAFBD13EDB32270BBEA1CC5A6119B886C2A4A + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 3616DB91FF34FF1503C6262490E9B60035D6E28AD7F6C27B1C4D929A8C1248237DE57A967EB1DB + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = D991DCD0FFDDC7BAB57ED3463FED4EBEDB01809D3C3BB5088DBDB9798FBB6DC7FCD0EC04E5A991 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 6DFED3B2A62259E90E82465769F724CEFB53A5256476AB24C19AC43F9B27D2FC7109321D14D8F0 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 93FCB43DDEA9AC39C9756948C64D650E337FCE8F812252CFB15715DBA32B22133C4AB65A1F01D7 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 79225E7328C6C07FA1015D1987E283EB40991068104BEADA807320DA69C5872E2F73B11AC94D34 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = C8A7ABB0840B81D2C4D05F3299F70680E5A7D37FEE974001163B2829CA56BB2D73FCB10B0D226F + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 457D90B5EC0CD2EFC6BB35A157B683249B99C44809DFDE131A2E4AA8B880D3F5C2B04EA589C5AE + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = DA30E98237D0F0311B7486A5894E0AFEC8042C45176135B3017417040BAB902DA0381086D06EAA + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 4B3F11F046ED9835FB2EA979716D5382146ECBD2B55D12853D2E632B6A3618924ADA744A39F616 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = 1B7BB99EF61E0AC80A955124478C8E1D5D07599B1A351C588C907456A395AD47EFADD71473F16C + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = C3814F67930C3B5207C964C335A430F8C9F949A60450E1C9694A027492FA08A47108973F4B3AD2 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6E73DAB3C02788DDE9334288C9D1B80B48123308DDF6894D3DCDFFF94B132DF90425490D752EBF + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4D8F367D0E911A9417BB6343ADF0E86B7DA99242F4E9D5DD978DA95A3C7F6C18E978974702F52 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ABEFEF686D009A69C85363035A1339974DF562F405879416AE4E4CF8849F24BED542DB6401B0FB + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3A60CB60249BABCA03CD87241551D8F82643F75E17D6EB3A049B17C8BA90A8C772D3FB3DC4C9E5 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5A9404FCB452F3649843B841CD9A00989735365973D08CC25E4C860E29721F07DBC755E87DA4E4 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7DC64ACE50DAAF0EEEA2BF2B713ABF9405E53176BE8EB62289B17BB811C50CA7E1637B1001F07E + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B3D7DB2C9CB0C550A2E362FA21651AD3A7ED8FF581CC38B1C5270FDBA9E70F765E97053E39AB6D + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E32AC7E00EC0D14D91155A34B1A08ADB2CF4E37CA7AE0569D63CA1823DA73BAE8B97CC3702FF77 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8036B0686BF49F0A0F30879D3A3B74BB108EF2EEE1CE90BA0949375F7CDA410A7DDF67C749FA86 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = EF473A8BD381BD17898C9C7BDE133FDFAE2F8515F15F40F6CDC207DE981962ECC7AC4BCC027236 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C28A0EDD61A36869854C8D3735920D0625EBB82176E93490BFB5D6273682D6C2092C4B049AA408 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1F9B94D642021DD526820369BBB76294A1C1718D575CFCD0CC79085C3142D6AF9AE88A306A0408 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 4A418EFD0C913996D0E579CF510C965695DA09742342D07ADCE23C00D8DF7F158DA332045B5E08 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 42EA9CA8625AF1FB6CA588482B994F1A7BC66A2884C4613C503AF9F7B9E5F2183A06DFB7FFAF7D + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = EEA882AFF58E0F65008615EF490D2A357DE0D98230D93FC0B2BE443CCA1A45A0AA892BCF1F82EB + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 4C4CDB9639A8D57F07AC6ECFFB91F67BA7065C3A4B70A1D170C8CC780A3696753E4D2EB06C83A8 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = CF057648D61755493721047B5698E01669BD8CDED00B547840B367C9B15CA0F72C12CBE1B02DDB39 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = F4BDF08EF0663515B9B03717A03F3E3918281E5B501BC52B6BD4A2F9827176E6E48F34609A8ACE6B + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = A2FCE9FB021BBB2D401BABB9EEFA784959D4F89E28A16DC936932AB4F67298233409C6B95D459DC0 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 491C00E6520020F86798720C58A839EEB7D23BE08FF8A9641845B3416C713AC13AA4EBE6CC8D9C4A + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 33712F42F23EED87DDA0E430967152A19F285FD2DC7D84AF565312F6AF3FA8DA8BB0AFC0979BE8C2 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 30C3099AA13F6393B9E10308BF55E7204CEB907A95332AD793C0A9E3C5964C2A9F801A97F9F3C56B + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 589DCDBC16161F776E3460144CFD1ACF18DB63E0E45FFD573F1379628A512CF63EE7F2C81AAADC65 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = BF80B92277DED3E82875ED87775FAA93FAD2E3E71C5F2FFE96E8DF31395DE86705C27A18A6F8E069 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = B12050FECE99663E93DCDA72469E6620ED250F9B068AB2FBB76568D8464BFCE9243496688CC74B03 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 283568C38B0AFBA7BFD12F468266755779752E54BEC984F867AC7371CE2779105149FAC329737DF0 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 4EBF1CF270CF53E661A2BE86B12F72AF4D93E609F922F1907C83279AC57CC0AF49806759785580AF + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 2503D31A581D793CCC2AF2C1C1FAEC3C57B28AB077499D0CBF191D52DEECE94DF05D474825874FFE + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 8DBBD204ACC263553CD8D1AC2CDF49869436F8E4EC2709FFBD0308DE8002F07EDBD17506C471D889 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 521AB9B07E515A49D339F5BF1132A2C7CA75387A9E00B2029DFC446D8B94677E067775ABD53153B0 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 3D6608938D5EDC0A5DAD8F3CBD8C4888B73A649EA4473CD0B191128F80C9C340742B2F0C203A3D31 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 3AAC1E9B051F12FE7540C10966BD71D5CB9A05895D8085FE929991FF886F5074B2A9F2486274200A + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 94E384511D778963EA7E8A7BC75FEF8595DE31B9369AA332A81DB99AAA2352EAE575B43CE5C94B1B + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 61384123763489FFFB30954A74BCC5CE4DF5E41C3464D8AE032186DD7C7F44EB68AB92F4698AA867 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E0CFBBE0C7E8AB6AB90EFB9489B09C097D8F5CE58C5246F6BFC01845E01E0433794A4B441B26BB7F + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 572E345A74F3F71C36E9F14D3A375FE7ED5EC8FB92A58CA100FA6E5997689FA567161D3356DDBB03 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C0E6E5B8DB16FF4A53CEE7E66E207D42A7862CFDB9E3A1A1BEF7912B885CCBAB3A519F43D4DCC5AD + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EC380DA01BD779440C4969147B30EC8CA5D3B29B762AB02B385C522505137ADA3F86A3E618EB90F2 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 33A0A41D16FE0AA472064EDB0E65BFA8CDF5373DFD188B387E4C8C433599C220A27BB78198929408 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6FC9963E9C92C7E50C48BD672A467F0CC1946D36EA018E22ADFDF1748F7A55F2F12B1DBFE0870C23 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FEFAE39DE73C7884A3B6A95E6C1056FD3383DBDB16A814394EFF4761194D0D9970E45900E9CA929E + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 401E6C8347F88439487984370F943657CD601B60A803EFCBAB5179F410103318295D32E1AC49EC48 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CEC3062347C6A7A7A2C84134DF6B58C77A67261FF579DBDF9B5B5D0F8A643F3BC14719EA5D576A8E + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A43B8B213629F7150E38E6DDB671D3233E6102872F532EDCF6745E3D92539E1C85D3BA5B8EC881D5 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 06029B15A8882411A281DA249FB25DC8FDC5D469CB872EDFCA8C9B80A43492AABB1A5BA0E48098C4 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C064942B34E003F7B43CDA9E738517A3D9138CD4E68C9B8F046FF02F62D9A123BD4214DEC7124DFF + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E13E8DDE3F215EB2FC6F535B6EFAB7370DC31EB2FF61B86EA9924770C9B77E06D1390D1D3ED16968 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CE77FF42E770AC934EB3E6A5E34CEAA02156DFCE85A43EE0763DA088E71BD8CC1F3C52CFF8407E86 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6C7DE7B6135D51A36B4EFBE4F16A5C2D5E0075810EC27A2A6F1AEE030F967E138CCEA94FEEA36C79 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 529C9D6902BF40F126B1C6EEA3D3661C31CB887B98ACDF866D7FD1A448865FBC50F8A00732E6689DA2 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = A09B9868EB1B83B514307D57BEC2621D8D7401F416CE5B6E9448309B529CA8D32BE0D942568D723EB6 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 9DAF7124ACEC4095545C3F4BBD473A9B24265C0D29DF2F92700A902E210B132D5A38DABB937D8C7F17 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = C54A949F276A9A54B683F85AA4C16EFF57B87DEB38C6A1EC5C39A7C21BFDD363804B2D11EAEEBD2AAB + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = F1BC4D9B8EC4FCE9A2735ABE2E7FA58789545210BB45A8DD7EDB9B3FF4FCBDC0FF2E969AFF18193C53 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 690A64C4EF9825ADB671AC3A4463545B7698BBA8C8BDF012BEF0A630B13B5493ED9FA447324DF95079 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = F6D146DA6020AEC0B73AA4C07484B4D5772D62EB0242DEDF1502A14296BE271C1A02FD5B5A0DDED7BF + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = D865ED516251428F9604865B37A4A4CB3CC5C5C765CC7BC23AF23B4CD43E8A8B913DFA34C7A78E693C + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = D4D5255D22C2D94FB50E6A4322C4B800CD681FD632A4F3DADFA5C2B6D803D8811342FBF5DE6D6C6887 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = C5D8E8ACAEBD53EF7186B5137F91A6920DA5600B194B936052843AA88611CCC3D5C9AA6DDE4F4B4A3E + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = B24D64615219D8752B0C3C072AF504018AD40116426832BE7F846F443E0A490301318593D073DEEDCE + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = D077EE4E54A8B7C40687B288195BBF3D177D04F9915008EA6CED0BD2D3F23D61395EF50526B26AE275 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 59179F88A636EA8CA4FBCFA1C5DF4CE99702D1FFC49253F854517406D15058BB92AF807395AF2B9439 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 42DEC3C4D6FEFABEA395B958C115E1053EAD3D050412C59397110286585F35AB13128AB48E85B16AE3 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 2BFBA841AF5CAC47687B71EBA62344F9446E0D754C688E9A5DE75DF069716B9EAE766DD351ED063936 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = AD535802E36EE478163891B3CD78D4949F790C65DA753909D9A9E028F614AFCA5E03ED3FFFC525F8DC + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = FBEB02CD31A187A8FB17C8B199D94ED6EF7DBC4B365DF71471029B2185024A028EA53784FEBD2E003A + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 277610111F72DDF012D71BAB4D4EF79C1AD4D33DE85A0186485162C71F67B35227EC4B30F358C7E59F + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 9552DF5A0A6A2ACDD4146F1B843E9A22AB6F91E13470F63062B13C34A6B6E5D80CD854FB58EC4B87B2 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = F3FB6BE7E0F6A699388AFD0E045117BB8ABC4253B80A41E86C1CAE9D900027326A80F80D733FF317B5 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B778884AA9370F3EDF28F4D2A407E13788D7C244EFC761339C47F0D2C5FF30C472620911C6AA1189A3 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EC1F68F33094A29325E1F3DBBA9FFD100D554A0FDB482F3D4B742DD15AE55706786424E1821F301D84 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3007E9F280FF2C840CC421836BB504016557F7485CCABBEFF5D837B2D49F837A2666A4DB64AA1BABD2 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6D61412549AB8552A1EA5C41E289DBCD14501DFF3575495D2A37A1CF590B0A5FA42AC96D70B008BD68 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3807EA5C0E6B541CB7D876F4D496453FBCD75F1148A75585CFCEC43E9B347CC1450A410CFC75350450 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4B12FEB91B7BA3CE2A3A999ECAF173741D7743D0E4D0A1BB79703A379A995107E6D83777019E450E70 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF9A4B1CD20593052527E8DA2E79493D67CFF585F98AD41E7D2BDC45361CC86A704842A1EE3FAE44F3 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 31A04A398D9531D56747C05517B6B4F222A344D31DA1C54C11906928DB81BF63D003222EEA1E228E36 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5CA76B55145CE668B7F00B5DCBFCFB20EC5BD5458DA67FEC78620B573905590A32617E5B17B6DCC0F3 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B35BF21F8E26F5A0E4113DF1302895F9E88ECACF3CC5325BF479A8DAFBFD562EF6DFBEC764EE7570E0 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 0DB9D9A27C7699A1718139A25C106C302A5DC1A07DA7AC7747C6E84A07F459EBB8B6749FEE97A4C6B8 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 66D91AF6ADD3F3C90C731F63EC7BCA09A334A89E9B31D2E33D88E14DB26A9A91E07779FF833001D178 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BC52E3C910549AD280635201C126FF30A8C35D5438A5223BAF9D7A81DD3B9695DFC682A00F4C8ECFF2 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = D2236B104C7C8EC1AC1A285895A7B8E28A724550E180E2D65EA59FB9A173EE86D23EBF96583AC6696F34 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 2F9273A6A44224262E5CFA4669EC1EA1660D7A5E72B4F2CA05215C6D901AFC9E63FEB6D926A25A382426 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 23B2E55F9394720F5F526B48EF3D6E95592550627E280D76E46255907D998EAFA8A0F9D763918D5B17C1 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 5EF404013889B46AA501BD8F4499740C747F1605336FC8D05DD4495FBF9C1299C0D3F3AD1350292E379E + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = D0F99CE7C21C19685041566F7FE1478BB98224C53339D614B474386F754992DA586190A2DE4864C9375C + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 57B18D55FD4EB8A51F1D27BB3905C98AB5B00315D0D9CCAD85E6885F0F8C1FF3CD472C8446C0FDD965DF + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 9A1A9F8FA43E4F1E3A0BB5B6340D7C2D10B6FA8FB4D42284646B614C7C5A7E7339E7BF5768B482B82408 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 7689006D1D4DEDBA1EAA354ABFED7F11C2AAD361AF4833CF9FC4619ED657CD6251EC03CC1604095AB3AF + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = C300A3DAF00F57853B3F1438FDC3F99EB16221397A00CD03CAB990F19824F56884DCCD2B1A63C3428137 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = EE8C3311E532B70C15D40B6C88258A52B2CDBB8BB2E7A173FF263CCA594FD84420DAA28541D2938FF7D0 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = D493859E21426DDF0729FA83B14D79D8930D2DDFFE4D151FC3E5F436BD6D296F62D7869D28EBDA44067F + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 8E3DD08702E40DB42D77BE0CE212AD31A43FEBBDEE06BEB7649A121C0C8B03DFA3F3C1F0A38E512F4FBE + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = B4994852ABF776D91C4E198A43B2845153CA017A74FECCDB56858D4D12ADE1CCC886480DDAE04B2DF38D + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 545ACD45EF5E085EBE31C2EBB7DFC889C167275415883B5874FD4AC8891317A8E363CCB3C216F985AE12 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 3196DC477B991759E08F51EFF2ABDE591363E2DA79F3B3DE58EDA3F449EE4F72DEF54B093B3D0FD4B646 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 94136BD6AD0BFC1639493CBECA119F5358E68D5830F64FC3C6CF103528D430C3A84DC619D1F8C740129D + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 44675858313FAFC239C2AC134825AB9249FA0A1AFEBC0F9E24E3AE81AA00649438BEDA77079C61C508CE + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8F3BBC66F63F79F1E0166CEAF876D37480412467FD2FCE41AA457322FC0430A1E1513522CA10B8B3B605 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 43453B3B34FDCA85EF36669BABACC1E7880DBD94C129C4B390B06B283C413904DDF9268FF33FD392E47B + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 60E30CFC741961BD80F68C50C89DAE94D50371429FB5F401A77ABC7D8DF5A84708003CD2325425FD7618 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E24A495DDAF3E6F39FBED9D18A0B147C58BE7DC8BA8ED69AFED0A73A14A15FFD468A4A42136C81C9CD36 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7C7882D78DA5675D4538DD8D4AE0FEECBD3E9F7A72D48714B1BF8A0359694B8CFE0317F6768A35868B78 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 6A0F6BEDFAEF7654A28C0ECDF9267EA4201216ADAFEBE4D535A27DE2CF379F9005FDD3E992C5D0EC1DFE + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 39CFC009C43DEF2F52246F362A3B2541EAC6D1D6476406C84A44C36F910C38FE0020F48D6144AC531215 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4E95BA5BB8474A603A98425DBAAE0A2D32C3D4D2AB6601F61D1E17A588B582E10F1A1E41E1B9D50A668C + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3DE43B508D6EF81242CE4ECD6D53E17AC531E5EF983A5C7513DFE23912121C126EE7B697E422DD414718 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AED0BD402177AA233E807BEB083F092777E86E574E73BDCF890AC486BBC20E9758A5361158AC63B136CA + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C510B14C8D9C0120BE0582A3E7F53C97DD91CEF554FF92B61BA5C59E49837580959EC32AD198F789B8D2 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 68789BC8FE865E56FD8BAB17CC096F46A53632055CFA5D0AAAE0CAB3F92B3E56037218C3E8DB8ADDBE42 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = BE1D9047F02F33A947A3ECEF45B4E95D1B0CB45E1F1F512888C9F3850D2CE1D9213AACE4E75E3AD3B5D0 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3021CBA8E58422B0B6C83C3FA010A42CF5BD24FEAF5A078790AB83A0CF7512AA70B80F7232776BB11E03 + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 11E8597D331AC825BDDAA3ED96EF73D0FB054223307778C6D08FC98B65C04DF69D43AAF6D067FFA11B57 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = CDBF73B3BE6C5626105ACB82F0DBC45794524FA30739CBD0511BC22D84945E7592F582C7E9D7BEB28F46 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = C782CF1F158BD5D2FF869312F2C7FDFEE5570D126A3C9A4A76122CE03CCB892AE9750FD6AF9E5A8C274431 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 07C58B1E6067D4200C955A9C5F36C3729CCBDC2F2C8F70BF93E3C84687524E46304F64A8BAC888EE64AC1C + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = FFC463A337973A33D1E5C699CD0B3009B620865EBC12522B787F155A1AF37099FF210EAF8EA33552E2CD11 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 416F7F6463FBE3F053D808B7CCD4EC4CDF2ACEAEE1C2B1AF8123707623FCD92A3345CE6F519FA0C2D9EC36 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 394B1EDB67DF452B5EDF045AC0AC472B0DA7AF7AAF3F3CD2586E7CAE5445D52F07C66D08602185B5641B0A + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 13A6048FA1DEB70B3C413E084BB48AD2E6C202F75E8005C1EA5093D88EB2192EA3108C6B94A0C3218BFAEF + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 084864DCAFBD86FAC5E32DCFCA69F76236E1306E7F93FF43879E7BA31333DB3951FDFA8F210ECA4EBC7CB4 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = D46824A773434BA7DC771B1D9C68AB6FBC27C50E3CF2756D76279BFC62205B135ECFEB13EC99119D0D64A3 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = E1A7F6D0A1E65E32E92B69ABF360940880ABA0D71B6F84BFE476DC82B7578258926022A43A1AD726E062A4 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 6409EB43C9C1B16132F0F2B9F6607CF2F7FC7DD50B397F3A6CDB696BB7018775C34CA73D8814679982A0CF + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 332501749A8E78B2E9489534928D98356A37A9F554372790AF71F735885AEEDEAD61BA75BFA94197AFB198 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 2D6C0D2925EE6C13DDE199361F9C456F3A1928FBA6DAA187E5AAF7E5F2DD1E6585659B6ABBEB8C2946A634 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 56D0DA27BFC072C74CD960781F002BA25B5AE3A50B16DAE8EB8D837620493BDC6447C5BF48B7A86AD14D9E + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 9A9E31780868064748D6EF3695E8ED6AC4346D6C9EA128551848A5EA2F2FB430303D5E74872100BE29537A + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 240C3426F4833D6E3911DE6DFD1DB717284979B5EE90210759A035F2FFEAFA72EDF6BAB122A91130DDAD7A + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 1CF0C49F3EDEDD4074A42C25332C214B1DD4AC49D4EEC8EE323B6275BE83BAC5BAC19340085E47C88CF39B + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 5DE9378912F6A2B42BE54EAFA85A3BAA6440BFE4405859E4993C1D2781D513B1F00812A5ED64020F862A4A + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B122B04C99ED6CDA248080E2F8990AE52069D8ED84DC153907BFC85D58D7997B4A4F01BE87009B93819B91 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 06B108B3B614DDA420E270FE03CBBE569A87FEC39A2F6AE6AFD719EC8BE2BACCA797F80A19D13903305BA6 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 1B4E4D412244EB0C53A1A737522209C5FF296AE8A67E387A4FC727190F3BFEAB1D9183016F502145C87571 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5974CDE0A9B83D1F7951FE10BF6C7662597BE0614179930E66736C0860FCFB1B39535BA28F83ADB0E9816F + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3A7CE1C904216DFB2A30E0E7F0C6C3B7AAA86E84CAA3793091F52950C8CD74CCEF17C0147C69D322D62D07 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A9EBA79480F30F234E26987AF6D5DE451A1A9FA50651B725DC8F858F7BE6ABCF345DBB3FE25922A5853818 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 28C2E3DE9945D3F657BED141EB433EAE62F588EAC3F04D69F306887E21216E80C350B2D53ABFCC0035BEC0 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 1AEC1B2188CB20A1484E4A4F71D32265C91BE55585D04D803E0F40FAC4C81C32810037B17BEC25C6D21DE8 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D3C564FB9FE0414DB1EB86F17D87048CA4353F069FA4B5F11AE9AA21BE69C8A5D4C91744FB3C6274738D03 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = BECAA3E99D01F25374BCCDE07909F67AD06556152ECD18AC701EBFF4F212639BB6BEB97D7DF982865B5CCB + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5B1B4173838FF8EC00FBBF37476093C2B17722577E82E01647BF9E6A2838E0356580F9FD4A34A17668F4F7 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1C0231D7C536C55446913F0FD1AB80D453FB2C542E1DFE424A507731212DD76C5218A9A988A6E7E72B74FD + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5CDE44B6D87CE86AB718A3F7027811FCEFF6DC00C779718C864A3D8886A38AF8A7254890605F2C2C31893D + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = AB9A402279CC153D47A8C30C47349977BCDECCB56B492153F0D458643BDBC20E0FE1C3E8554C34B6975184 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1E1A7A2CC3B969021C7269C434D90EC3DEF52EBF5B2EBD1A581ED366139ABAE80F1CE564C8AF7F8C89A073 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 490A471CD779A86FA89BF076897CD94C89DC927A70613DC18329626EBB9DC576E48CF37D6F2643A3BCE8CC + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = EFDCC729CB26CC5FC9536290E50306094BAFC7278717A6D3282A7831FACBEA1AE8D2788B02A184533C26DEF2 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 952088531D590CF43464B37508B2F1CEE7905742857020A6C79E3A3398B90CD6F6979F4C93D8CBF8C0B570A0 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 1C6A69272D18A71FAEF991937EB5CC496DE1D95DA0EE703F7127CAF8D1DBB51C529EB77764F82BFA33C1B452 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 18ED2C2513FB63984A64697AE5BC6E4E0A18A7612485B4235043890C6B26F31ED65AEC51ED8B1B69E1326677 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 4024341D5C6A7684094D2ECC62577F534665DA0D866694BBB05389F45283E8C782F642A4AF2FAFC4BCA50B7D + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 80E8CAC86A144B20037FE75F5996F33808E9BBC59CBF830C0EF4415F94D5AC6EE09FA1FD8F021A77CC282DB3 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 67B3A520B9D69B61CC135AD8EC0C336327F17FB5D00F06075194A0AA48CE19BE3C71D38EE48E64F000969FF2 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = B7A10EEE85001B62E3FE3051A81653E08E98EB1051074625219CECFA1F7ED427F664CBDB59691EA40FC95EE5 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 377CDDC78EAE377B7B996255E737FF74A194BA5BFEDF0FDC3963DE5A4240E11BDB0451A4C1C0831EA8B93C87 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = B6EE48757E0AE6082D3168821FC70C126C2CB6F24BA7C528B28F2387FEC2424387B46F65C4955AB76083751C + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 479E9E6F3B8AB7F16E5D8E7CA497B0843FF3572B019C8FDDBA77FCACF089CC1C8B69F83E2E4015FEE7F6623E + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 2A2E5A32624F836829EDF5455200D8C742C844B3FA908B06BECA71D8C870B4581C9049B8FB9DF5CA75FC6A4C + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = D05FADC3A0D9494E34905B40809350042ADBC3A15BDA667C60CE2ED523732749318DB5BF1178CD57D42CA2F4 + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = B1B950C10A17215AF3910A12FD10F77F77C33CF0E6C838F27F12358CB29163E8E9EA686BBC21967BC2D217EB + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 6F860E2351E6EB94CEBBD8A1E7DDE04BC10358C5AD9566DC3D687C0E1B6590F16EF9C0C3C1EFA180C203C7B6 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = FF3A0DA46F25DCE37116163CAD0F29A0E5D3F3FE771AAE97AB8C9C726099E1C2B4CA8EA2BCBA9E0DF14BD17E + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 9D54FB303E30C36D7B278957981F397DF8BDDAEF77D646ACF4B6276A8069DFC0F25480EC4ADC2912606E945F + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3C2CFC559DDA230939746F0D34360C0D8A6F74150397D220CD953CF943ACD650C2499CEB9627A779FA7ECDDD + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 399C962219976AB61A80EF095A0FF626155348ACDE7CB147DCC47333FBA88F7E3F73544475772EED52C093C8 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 50096C6D903BB46959C03F80F76BF77790A088D4CD0206EAEB4339B5528B275666B02B904FF52DD3C401FDAC + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = EB43A18BCBC8A5FB061558A5A2BF7641BA51DB1D5609C90DB1EF3F4578820DB41CF062E0DC2888E31D2A10E4 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 121D62D6D91747DEECC06C68C2387681F3E6007B5D985B02FE1C52BF278160615E2145897EDD60B89C7DF2FF + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C8FE19F1A2DE050F3481B7805646106B4A7324D671880B751F5B9296F03920AB8C7A8650388E4C9CC4C6F02C + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7F7AC537C2D15A4CD3F99E72F47CD03966940F8911F30BD0AF9620C9ACE11B400101A7705C06659CAFD25EA6 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D9AB5EF662184007EC14B8428E13B47F8E072E4ECCD59A59A8503386B539AEE42AE541D9DA342EB3905D0172 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 48908D93866C65CF4A6AE1BE0496A7090F216588E7E533FBBE42B8B0889E818A0F5A733F952F058A8626B55C + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 98F131F5BCADA19431C9D0773CA033CF1A441045640ED789F320392270F10FBD7F8E8F23126039F13CADB6DA + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 43E4BF112ED18CC793B5EA33A596988B9CDAEF510525C9249BEC334801DC46169A531D2D7698CCA6EDC5A5FB + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1EDF9942EB3B5FCA901D29F18FC5FFBFD73D94C37434D67E75607E763868F1DF2147813ED88B7B61142E5EEE + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FE931F5F2C33A501EF676C4360068F7E0DA7919EB77F761FA0800FD561D48EE0FC650E16585E8EFC794D3FEC + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 412CCDF8856FC281F4C1C4B1C5BD1EC1F06FAD48A61340B0877ADD97AB42CB65F3F1475E5BA4F9CA5858F4AF + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 792F60E34E0E8E2F97399772C9FA287BBBC408DBC788E3929D712EB30BCB3C5E568877BED694A899FF7F1A55 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 6492735ED0AB3767C24B44CE0E75971503A43F649D77A3643FFD3C6744E8A901E6FE21DDB1D60F2A4E5BE736 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 2D02CB07F81D15B0CF3CFC33508A4D18C132B585C359DEC9BD95D3ABAA2A7F77DD56B158BD74C3B5AAB8DEE264 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = B8A279BEB87E3B754CBC70969EBA93E33D18F6A87703FF2CC3B0D2247C557AA05228592667F787011CD18F15AE + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = C83DB584EAFD20D4D0698942B901049DB1C07B11FCF71E0AF10E29866480FFAD717CD596256CCB08D97916CFAC + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 29E00E82C1881E1644DE8FA656BF751A26A35EFF73853ED83819ABE6CAD5BFA8A47ED8E95D52DCC57937156D57 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 94DDE6FBFEC29AEF1BADEF02FCB91CC6436B901A86000AFA02E18E14A2BC6418FE5AAED6550E54B0C75C22C790 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 030FDD1965AC30C43722947C71F71CBD6F7F09DCBF1BE15F9FD33C401B43CFB4EF413DCAA2938BBD9B0F523FFE + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 7FAE53F078CA65CBD1A98B1078DF19F3957E9B445495C4AB65092E3C7525CEEA95DB70BB03E0727CE53C6A35BA + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 884A1004008AA3C99DF9CF7421A36C807CC5184793F358DBE67CEF17580B2F0254D28AD87E0BF26E8F99752609 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = B7AEF3DDB247580D4788C520F03213FE9E7E45CFC8438CA722E2D9DE12CE4FB84BA884389CBC03D67EA5E612F6 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 4CB0EE5B066C62708F33B7448F81D90915BFE4846AE871CA4FF11D307A7B20A353C42B8A174EA49610B381107C + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = DAF29B164A2030A37B9EF7588FA77A3AA14C026B3AD9238278B02F9A6E8D5F1851F1CF868D3B83FE6E55B4A666 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 8AA3947D0B39B8EE2F443741B9CC2D8678BDC0E809759E04F46CBA16B59EBFC68E33582B9AF745B7818D87F39F + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 3EA9D960B2026A503706FCA8CEE080E4A67183403588CF8C37FD15F3DE4583F83D1FA00CFA453E5D30B28F7247 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = ADF9658E9071D7C2EE55023DB6F7D778B19C0FCE13399E99C93EDC235A80C6D6B9E543D30AE4B212F65D917FE1 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = BDA0FA837F31091ADC378B480E9717335243B6CA237BD6190FB31B50C28803319913BB28437927722EA7FFFF96 + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = F9C5AEB97858EDD584AAC20DCF3E45DC97B3FC72CE6411B919ECB8046905CDC57C0FF46F1ABFA03253681A1051 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 5BA44589251A30313254026A564E4E943CE89AAA831F1DC4F2C8DFCFF67BBED0F86704177134BF16FB4A44D656 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 63E278ADFF540F1E938DE1F8275AE000661978817840054CAE8D17AEC221D55A8B7511ABB33A05D43A93A817C2 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D6EE25900CD8FC4B0109679D9D86E36CCC395B5A39AF5F1340DC38E1BE6C1A9612F1ABBFFB2E7EC49FFDDD818B + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 457FEAF082D01B32D77B026CA7415C02F91500C780CDE269F3002EFCFDDDE2FB8DDAE81D3416B73054024F0040 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 06C2D6B93C9059A3732B1B088E6E6F47E45D59B5A4BB5EEE8E3C4F6FB13B21FCBFACE3692E51F33325E29584C6 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 187EEFAF01DCDBA9C58D4631EEB8A78973CDA648850A7F4DF3225FDDB75F42302D7E763E3CAF3AC6AA5E9D737C + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7BD3128CFEB387A632C903087D01B8B27F0A761D2C01B0F143260EB317C7238D9E57592B1D990BCF8F240B7E2D + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DD9AD952745F9882A89C1249A0DFC4DC31C4DA5F54CDEDE66DAF328647FD2A92B8ECC7246A3E571B4EF7E876C1 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8C2EE9657F692651EF7BABFF288842E399AE842256073DFA898A97A9755742C28883B2DAAFF6F69FF2BCC59A16 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 522B7777043A396FA25CE42794B49E947B81F96AE3853A418DE57AC7E6E93FCAFCB0A24303C7850ED75917C03A + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4CF197D921C6755E2C46BE7C1974922D7B58901429915B956C8F564C9376B7AC83D3D0BEFFE8961B532D929F0E + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4893293B161B3F5C7ACEA31AB2D659A3014F2E656503CD9C46BD0D17678A23D6D7AFCC685C4F9010933F395010 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B62B92183BF72C0EE76276C5F27C7B7266CC87D0C94FA59B83D08C5EBECFB1B9A1275126FE32C07B26097C1614 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 59AD0157687E9D086F3C9F3B2BAC29FBEE5282C7F19AF8CED84A0C63D88F5F9DA0912E4D2CBA4823A23B1403DB + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C7DF6D472DA48173B39D981AA8B1538B3E89FBCCD586353F3BC43543854D4F49D70C447DB1826DC90029A08AD4 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1B7EF6B397E852E526161E174628510BB2FDE85C7E7F80CFB709738FD16BB3E9848193322838CF33A707F66F14 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2FF0BF977E592B3C20A5A4FCBC729E6D9A4F55B1B0EC38908462FB270EE51E75582947F10C8B0D000EF7EB69D9 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = AC3BA4D8FD1FB7E4E4EB8AB50552F9D4FDD4FD3889350677B3C4093558B4BCAED1A3DFEF4B583AAF8AA239C10046 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = B91BF645DEC78F44F10C97ECD539C7F78E46D6BA8A2CEE1AFB9493A92E816A9243DA94CAC3D4A89B854F3A521648 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = A42F699565581D0AB2E63F9DC7A713A4C6853E2D82DA113116B8D52CF6886CB57EBE624A02A52117EE4235E35AE3 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 379ECBBF47B6E1DA03D4478EB812FDBF14B684873270F4FE485475922607D6152226C8FA21DD2F80CEF0A606DE1A + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = FD3AA86A08FD4717F72B4AAEF3C7602625473D01D1F1FC9AC3888F19643C21DF912A000561C6B4D03E6B9FFFC6C1 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = F2F7A126BB0F6201D6FE6C8C0DDBFEABB9F268A5E32C706D862BC1D044E1BBFDCD5A0D7C2D7552DCA07C93263667 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 93241CB3F9692301FA92CE432B41A738A97C8C963A1070BE5B94272432962CA185A60B80D8E2381A06BB3B17ED49 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = F926755417B14E2A2311666E859AC442300D6F34EA2EAF7686DC8D479E14C50695CAD3148B115D0049729DF688FF + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = F9264345789E4D04D34E11975F30531399178E347E16C40655DFEDB427EE48BE87D6FBB118D8BFC7640DA98AB628 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 8A9502076BC037BA0151DBD9CAE99271E374D0392F4CAF24387EC5D78A62DE6F90F66196D56C7FA672C17E2BB80F + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 5E09FCC818B7A030950ACE776ADE597DD9A6C94205B96880882A8126C8050198DB00FB8041058B0653A89398CD78 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 125EC25CFB9D5560DB280AA64770F4C75C693C8CD7B13850415B14ED80E9E4611A53C20F3F0A535E4ACE65D4D3CA + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 47D044733CDE7772675885438D74BEF03C1B1259830C72D88785000F2527E5BEC89368A284BA670383A8CC30D9C5 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = AB1604655F43A48BB54EEB0806404DEDE9E0737215E6F059B68EDF6D3AFE757639F5B4E775D4933DAB15240CBE27 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 30FAC67EF992281C6E5DAD77E993742921F25F9355C8E5C0CA8FB92E8F26648571068D292578EADD631E9EB81B3F + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = 58FE5607046968199AE075CF2F45D7BBA1D0E9BA3E974CCE7AB8A0800AFD0DD0F77060B5FED3D92D5574A25BDAA5 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 2E68AFE0E999EF4D857F6DF87E255F8A5E23F789FD17E4DD5B3A013B8BCED8E98D2E9CE17CB131FF267B5A72C964 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = ECF0737A2A834AB186038F33B79D8B71010DF93B61E3318B82C8E63746F8A62C61665D9425C7C5511ECBE469279B + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 88215258ECEB460D7504344F4ADABB498655D69987AAE0640792D3A9DB16169FCC2E02715F61B59A3E0E69222287 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DCFBD0CF6175AB114EA0B1C9039F850CE9D9C0226E4FC5D3BE9E261AE00DBA980F76F5327710C9F6A25A13D5A40B + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 09703EFAA0EC551EB94104A04A8FA2DB44EE9545482DF2DC5E99B59F3607C6054BC07FAA2DA0C76A670AF58344C8 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = E35DC7B74BEE47C906A2F61C0D91155B62882EA23411BFA56449C7060B2FC348B84E5F74616FB0D2F386D1622BD3 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3847B9F973C6E4C4FC5FF29E933AEC5704E144E8B15E3CB72B6C5F560E6957B0013C927ACF155475C86585812C30 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 6BA4DC49A181BBE13EC0933EB404E856E6DF801C003BB95170D63225C3D8A27501DEF5D7F50D0BB5F53C69CE1D6E + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D45170DF12038131A4C49174E4EB57424F440DF6DB0E532200A4FC7DC6A7ABCDCEA28ACE19184265BDCAB3135F03 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = E3C8D311096371EEF95F4E829FC8B98A2E4DCE3A4504E0AD3A72476F7DDD9A0EF43F40FD1AA580A5D76C7E9642CF + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 258C445427EEDB7046D755AC809ED35FD28A06ED7F4F9F6675E334F7DC3E50FF1182C20A4C08E163E7C4D91A33EA + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4A75598458FF4B69585F655B96397BB0ED234539D766DCED53ADC54349B755A062EF527C8AF5322A1CCD2884EC21 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 0340DCDB13DA236BC7C11A2F81A1F47A59B4565E5AE97C505AE46A5A210C149C24A5F3D155B77D4C356665BE9D62 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 35FD64FA299CB7F1F8FB9B64CC34FF89A306AE9C4A4969252A7D6897BF74CC21AB8B90F7F10A3C6321DCF06519AA + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = FAECECB82D672AD5016280DB308DFF96AECD3B32766D315D37D8D95732DBC0E7437EFD3855EC073499FD234B8A97 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = BD5D0BC4174AAAE88A91FE7541DE277C611F2F2A948AE3EE5CA73A00818B70AD3AE94D5D1CB32875F2F805B4A119 + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 69D9D819CDB976732D217582C728E704A11F102D43551AB6AB1DB5ECCE3E098989B2A74B298D5580A2E1B7EC10A1 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 4D9ADC0BF02AF70A2814CDE85C6FA9B3FA02D0CBEEEBB049E3D90EFC5C5C6C8F13DD817FECEB941DE126B47BC0A95B + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = AACEAA4A8BBC11ED8E154F1261B0D2669A4E9143A293FBAF451657D2DD1A17C5CD9715D9AF76B4581CCB69668E2DF8 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 3DC4981029727CD4C7CA62011A46888A2278C94E26BBA178FB4B3AFAD3775BAA8EB9C5E29AB34F047CCD395C0BF564 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 8BEAA4CBB05E3311C352E7214AE46D01C3763D02571F5719A90387789AC654B9CC17BE390AD7AC7468085B487F6000 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 9F3D1141314525F81BFC7677DA5B0B5717BEFBBEC818A53002251125369F8D9F7D72E659AA4CD41A24C719FD47109F + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 6B140EE248DB6ADE5555ADFAECE58752258B93ADEE3CBDEA86E5738B21CF0FD6C4BEA32371D907039F8080341E10D4 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 01173950930C548848D0D07743C450D1882F0764A275094B33F6B25617580FA834CD6B3A1224B39BE2EC96C04D8CAA + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 30DC22068F913550F8BD014E755796188F075A7032A8FA20996BCD6D7E908FB1F1CB3E00822E3272FD54B437A6D166 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 154436B0F082322A3168FF8DA130D4855824ADE87CC9F501030445D091EE1E1B7A4FBC68DE29233A8D040DBBA52714 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 4056571BEBE4B2FA1B8B5CA421E84778193F5EF213C810C761BF61CE9A7C0591BB4E6179589B248A52680630662CAC + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 7AD7E4D7715BD8E38B31061F4FB432BF8E74383FAE381AF3FF112AC75794C763A55EA28C96BE3AB8640511769DE761 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 97BE5BCF9463930CE53636607562FE30C3E5CA28F7AC25675F683E9F02CFC64C71A29BBFC2DA8656F2FDFC6C56071D + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 9FA7311184278879BB443D88EFF9FB9EBA8BC93E9D75ECEAAF8891D5A75EEC1B102F012246B1D2DA6FC50A75B49F51 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = A6377BA5B18249B8FB572B8107404CF18AD87A63D0EA1C45314500CC1AF12A8F80754DC7A05E48D200995A281BB3D5 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = DB691E7C99268642EC19D0C8799750151F064B9B649E0ACA692FE78A28FEE7751C4F79C053B16D670EFF65B0AD590D + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 446776A386FFF07AD1B58D2292C14B1BE445E342528A8B450543D530523959A4AAF16D545DBA739DD0EA9C63A6EBDA + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 2FE478180C687501D71A7017893FF11853B6D7EC57743A0A87D6F3267B0E7601CED4A1E3F7E6FE7483332FC9AB308D + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B899B04CC6D25404F63ADFFE48FB9F58C50D8BA04DFD78C938C1DD4DC128C9444AE31F012E82296CB25F1E386FD2A7 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 17719EFC83717F5C7B6D26DE3B655D8B2083FAB3B82E3DE29A1AAAE416E5218021D8EF4DD3B25C104BB6AC88EDD335 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = C32018CEAE2120FA9F74BC65B008BCF8F48A120C750059FE26D44404A1F34FBB3D093BE24683DA8CF07CE8A146F463 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 03BA31A007E9B85F54C8E7EDD151CA68392351B658C125C931C802B8A88E73172404793B23F2FFA4CDF5E3CEC8BA40 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5E5874F5A33939D59D7989C7A0A07BFF9FAE81E3E34EE0717C4D55ACD22561AE2B99E3E55066EE9740228CC8D66226 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E55BD12271CAF0CFF53665421B4FA84F3C47D3D682D787E37D5923B627CC7EF2458099833BA7EA8589858367B446E5 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B5F4F9B75FA113EBB64CC9FE47BB53E9CBCD424F8EEFD39303CDF53A2580E636E59ACE5656732BC1C27068AF678BF0 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8A74C5947AA10528D7C468C788105833E306BCA70D26FBA7952110997046809E201EF3B6BE79A07DC6DEF2F9082949 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FC9C817488E7ED024138BC8F17FB226D0E67E9D88ABE18D46BE7EBD8CFA47E88F173B73E7DD1DA096BB53156847404 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 01F3832DB7CAF37954437F0B7D3C2FE3EE1E77BBE6D10621CB0C4D9AFC93F3E32AD9FA54B249DAA329EB6F2E177B4B + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 62D5D334CCDB01CEC98064D0DB12F7B6A5FA0229599ECF8B529C79CB3AA8F36031D41C2D56B11C9DE39412CEA9EE9B + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 865427141166FBE5DD2C51D8D76B360CF465920D6F04C6815D273BF2928964E230419E29380F63E5F0D8A4F23870F5 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 2B01D0C619CAA175858FA196805F6E07540AE43FA62DCF77168A668C001CF55DA189BAD81CAEF0D7D5FE9D4FC6D78F + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6984E144A2E91D905218A94C0B141AFE92F7E0E355B43B8A48B9988D4B3201B0DEF89F501043DD3C2E0B9D119D3FC7 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 209685C1C5FEDD1D7F8E984982B57DDB56670A723B0CEB4CF5F91B88CE1354F4FE2FCCFBC822CAF113210D837978CC + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C3B38384384A023B5F6CF0713AE069EE8E2A27AA2AEF46571D8345F6D9DBCDE0F1439AEB19375B825251191B391E2C + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 27371D8ADC21BCAA8B25D7728467F7D5034ADF5843E37C600A8C37B993253C09FFEFF0A3309EFA8C6FDB6F08E8A71B90 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = CA8C5690399601E7D0878BFA71929BB5043DC51ECA6A3066001154D45395AAC1BD7EF7EF72103E90259B62FDB7A9ECCC + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 5762AE4D9DB66EA180B231295508B4D41D4F8DFE74B2F1E910B939FE76C5CDBD8097D1120AAF76A0EEDA77A9CF22FE2E + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 8E52294D268420E22B8EE6996E302D2142BFF1EC46D48BF5B239F1B88D344F2DC12C7ED3198485D730F16FEC0E4006C0 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 6B1DD272D0BF487600751A65A8AAE690DA8B67D61E1960A6FECA9FAD46650E266C7282B7AE9EEDD8E3FD8A1F1B12DE88 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 6AC21EF1FD293FDA27605C0E3B7EFA9ED2C80792342A56754625D6D1593F871A7014353B6E321F1AC068B1AF6A2144A7 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = F7E0B99656D311A8FC85559DAA1F3015B29F781EC2CC1A53E0600B0D91BD07181BE184FA7AA55F2B9ECC29DB8185DE29 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 8DE19B6CBD291D900DF3BAF1400D3B496C0A56C34DB4D52F22433B6D3417C19FE62BF66727E6492465910B0128100504 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 98B73C7783FE45C5CD3558FE4E9CC4974BADC60ADAD8D480A2A97DE44DD268DADDBAD4EB3A17966A038AD5AE2C6CCFC1 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 2C2C80C46D20C6A1B6E8DD1C45E82834617DB1DD20908631C06550F3984BEBCEEB4C3E6B57CF825C3AD342E0B1F4B546 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = B4BBB437B5ED41802A4FB33DAFD1BEED7209E77DBDB2B8D02ECF771E9F029A82EF76175774BB74F523128DC29741D231 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 73A31AF12EFD0C38477A7C82EA47D22702E2B02ABBF3A226D937B5AE83763E75FDCD9F18556713E8FBF0D140693BBEDF + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = D86476282B18B397ACDB84E197710AAD02584F427CD38020447D891D0DDF8E9C52E845BD496D51621156FA79FB53A9B0 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 3E739C1937822B89501DC8E81C5B42033E3A37E304108C27FDD00CB4C67DC041C067B120B348799BE333E1DA39084F01 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 50848D70E65BF3C6C029395AF5D94798B2DDD548E701491CFE5C7D59F14CDEE6D8611933145568FA885E95EAC2FE3C72 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 9593262E35221CCDA7938F3C408962A988877C699ED9AA291252CD2383CEF284D7DDF9F8076449E083A89A8A7527C8E4 + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 2FDD9017A1FFF250633402F655D418B4A2D02CDAA97CDE29242B6F6EED9C995DEC8FEE9516090542D48822815E62614B + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = BB6DEE1831D5DE9BAC5CB3CAD00F7D488D97BDDE62599EE5CDBBC993C7C349A9278AA94C4743DC2E120713DF8AB32EEF + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 05F26CE65857393802D6EE03C52A97D5BF1D88F6B6257E2680B9DFB9EED70161691CCCB237E4F4F40619B92ACD659951 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B615E3B4E109DE3851AFAF6FD2C78CA29B6F5147374EF1DA331C28222AD1460D758FF202C0944E2432188B2D4A529627 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 34763C8B76DBC6F32E686B6DD25D203DCFDEDE1EB9B68F5331EFC779665FEEBC63D95CA349A1D45796A62326BA263446 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = D9C7D0FD9AB9E1173FDEFD4934306B30C60FF1ED77F2B1F1116092196AD1E0D90E47709117D53AD185F6E2781DC4080A + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 897A8221995015E16BE3A494F0FD56A98BB3516575EB4E50958E01BCF36567F40DDB1CE10C332B06285352C8BE1F93B3 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 4B3AFD6B39606AFDF8FF6B516BC427BE3411D0A8E89A3D04879310DBB30E319ADEA6AA25A53E009925CFAE230DE44CDD + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 56CF988F23409C0AF729AF79DFB0870F0F541874B1900D453BE70037F2075CC53B1102E33FBE0A8332199889E7734929 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8EBD6A35B6FDACC31F91D782984D6C5568DC890102835506F94E162CCFB5930035D1A6C0303F76409B6CA5C13EC0FBA2 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2A4C3F95434BF2BEE60363D605E8ECB6F2715521EF381FC90D2C030AE5A2D5528BA42C2EFA2127A526819BB6F3778D77 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4226EDDA3AD70DE3ED6234599D2BD67CF04C145FACD8B0D1B9EB92C69F724EE104C8894261C58F8C9699E741EF9C3AC2 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DD8719547E0EAA3E6B60D31044EB55D2B461AE679156360FE78EBF665829D1643AF4AE873EED02E4493489A39F9498CB + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 6442195505A743BC1AF5184978F845AE48D821DC264292576DD8FC2EE82D082924A317108F6C131184F500E336B5B3F5 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 6BB9CDFFE53C0369453B3B4CCA9DD45E5063F294A12BB2902C83B9309880B229AA25B9E7C7CA06920327E75279B27CD5 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 9F8B67445D2191D9B19F0BB29C5ABFD5B2144B562D660DD2EC3E64C3B8ED8C735714EAD76FDF5D94BE66CEB7A4A3A679 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 0001020304050607 +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 13B7E23CA4D9BA48C512F552C3DA0A40D2F4459954B6D11DB1A598812DEAF417FADD8FE2A153FA8D52CF6B2DA5749500 + diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.c b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/api.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/api.h new file mode 100644 index 0000000..6656888 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 8 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/encrypt.c b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..c6f2a7d --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sundae-gift.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_64_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_64_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128-config.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.c b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-avr.S new file mode 100644 index 0000000..641613a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-avr.S @@ -0,0 +1,2104 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-full-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-full-avr.S new file mode 100644 index 0000000..ff11875 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-full-avr.S @@ -0,0 +1,5037 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r13,X+ + ld r12,X+ + ld r11,X+ + ld r10,X+ + ld r5,X+ + ld r4,X+ + ld r3,X+ + ld r2,X+ + ld r9,X+ + ld r8,X+ + ld r7,X+ + ld r6,X+ + ld r29,X+ + ld r28,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rjmp 768f +30: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +768: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-small-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-small-avr.S new file mode 100644 index 0000000..77ef9fd --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-small-avr.S @@ -0,0 +1,6053 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +678: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + cpse r16,r1 + rjmp 678b + rjmp 1175f +830: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1175: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-tiny-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-tiny-avr.S new file mode 100644 index 0000000..e7a03f1 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-gift128b-tiny-avr.S @@ -0,0 +1,6766 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-util.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.c b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.c new file mode 100644 index 0000000..d192b8e --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sundae-gift.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const sundae_gift_0_cipher = { + "SUNDAE-GIFT-0", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_0_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_0_aead_encrypt, + sundae_gift_0_aead_decrypt +}; + +aead_cipher_t const sundae_gift_64_cipher = { + "SUNDAE-GIFT-64", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_64_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_64_aead_encrypt, + sundae_gift_64_aead_decrypt +}; + +aead_cipher_t const sundae_gift_96_cipher = { + "SUNDAE-GIFT-96", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_96_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_96_aead_encrypt, + sundae_gift_96_aead_decrypt +}; + +aead_cipher_t const sundae_gift_128_cipher = { + "SUNDAE-GIFT-128", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_128_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_128_aead_encrypt, + sundae_gift_128_aead_decrypt +}; + +/* Multiply a block value by 2 in the special byte field */ +STATIC_INLINE void sundae_gift_multiply(unsigned char B[16]) +{ + unsigned char B0 = B[0]; + unsigned index; + for (index = 0; index < 15; ++index) + B[index] = B[index + 1]; + B[15] = B0; + B[10] ^= B0; + B[12] ^= B0; + B[14] ^= B0; +} + +/* Compute a MAC over the concatenation of two data buffers */ +static void sundae_gift_aead_mac + (const gift128b_key_schedule_t *ks, unsigned char V[16], + const unsigned char *data1, unsigned data1len, + const unsigned char *data2, unsigned long data2len) +{ + unsigned len; + + /* Nothing to do if the input is empty */ + if (!data1len && !data2len) + return; + + /* Format the first block. We assume that data1len <= 16 + * as it is will be the nonce if it is non-zero in length */ + lw_xor_block(V, data1, data1len); + len = 16 - data1len; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V + data1len, data2, len); + data2 += len; + data2len -= len; + len += data1len; + + /* Process as many full blocks as we can, except the last */ + while (data2len > 0) { + gift128b_encrypt(ks, V, V); + len = 16; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V, data2, len); + data2 += len; + data2len -= len; + } + + /* Pad and process the last block */ + if (len < 16) { + V[len] ^= 0x80; + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } else { + sundae_gift_multiply(V); + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } +} + +static int sundae_gift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char P[16]; + + /* Compute the length of the output ciphertext */ + *clen = mlen + SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (mlen > 0) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, T, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, T, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, T, 0, 0, m, mlen); + + /* Encrypt the plaintext to produce the ciphertext. We need to be + * careful how we manage the data because we could be doing in-place + * encryption. In SUNDAE-GIFT, the first 16 bytes of the ciphertext + * is the tag rather than the last 16 bytes in other algorithms. + * We need to swap the plaintext for the current block with the + * ciphertext or tag from the previous block */ + memcpy(V, T, 16); + while (mlen >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(P, V, m, 16); + memcpy(c, T, 16); + memcpy(T, P, 16); + c += 16; + m += 16; + mlen -= 16; + } + if (mlen > 0) { + unsigned leftover = (unsigned)mlen; + gift128b_encrypt(&ks, V, V); + lw_xor_block(V, m, leftover); + memcpy(c, T, 16); + memcpy(c + 16, V, leftover); + } else { + memcpy(c, T, 16); + } + return 0; +} + +static int sundae_gift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char *mtemp; + unsigned long len; + + /* Bail out if the ciphertext is too short */ + if (clen < SUNDAE_GIFT_TAG_SIZE) + return -1; + len = *mlen = clen - SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Decrypt the ciphertext to produce the plaintext, using the + * tag as the initialization vector for the decryption process */ + memcpy(T, c, SUNDAE_GIFT_TAG_SIZE); + c += SUNDAE_GIFT_TAG_SIZE; + mtemp = m; + memcpy(V, T, 16); + while (len >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, 16); + c += 16; + mtemp += 16; + len -= 16; + } + if (len > 0) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, (unsigned)len); + } + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (clen > SUNDAE_GIFT_TAG_SIZE) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, V, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, V, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, V, 0, 0, m, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, T, V, 16); +} + +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} + +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.h b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.h new file mode 100644 index 0000000..9040dd5 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift64v1/rhys-avr/sundae-gift.h @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUNDAE_GIFT_H +#define LWCRYPTO_SUNDAE_GIFT_H + +#include "aead-common.h" + +/** + * \file sundae-gift.h + * \brief SUNDAE-GIFT encryption algorithm family. + * + * The SUNDAE-GIFT family consists of several related algorithms: + * + * \li SUNDAE-GIFT-0 with a 128-bit key, a 0-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-64 with a 128-bit key, a 64-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-96 with a 128-bit key, a 96-bit nonce, and 128-bit tag. + * This is the primary member of the family. + * \li SUNDAE-GIFT-128 with a 128-bit key, a 128-bit nonce, and 128-bit tag. + * + * SUNDAE-GIFT is resistant against nonce reuse as long as the combination + * of the associated data and plaintext is unique. + * + * If a nonce is reused (or there is no nonce in the case of SUNDAE-GIFT-0), + * then two packets with the same associated data and plaintext will encrypt + * to the same ciphertext. This will leak that the same plaintext has been + * sent for a second time but will not reveal the plaintext itself. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-0. + */ +#define SUNDAE_GIFT_0_NONCE_SIZE 0 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-64. + */ +#define SUNDAE_GIFT_64_NONCE_SIZE 8 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-96. + */ +#define SUNDAE_GIFT_96_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-128. + */ +#define SUNDAE_GIFT_128_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SUNDAE-GIFT-0 cipher. + */ +extern aead_cipher_t const sundae_gift_0_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-64 cipher. + */ +extern aead_cipher_t const sundae_gift_64_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-96 cipher. + */ +extern aead_cipher_t const sundae_gift_96_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-128 cipher. + */ +extern aead_cipher_t const sundae_gift_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_0_aead_decrypt() + */ +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_0_aead_encrypt() + */ +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_64_aead_decrypt() + */ +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_64_aead_encrypt() + */ +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_96_aead_decrypt() + */ +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_96_aead_encrypt() + */ +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_128_aead_decrypt() + */ +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-12896. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_128_aead_encrypt() + */ +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/LWC_AEAD_KAT_128_96.txt b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/LWC_AEAD_KAT_128_96.txt index 7812e86..feeab24 100644 --- a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/LWC_AEAD_KAT_128_96.txt +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/LWC_AEAD_KAT_128_96.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = -CT = 27E3EC935A23EB9783EA9200440386EB - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00 -CT = E6D107F6BF53285BC286169FC2B51286 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001 -CT = A756F62D8B0D9AADB53009E3283509AD - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102 -CT = 5811C9790A0D1135C0CB555E246C0F52 - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203 -CT = 87A16F77AF05EEB7AB399FFBDDCCB76A - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304 -CT = 1F69B61D00D5D3927FCFB96DC31145FC - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405 -CT = B6A35C549CBF0FDC909274E1492BEBEC - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506 -CT = 1C2BB0583735A2B001551603CC45E014 - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304050607 -CT = 2D9094783564CFAC5DF23F45C2D8A71E - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708 -CT = 76232BFC14C73BDA1ED66514751EAB03 - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506070809 -CT = 77B4C51317D1F41F5C920536EC4B990E - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A -CT = 9071C8BDC10C019FDB2005E111040AD1 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B -CT = 7D02FF411727612C6024B4CF50C77A62 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C -CT = A949F616C0BCD323031CFBACA5D58AF4 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D -CT = EBAF56EFA313251EC91808ECCCA319A1 - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E -CT = E2C5CE8C968B79EE79D53CCE2C37566D - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = D2AC7881EAB3E7B87A4BB40C3EE8BC9F - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 56B5632E405BD430877D7CEAC05E326D - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = B65625FF4CED31EF137A9E1220E5290E - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E426D802AD46394642A01BA86C100A98 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4FFFA5EE91F009742335229F34F47895 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 26C694E2D5B676C0956B5D932022EE71 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = C5F84B049435E5F01D88FD29B0927959 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 35EEE737B5B812C9439C16C247AD54C2 - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5CAF53E8FA918EB3CF68E088479490C2 - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = ADDDF897725E05EC2434C1FEC467129E - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 01BD9A96F15DB27CC2364D0EBDB05AFB - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E4B23641290A3398776496E85AECBEC - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = FD457EB289EF20B132520A7E580EC90D - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 788757696F6AFF760F244DAFDDB667BA - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 68DAFDD24522F18F87F6901DF7254E00 - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8063E67327A69D0780EC35AB2347AEC3 - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 60A1700E7AFD01C2FFEF99850DD8E0E6 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = -CT = D7B9D631D6D5663ACF2FD336E424B9D45A - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00 -CT = 2A963A46D29E878AACF53627B337CED825 - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001 -CT = BEBB22F934CD66AA5F66CD1DECA3B15B07 - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102 -CT = 7A4B00EF7A3D731011494D7405DC466045 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203 -CT = 9F566EF5757708424643E5C8D108E969F8 - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304 -CT = 2AABBE3C7879EE89BDD145CD79278B8B6E - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405 -CT = 6343261560787F1062396E5D5132CA7EA6 - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506 -CT = D07858A171EA2C4223F3A47E4B06D57D4E - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304050607 -CT = 1C892FDFFE7821844AE5C268A9F8B638CB - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708 -CT = FFC8E442796B6F1AD14A3684F794E13BC5 - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506070809 -CT = C79E812C2CC3AA074867D14E6A9FA0F8E6 - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A -CT = 89F07D41EB1585E7637E8D7074E95F71E7 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B -CT = AC4ED87C16FC32ACB8F5604C3118FEB06D - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C -CT = FCE0C434795B91FC4EEC9502D6179D1E7D - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 7A887B4EDF63C7B7F04CA5CB4858646DC8 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = 49C02FCECDCE3F84EC9FF9C31957D6DA9A - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 89C8CD2108263F6F4275D5B283BABD0FAD - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 3488158BEACAF69B3FDA4CE6020F70BBD6 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 412AE55FF0CAAF235A7B7431D010233F27 - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 10123A52F934C48BC91AEC8214AB2103BC - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = AA180F47C478FB256A123FAED71DA809DE - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 9DE00A6127EC2AAC9B35067A1EA211CB77 - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = A2E71B9BE526C3E0E078122D5320E044A8 - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9CA1C25308918A4D211724F38EAE2D1A12 - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A58AF084302512620E154972166B58E3F9 - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 6949C608C4D412E734DDAEADE95B42C90F - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 522C9802C6284A21A3C706CD570AF196DC - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F45844887E364BA1F038AFE0FBEFEA7670 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 850F7944C2AD71BF694A6ED52242F6B543 - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9BAE744E648A3A95E0364DD87E71D47370 - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 5754702ABA2BCA396560166F2194AA703B - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E265F75ECE42DC9316D6DF93DCFCC09224 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 7441839F91D4493097D5855346E38B254E - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = -CT = 1F481665AC68E21B93DFCDB5C80FA31B29D7 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00 -CT = 1BFD3B18F5745EF939C848A8262497EA963F - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001 -CT = F78A19BA7E6EDCB617A89C11B22BA5099083 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102 -CT = 01002C6B40E4C365F379D1D8BE0134CDF6CE - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203 -CT = 0ADA925283C22F1E46605D7128F460898FFA - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304 -CT = 82ED1F61249F6FB23AAB8CB1B78E9B8BA200 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405 -CT = 54B094BB3C0F96C0E12A9FBA4CACCDAC03F4 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506 -CT = E20CD2BBC242B266FB56351C7FB92DE3EB90 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304050607 -CT = CCD346EB167CF71534C6903DB10615CA3793 - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708 -CT = AAE7978C95B6FA5E7C2535E65150C2116803 - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506070809 -CT = 3A5827C24AC76EFA4723F24565C67394097A - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A -CT = 4885B346FC14824E415E3FA347B6737F7AD3 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B -CT = 91E6CCF320242E8B353F5AEF032B261DDC9F - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C -CT = AC617F2C2306E965BE2BBD5A7498F04CED32 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = 49DC69AFF1F2AED79C245E7249B86D3CA5C4 - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 423A6C8F90612D288E34C20E9F0D157D4007 - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = DD2F95E04E2A6D929C328E3F385C72B98127 - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B7B1475D720220C7359190228C9B0CF81FE2 - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 8DB6F7152EAFECFCAF745AFC3EDB009E88CB - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 83D6BED4DC6738572BD4AA147C45BBEDCE5C - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 877A2E5F114FE154FAF88AF3703F817F8F56 - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 7619AB42C969750E915A6E11C461B92DD6AD - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9AA7E5774CD4279E75643FA076A79CE728EB - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 745207E700F6503B52198A179A35A52D10E3 - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 197DF9CACDBD74D0ED91877CC16BAB3F23C5 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 7805801AB553E4F4E4E6DF09D880CFBBEFF2 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 90562BF1A4828D75E5A68A6D58222A69C284 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 75BBB2E14EF5E84034AFD4715B44C133AA74 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E04A6269029E24043D3FDCF27BD4B0BDE504 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9B8D53CA9EF1090BF47844F62422156844EB - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2D8240B8B928ADEA6AA39DC6B640062B42A1 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5A09E2F786C3912DE12CCA3CE3952E8E0488 - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2E3CA8F45AA70B92C956616D97CA3200F2D6 - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = -CT = 7440035B214803A82FC6063F0502DF7767753F - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00 -CT = A8C25BC494735E27F366D269E19FE6777BBB32 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001 -CT = 7D0917208D5AB1B13E06EB93B66796DAB1533A - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102 -CT = 66632E20A04312DE8A2EB79E7D5D0B64990DEE - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203 -CT = 0CBF65511ECD34BFAD3B2A7027D176FDA1D487 - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304 -CT = AE5E331CB7FA6B9FC416980967AC599809ED74 - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405 -CT = ED06990EE2BBB525E3043FB991BC5848AFB36D - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506 -CT = 149A1CDE61EEC6F4ED0CAEA7C57605182EA527 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304050607 -CT = 3AD539D62E8191F61141B3DEAB04F04B7F0C86 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708 -CT = 1BC6C986E7B672A12ABB6E95ADAE7441AAA15A - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506070809 -CT = 720FCF9908C3A1BBD1ACDC9A20F4A9C96B1ED8 - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A -CT = 1021F6BC8C29BCA6F7657C44C71EBED7E59BF1 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B -CT = 4F0F5B2506265E0C2813826ED1DF1E2DCB110C - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C -CT = CA6894893DA3CFEA0B658FBE7A34E3473C4B89 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = CE209168215BBF8E4279B325C03A5E49EFEEC1 - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = 164B133EDDF7075DB6AA3E98BB8FC6EE1E064D - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 5B0F776088FA936BF3ED7CFEFF003ED651EB3C - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C4B0F6CB1A96595D98E191437D4D728EF2DD8C - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5CA9AE253F9924A5100F5444325B1ED7CE75BB - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 072A87906D7EA8DF3AF61CC8752E18952EB85A - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E0B972AE0DACECF115FA293DC5B0AA9DA68F3F - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3B460189F104E5AEED7089886DD702711D9450 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9B74B0732969625745DF04D08826939710D930 - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 92E9B1A80E35B5DCFC997E34FC8AF2914651E1 - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 002497B01C25618456B9B3CE7B0F0EA00FED11 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = F0DA00E17CA6E01EAE13D6C15DC6E525A5C46B - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B0E7BCF6384B1FA64D45FCCC19A4B2DDA7E8BF - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 546C1F4F0E747E5B30DCEA915D4E181CFA8092 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E576AD933F891763A9D4B06C84D4ACD981D7D2 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = ACE3591B470F614DF4EDB93CE7258BCB3DC2F0 - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = CBA8B7671F55B70518F5C5FBC121DD4060EC59 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = D77248BFA8F03F053F562F84EAE98F41FF2091 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = EF9E54D6DB12E748B50AC3E6F3A75C8BF25893 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = -CT = 856A79756B78C88228F198B5978175FD3F61B094 - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00 -CT = 233DBF3CF126BFE01C3BBC9C0084033D9055ABA6 - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001 -CT = 37A33124F4F423930D7F123F55AD0EE789279F54 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102 -CT = 0D63F94F6201A5E912D490C6C163D3980C99AB79 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203 -CT = 078D6E1C018FD7026232CB3DE5D54DD9921D4AED - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304 -CT = F693F91271144DDC6359966D346D869803D511A0 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405 -CT = CB472BC5B0E9F503472E95E1CCE46C37A1D5520E - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506 -CT = 65DA488731361C58001963795B89D727121B20D6 - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304050607 -CT = CDBA0A86C5839BEAD029376F1636DF40CF62E85A - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708 -CT = 9FB98E0A8427519FC1AE9F9141694B049A4F32C0 - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506070809 -CT = 5A5729D5D8639E37B14BCD8504DEBD7BE9E5D7C0 - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A -CT = 1AE24FF1DD09ADE6552AA999FA8F0AFDDBE825A2 - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B -CT = A7F21E2E0DBFCB89AD9B8D1FB0E7CA5E020CCC3B - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 5F67B19860CD662FDBFB8609C11D25A60F861688 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 2E96A6E1681D88C8E89B360170AE6AB3846CDEAF - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = 6F80C16BF49BA15FD7B999E1B95AFB00C806C7E8 - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 3CD7CDD0D1098C5F5D31CC6E2B557F3BB99B43C8 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 57AFE33B09E80AE0DE9178C380A738CF677EF5F3 - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5F80C505BF0ED641D4EE00003411BEF037E45D55 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 09D0A3CF53082BB7D0A13938A0A60F560D05CB66 - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5C9D9E90C3AAAAEA85BA3BAFBD022AF09BB8E27C - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 96F2317982050C141FB3066D3E05A4F6FD3FB871 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = F95109476CA03C2CD0F5A60D9B53F97ED78548A3 - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 352A1959847117B59AB2FC0A702694819A6F0E50 - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A062AC7C6FE867D2E47F2EE7A2C07A2DF2D22E4A - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BDD8C7CF3D9377FEC1E551254F2CC3698B6B2B56 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 581C4397D41E4FD37EACA2F69A4FB724E5808F15 - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4CB2DF524180ED64B67AA3E681D11542150B030C - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F4D99B8CA49E9398B9EB71715C59B07F18A138DD - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 837DB6F28B682F0F26DB314200AA4BF487B9E051 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 564E9289F44B5EBA8AB87BCCB39AD24CFE406855 - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 1DAD1095388C4B8A841780F65626B011580EB7A7 - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 707249314A5F867F31AF06EBB74C0F0F55B06B7A - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = -CT = 4105D92614E5D31B24F96F7E945F1AF0C908AF6244 - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00 -CT = 485C3E356BDAB3DC7F6709B8E9CC5C90E0F40A3DAB - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001 -CT = 7D5B35C577D9AA03C367F2AC91034520E489748B8E - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102 -CT = E2F1B18771C525182F3F1F336A10EF48FEECF43514 - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203 -CT = FDE54BE8E591EADE4990A8D8F8BD8B78EFD6B1058E - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304 -CT = 0FD7EE267B79E5C0B65117650F86260E6165CC09E1 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405 -CT = 2FFFC3B6E489B60016F17F6E00740F7C9527F49F3B - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506 -CT = 90469FE62A412950969E39474EDC0074E9C6145A59 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304050607 -CT = D2A74C1D0993C11059A92BF53C93722E7FEB8FED1C - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708 -CT = 52C2AB131CD0936394CADD6B1E7668E89340780A64 - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506070809 -CT = 755968200B60185C3C5D0C005DA4BC0A38AD57EF01 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A -CT = E7C48EB5A4AC84F4A036EC72AB9C74881CD6838BFE - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B -CT = 29F998B1A2310764DD53DCAB6BBE65FCE93E6C8112 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = 29C373CAFD5320AC8CAEA3FAB1826B0AF2847339C7 - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = 8246E8975D891B1BD5F62032289C2BA6EF9D567667 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = DE974D7638BAA783512AA15069BABE284EB8A98226 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 0D691B7CE398018965E778D1AFA822FEB65CB32990 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = B546306D7C5A69A1BBB4815227690B04572DC3094F - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D566AB39DF18F71B88872F7A199A6C80C2FA1422C3 - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = D12198A03ABE18EA0302844FF36F7D2074154ABBC2 - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = A71363EC9760E12BA910EDA9B5B6A7E66310CD334D - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = C345580CE5C1D9A9AB0E2995862A0DC7F9C53522C3 - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7B87A082CE9350F4248C839E129BE993A816BC2B43 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 8317318FDCC51C6269356E42A230C27A9AF469E6ED - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E649C9F373CFC8A942B7CB0339905F0AD42EF3027D - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 38DBA6AC87A46F40392DFF78FA6CEEB2C6F03C0795 - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7098A4C24909DFE5E1B9BDBDA790E3FFC6F68D2FA4 - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F2A537C7641F20D37DA9C4738EDD05FE884CDFCC93 - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 30A645177BF4EC0C3DCE8B83CC298717DC4AD863AB - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9799605F731C7FEDED260D95F0A8EDEAE24A6EF2AE - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 9129AA9AC9392843010EE0F7DF53C3804DA5F41969 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 7B4348A968D222FEB96037B227D6CA1B1211EE78B9 - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = ADC60F74A395A2BD6CB66D3C1F04E2EBD272750F33 - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = -CT = D9E61ECB3CA1225D36C29A8A44A9F104618BECBD88E3 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00 -CT = 0E1B607B5427683C2D0AD36F9DC510F89B98CFB91F10 - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001 -CT = C8E0B92D6660A5C06CBF36436B0BAB0B45C2E0758A14 - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102 -CT = BACFF85F80FFACE1A7EEE9F3342AB1852F8D3A364EED - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203 -CT = F790556DFB04EA1EEA0C5F506CF339ED5FBBC5A6CF23 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304 -CT = 918C5659159E82EC39D9A01AFA6D3B678B37192D133B - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405 -CT = 05E514F64BED52444580C98F714AC73FFBC1FD65B7C0 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506 -CT = 384D5CA29BA841164C5F2458123ABFFD89EC3E99E586 - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304050607 -CT = 0D9A3A6FFCBAC2F5F990767921E1DFBA58C9479A8602 - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708 -CT = C312C6FAAA00FA1B0603F093072592C31359AFDAF3C0 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506070809 -CT = B06A2F9C96B54FA5E7B502D84A518B66DF0F83268FE5 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A -CT = DC29A9D1C341EDFB6E6E68954DD2F8B65A575C0E299E - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B -CT = 23BF3A23FCDA0AE04062ECEE6C2A10F5F99F0D300404 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = A20D116A45AC6E58B948026C150E32B979AC563AA272 - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 82009EC61D29718C25315526C9E1E416C62FFB9B396B - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = 73599D062BE994BC8EE72114082679E98D10FE1606FD - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = 21CEE0A0725DDD440C245F360FFF0EA03CB1D762970D - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 7A368FB92E6FE9C606A7DCCD72576AE3CB990CF4E21B - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E933FA9E3F85635CF35B9111F56E28E51E2952628A2D - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = DC8DFD5C02F298CF25484B0B4AD56EB616A46A00FE53 - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = E5A808DF4E611B450E6582D9AF9444E927F45F57FD5B - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = BE6A49CBA53DB8C20D90BC8F9CFFF7D004107F00CF33 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3F823A3084A883F1BFE68C845244C7281C738158D96A - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 67672566932B0E71E0C4CD469B3689CEA0227A87EF7B - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 34B493E04D8E7CF48D58F5912F911E5CF548D225789E - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 728693780345D7BBBD2B8F1EFD8AAC477FA7C90BBD94 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 746F80CEA60688688AAA33BCEC2168182BC6AE92D537 - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D1DB755A5273FA97B60F73EF09828672A0A9E123C872 - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = FF54FE29E5B20A94022CA78572CFFEC9CE672C423F0D - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 197AFAD1133E152E029E55B3E6ACDD1F194EAFD9AD7A - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = F4E04FC1C30E3BCC1A7C6539F5B5226F7A61785CA2B2 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FF3EF917880F727A9958BA3151417253B3538FF71EF2 - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = AED49FFA6EE595835BFAA1A1175D1EE8D2F1C490AE59 - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = -CT = 400A138657EE4529E2D3147ACED44FF74111B1433B0DFB - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00 -CT = 833233A3006E974F6C88FD4A563EDFF14050E71F9304F8 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001 -CT = 15608E1AF67525FCE3EAD96B38F14796D17CDED230FD24 - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102 -CT = DCDA34890195C1226809D65BADC442C1798B044118C4CA - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203 -CT = 0E5134391EDD4A581575F5370185041A089641687CDD34 - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304 -CT = E6405946513F3BC535C8A670837A35A669090D3735FD85 - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405 -CT = 4640696EF78A50BEAAC14AEE47338944A921B4479173AE - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506 -CT = 4DB9B3BCC36EE7F46A186352CF2D29612CA89CA07C124F - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304050607 -CT = 23F1D2034C3B44781C819B010881D1A72181D20F6891B1 - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708 -CT = 5ED838B7F5A934AD8C97D2C3C102F1C4259C30C91D14F2 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506070809 -CT = 07CF0EEAF22AC7E1EA9B58344DD71737DCFBBCDE39719C - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A -CT = A565F42CCD176876FCCFB2696FD5259751855617083EF0 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = EE50BE7D903F91E8BC7824E29CAB984511783B5BB04598 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 2EA5919F4899908A06B786D995A7A04C716DC6AFB1E1E4 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = B20DE289833F9C7AAE501F05A1E346FBA640694D0C3A61 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = ABF09694B73B0FBF7BF339E7D405FC13D815DB276BACDD - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 8C61E91987730C2A097E80FFA2ED4DF2F46D24DDB176F9 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 89FBCADEC82A2AECB541B296D7F9F7F8555A7B10B3B023 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 963C2F79446E7D61C4F9C044AB0FBAA2104EB5B15915B1 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3A616532EB8D6956B20ABD2DE174815EDCD3C67D579E84 - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 74EED507CB7C310C55C34B394B403C5726B5CF6D145285 - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 0C3E0F3903F3B7DE8486AFFAE6930D9C9017C27BB9A70C - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 38EE7A7E0D058457D72521E0C566C270FDC09818D4434C - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3BC9321F566F5CC7A2419690057C39581F7E31E3BCDD4B - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 8B14D55EB5D9B22917858049ED04CF0B9451547B73A3AB - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 26F09618B02322451486C78F4F8FB4F7BBFFE7A56E964C - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 0BD72D7D715D79C9209BF7090B9F1B99C50119925B16A2 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5614BA2F74F32B6330F19F51B1FD8D718003AA08C2C01B - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 01B65D90B6952B6AF4715A22D28CE7311BDEE1F303EF7A - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 79736B2BAE0738013CF097802CE1C395ADD576614F146A - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 358BA5EC275AC8B6E62CACC38C63C73DB60AA889F57296 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 0477629F8ED03B06917D2E1FDCFB992A0BEC12709A6CF2 - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = AA3FB68D3214EA765B9E2C50EBB7851BC22A0421586168 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = -CT = D2A1A546F04ECA07E08F360ABF0EFA99D05B766B5FA6B5BB - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00 -CT = 67DF4027A76028D65994CA3646B8390720695AB9063CBD97 - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001 -CT = 49F7E478289C6B0DEF64B4F194DD65FE73A44EA88D79922C - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102 -CT = 145285318A1F4A0065A1F3A08757A366F5781D0D838F60E0 - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203 -CT = F80AA94AF68A5B59C6070897454D10A689DC879CAE29CC54 - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304 -CT = 9328D55D3BB89B0400FD97D99AC700BDE49D8597CFD940E8 - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405 -CT = 7D86739C905AEA544CE5649404D14DD3659E0AE82490933C - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506 -CT = 87D5E40E602017346E3A6F061DE85CBCC9FC11D4EE99D7C9 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304050607 -CT = 10D300B146EDF93298F48E387529A017F133E18DC828DE11 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708 -CT = 954D23A0DCB233F3C240FF755F96ED16323E2EF762B078CF - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506070809 -CT = B440753E14B36E63EE259BEF9DB0C5D25540F5B416BC8DA5 - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A -CT = 4920AF5BA98AC9C115D9D799A5F80897913B9240C3C375F4 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = D74A1FC45CF7EE955F7CC8F75F9B773B9D70E4C99A66AAF5 - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = A142564738E6C5B9FB2AEF3F2382450D4414CB974174911C - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = 5ACB3FEA98FFB0B88CD9951FFC5E6BFE8ED1127DC3E163BB - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = 5CE0343F0C5CB7C74BF21D9F9DFDF500274F52EE5248F781 - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = F624C8F722064AE3E479804F673617B88673400DB85251F1 - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = D540639F199000250478678EBD65E0DBDD46E419F591B1A0 - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 47C6446E7334387C4422BFF80E61B6A22B03F0EAE10C729D - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5A1FE874BC73638C62795F5E2AFFA5F5B93865A4B3551D57 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 65D222D37B4E381B6AA10D409A59B379328A54184396A435 - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F54838EDCEB51E988866BB56973F2E6D1DEE0F0D33307B98 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 065C36DE58DC161DB2F3D36B0D1063FC47FFFCEA6D57A751 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 91B89E030E0A89401DE212CCBB3464287B4093C6DE9EA96E - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = BAB7D8EED315649D283D872F85CDCA7410B837BC456D600C - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 9363AB1248E92AC640EA22BA060C8FFC2B8D2F8D46BB48BD - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = D9478EA800DA2E1587BEBA1C4373FACB4537DAD16EEE9D83 - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1A989256B89406334AD153222A4BEB73DE6232774070C7B7 - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F130AEFD87B43F3E83F2867D7B3A2F393A43BC61E71C097D - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E4EBFDA6E179A7CD3B21F8F8CF92D8B9472752153751E8DF - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 72B3A46EFA033785D1978F6B2B8E0112487D8F83A5171073 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5C32077FA8D7316929B6E3BE4C42E92D3C1F9BAE26ECD1F8 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A3F9AD281D644BCB37B87B99B051B49A8E9B3988A533C17D - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = -CT = EF704DC02F24CD293A14A492E550880A7653B0C19CF47EEA6A - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00 -CT = 53923A774D8A3DFB30D35761DBCCFEA18A4AA043A859F42083 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001 -CT = 171812EF91212C5C56D265C429768D8A78415E7F97E840F65B - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102 -CT = 4912C42F94895F4131F6A66EBA94AE5B5ACC62614F8A081C63 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203 -CT = 2EC8F81C8916BED78EEF61BBBBEEE53232739B0525010B2A2A - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304 -CT = A994A3B33749E8535CBADB5E92ADBEEAC9EE45FF1504792A5B - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405 -CT = E70C0606BD25B0DE10A82956F7BA3EC380B3405841F1CA506B - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506 -CT = CD2EA8FBE95475BF54202A2A6D84F8C2D4FAFC6DA5B8A8805A - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304050607 -CT = FE0CAF80622F26913BCA964610713E68B11756B7F2C70AD002 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708 -CT = B8718DB70FF8E76E922D822D934A1641440409F776B8A6B83A - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 5E558301B4F5D0BD4E269E81AE4571DD84FC7DCCBFB8CE7590 - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A -CT = 8CAE9417C39EEB2196FBDB4CC0A249E87F8DE81AB2ADCA6CE3 - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = 3687C2AA93E27744136181AEE188288602DA99CB6CEBF46EB3 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = BF544D47F7DB3FC40D8F41D3577F375B6997E80A066EC5BBD9 - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 36E8340C6866E6315659A160B8919D1EDFD0D42F09D23FD008 - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = E32E0B49626EE6A75E346219B2524C0439F407FA40FD558E46 - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = 78F234732CC1371C0A5480B10AF1BAA208D820EDFCEE4CEAEC - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 6E1AF7E5764FA845E3AAD97577C5F79E0A7ADF6E3ADFF5C1E9 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2F0294C47384B625A8F54211C0F430E05E4A7276169B9E8AA5 - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 4B3B6CBDCA6437FCB5F57D81C43C650C37A0668C54773CBEB3 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 84DE2D296735D2E1A2B15485B682582C7DBF91DAF407643710 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 17B5B96C1D3A67A1F7C79C55931EF7D956F332469DF909053F - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 905460AF85A270CD86058DF8F19A7151738DED53A7DDAA11A6 - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9E10E9992413A5D2237F593C58F7E3099D063E27F482794F83 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 03F75C524D672373F84D5DD8BF825F3673F4829771AE2DCB96 - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 4EC9BDCFBF3B105BDE661DFE3BCE9DF1EE061FECE2594A0B15 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 909EBD70CE56D2BDCF2FC13B2F294FDBDF49D216ECDD09A790 - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F610B46308668D0A8CD8CF852E60F8A9A8DD77EDC670E03C60 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 70C9B6D86A35ED67CAFFC07D2F3923651A2BA46F72ADEDD1CD - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 699BC11544568818B48C3A09CFE8AE7F2FE4B452642A5386BC - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = DAF42DCE39D2488A9ECD2C59889011C87043FEEB3497E35EC0 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = CDA3251900C9A03C8604DBC486116D248FE5E4FF87B1A85B9D - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 55143F082332129B2229A9922939E0C6397ECF69579CDD5ADE - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = -CT = 893F466A07839493CD2215760A754565D3295F1FAF766D0CC863 - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00 -CT = AF3369293702BB2CFE0B0F51BE8E64035A170DABC1281A89E265 - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001 -CT = D922B63C69836C5C5795F51FF0065505F74389191814F14131C5 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102 -CT = 34D761D63C925C2B55D8B18919F82D1C18FD6AE7928B6EC470BA - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203 -CT = 55D5D2347ADD488CCC188D31BF09FC5C812B57FB5766648AC3A1 - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304 -CT = A0DD3A51085C6C528F53CCFE0AC673E74083406B20BFEF914061 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405 -CT = D156B1BFC6A83F59A7A56A46BD636FF972169540BF84B0ADE248 - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506 -CT = 295DE41B6A23281FA45CFC3C51C505056D20AF6C263FED843FE4 - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304050607 -CT = BDFD03B3C1509A19D47655265A4640D3D4F98A6CB83DE52D593F - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708 -CT = 1D84FE63AD07C81DD122CB7E4C86A846A284ED962A5790AB9C88 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = 23917033F5AB9197F341105A368B51DE5856604880E50E37EADE - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = 7EFED57A1CF5B66518F3B749A7A41C736304249E95D7EBD2BE0D - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = E829A944603EF61158C7C560A5F839064F06B9B9953EB6B67384 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = E38F80E53B795C177302E6733E478AD9025C66C7FC7D67C5A10C - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = 9A7CDCE9B3C04EDA923E7FD51F136271A824B82FB7D844085F67 - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = DB0DE1409DA78C2E75DEE3F573E581828EE81CAA7ED3F200F415 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 2257DD8A35CDB32289870A863D3F31C1AC639E4B76F1ABDD7336 - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 294C4FC20BED4AF7366E649F141EDA07E980139D0EB47B1843F2 - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 8093D9B3E94C6021833419EA0EFD8C2EAD3984B4AA614B524465 - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9A61A86087A6A77F686858A833FDA0EC3744FE9E6A00CE33CF43 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B6B1F8E8CC67B7914729C2D0F7A4E379038BFD20F574EF8150BC - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1EF346BDD1AEEB90F096552D587E4CCA981A5AEFEC212310A31D - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DF9AA92B2D4C64DAF0DAC45F8E099EF38327AB7ABEC3AC9A7540 - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = BE51DEF15DA574EF2B15D88EB850C6146F4E1F7AB5785F795068 - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 75C4E178C414DFC60F84857490B80197FA7EDCCA321F76C8C3CC - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A471C29AE0BF40B078F47EC73CD240CAA788A7836DC90037FB93 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = C101CACC8A72E150FA42F03C28F7DEA1BD5FF80EC2AFF0FEA54C - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 72184586A4DDC735CEC80FBCE3C8BDFAE18EEED2B774DDDEFB1C - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1E77268F4FEC53F2E83A2A6035702D4D5240C9911B182E75819B - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8EFDFD609F9CC8589FCBE955C4B061DCAD4AE83AC269385E28FE - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 77B80C9730E9EAEC7AC89AF6DA43DFAC6F3F858E36A0A13CBE87 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 46086E7AFE785638CB08EE0CB6E08253EBCC9D4E0EE96D6F4A55 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2DF74C978A8AD6D7B6FAFACD5E082756F7CC97C8F7763178C37A - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = -CT = 70CBC7816BA001A7E26449230C8F86868408B3A7C35508D7D25F8B - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00 -CT = A96F243459824D47A8CD1CAFC184954DFC0FCABF902A53525C7AB6 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001 -CT = 3C76A55E1D63C291A4BFC20D88048A8A0BBD844E80DE3DA690BF45 - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102 -CT = AD0A44350410E4DE0DC434D7FFDA19A2F071C157A7E4316FE147C6 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203 -CT = 6CED9F438B102574E7AC404AE856ABE35B51FA80BADC17B21E1AD2 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304 -CT = 0CE5DC23A594AB447AF115C0BDD89E9D6AE04E9FDCF8C3EE388D7B - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405 -CT = 821F47B30FEF6E682DD2D856A4C32A199CB9D291B937F598AEE9B6 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506 -CT = 7C4A294C3782344DCDE5147767702CB389E6413F853FDEF5D839F7 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304050607 -CT = D0A624D16A6B11052364888BBD7C27DA120B38E66F382021733884 - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708 -CT = D10B9FF967C7C0FEB40582F08769F76882F1D56619841BC87F4503 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = 53DA78FD8450174A19E31609BE2F1357308E93123544210D2A8E76 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = A2DD5DCDE4A41D1448385286BEAEADCF19BA82573CBD77D149BDD0 - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = 4DDA9B223848C6A79ED98A2A7A443AE950F4A8015C39FE7079EBF0 - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 8271A38B970AAD6F1E415821D35B97803274EEA855AEF091E63548 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = 134DAEB3220E76C3B4A2A1592ECEF46B3ECA9CC58EC562A0FDF4C3 - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 782D619840241B9E6F821059B912F97E4EEE55BB641FB35CC03671 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = 7E073B42E876AB8B7917C0FEA45B449B6351F03D743BB2721F3CD3 - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8B8AF2168CDC3A960ABA5CA3A61A732C9FB89D6FFC275E8B29C97E - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 7EC5C4756E9C6E8DF41E9486FE8366ED872E140260705C58C192B9 - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = B6CAACF30D55B6F61E20E1C31B6AF28AE85F4F1A22FE75EFC2CCD1 - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = BE80D79593A6AD4EE3BE87849EA5497420490C1FCF1F3E3745B5EB - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F1D3EF147DEA7CBC3EF193C99A613230E83E5C81FCDC09C0100718 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = AB905E9B2ADED1806549DFA3BBDAE0EB285BA2FF40BA498CD95007 - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = E646205A506D9C0EA4FA8B4C8D3E7BFD1086E7DF73FBB76FA3D057 - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = AAC312ABFA6E731753CAF131149CFCEC5A81EC2869061B626EFC31 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 85320118C135ADDDB1F8A0ADE2FF081DE50D6FC486EB806133AA3C - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 58620FEF596B7BE754A19CA9FB8E5C725AF2D8638114933CA38F20 - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C9A4F9AA13810067644D091258981A3F24E98D6256952024A692EE - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E9CDDE2BA755F98A81192FD50539FAD5DC29638CB6533790D8FD12 - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = AC55BE693229DC05191087ECE239056F519A4EE137FD10C28307C2 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 8371BF3B769D376F401DA1754D5F173AF5C5A53E7455D4924542E3 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 7A83F6AD1A0C309C4DB3DA89715BFB6CF7600929087E4E41453702 - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = F892970293B06FE5B3E9A7DE09E95AAE5FF568C8BE77AC78580971 - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = -CT = 107D349285AFAD01A80CBE77E044EBDC7791453E8641A83D22DC6F42 - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00 -CT = BDF399012242BE08C9209FC7A154DC2E69A07866F057AAB7BA815C47 - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001 -CT = C56F8DE591A31E6680312A268399AA03C978D301324E5A5A58B21FA8 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102 -CT = 1029307EA61AC5FBCA419CB14E38A94F254D667443879DD792B0C0C6 - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203 -CT = 6904156DAC0FFD2A3DCE9964805835DEA3EFDBF5CAC40C874711C12F - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304 -CT = 2DEE5C7AA566EED1BEE3EB72BEB030F85DB378AE287C00D2E2EFFCEB - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405 -CT = C059E82C1816F16A5AEDAD336715C18F1DE361024046BDAC42617596 - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = B4C3CCD5F2B82DABA556828EDD77291A0AB7B022B61E4034CFEA632B - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = 5DEC2672424138346CC3BF912E7F5728DD5C0DB016A9208F20B32124 - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = 741F9C339F46BCE3D1E0E2A98E53E608E4BB93E6CC1223940B805941 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = 7AD8AD02E620EEADBC82BDD5A375924AC347FC58C0BF6651AB4B5FBC - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = 1216038C968AC55F6B8FB379D150C1FA6743A69C4E8DC4645AE92BE3 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = 74DC1A6D1989B1D0731166147381F1CA8ED7FC9574A291E2B18B26A4 - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = ED7C18EB2C8198AEB4BB27DB754DFFC56CC2562BA7018DC478E9BB69 - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = D1E9F0E1F69F4990256F113958828D837DDED0E6EB4867A77975E27C - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = A5321ACB93B427BE26ACED605E2591C02F70FA8C2D05C455936737E7 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 2A60D6ED48C48DE2933BC7B65D8BBB1C25CAC12A22D103516E220CF4 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = E9192F9D2CE376CBE7C519F76AB976B3D769CA74674A36E66C26515C - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 121DCBBD4A3414A0D6A7AD82D9526C6701127AF6EA3DF002B1F7147A - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A89E8CD098B515E64022994227E7E9007E9B82CD316943C92026C2B9 - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 801795173D1F26767477A4412A391FC4992565F73DC6101812797AC5 - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 0FB23595880A34EE4A702472222DC7B78F7D890D95171F9B2FECFA3C - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 56B5DD929375314600AAE8212D82FD3DA9046A87E804B37AA96A0AA1 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9D0F5A9E2AB1615463CD7C42927A8A746E4EAA0EC59ADF43D65754CD - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 3F0048EA3509E32E527A3645B4F596BDFDEE507B5FF68B4082E2157E - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 210E3A9B28CB97B28DE3F4A139EA03E3616104C1D2EEEAC9DCC7EC13 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5FFA69A8355EA6F29C98C298A02DF5DE83B65BCECEA6565DFEDEFE5E - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3BCA23733032978A54D6879D7B1CF991B544912696E32A8FC89FC975 - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = BB1ECA55877C0342865A3482BF231BBD5F877DD59E45D0D6CA033636 - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 15D8483C2628A69816EFDB878B8DCB9E674F59A0BEB64646FBCC0DA8 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E4CCF79E70AEE436C3D9A42E05D8BF781BCC657D4D0173D7FB0943C2 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = CFB0052324585B3EED4A53DD260D39784138B0160A1696DB9245141A - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 938E25A823335BF73976906F74428023DCE88DDD69BC097E9213413D - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = -CT = E5C8B27CB932AAA36B8C14C98660DB9CF9B7A4D5A9A040ED42182F10D8 - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00 -CT = 82FFE645220474310A8BE3DA0FF23817E0CFC562EA07F7ED0099422A75 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001 -CT = 932D708F3335883FBF33D1116368902B85347BECCB47BB915CB932A5F5 - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102 -CT = F900B533649743FA66735940F20306E9048B3C8CE6C492402181089295 - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = 766C8D9679AA543704F582FBBAC90E83808F53B6416963B74390A7B698 - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = 5EE583552649ED21E87D00FAAF76F2B4DE4B75A5B36F7F25B140F66D78 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 8B1DE64DE5BA65C415DB368BCB48E0897315CB7D1CADFDA06555BC7EFB - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = 1F4DE12DFAC15693B8460735C1FEA3B7B3BEA3E70CEC442941C4A9D419 - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = CEAE75AEE1F2D860BEEA0393DA1483DD3B28B2433D98876E12299F95C3 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 8408E248B353B264F3DD4AF4F48BBA3DB61B68A17F935DAEBA57ACF929 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 8C5F2C97163DECE7F2D4FC294D4CC5F0CA2098DA588E549332D76C9B33 - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = B8AAC4A25A45BD3FE95AB48C558C27BC90129582C8579E3B00FCA31715 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = 858571598D621456ED5D18CBBA54E9EE53BEBFD51347F5DF5DAA621627 - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = 2777B5B295437CDF6EDF398C6FB2A9523BCE10C6325ED52AA88582E67B - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = 64EBC4373942FBB827311FF32771314C6745825E5A2A32E65056ABE1B8 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = 07844AEDD8B09B9D275D088DC53F37CC3A3F70E9822F4E2CBB6E33D448 - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = 3740A592A10C9227B289A0CD1658BC4F54F564391C5A7F27B831E3AE3B - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = BCC889E4872ED8453D6588AE559952764E645F3E868D818845EEB06B99 - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 8FA726124B480525426663F3871924D8D9AFC68DD6BCE84BA23D8610A1 - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E7987E156CCF88201E48BE389421687910212408655F39132CCD52B67B - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 28D8BB62C31F82F1CD6743323BF09B80E0524E7CAD459886B3FC481A34 - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 26AC12A4972F4046FBAC5A712F209B9455719366550AAC60CF233837FE - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 3B6254C1AE741B16E73608BF440E11EE6E9B578D70C8BB8ECACBF4A9ED - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 7B02FEED08C9023A331A905BC3089B222E1EC605BF1CB11BDE5AAA840A - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = C8D8763A16058D11BD20A71E347F52ABF56E6A220BAC3E76F42A932144 - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 261D4EAF15F099E68CABD28570E0296F99357181B2102C2E0EC6775A7B - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = EE1F23623C9984A9B21DF8A6B236F752BB58678B2530C7E5BBB2D5B877 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = AD9864A5A62B001D1629BE151C110363321062E54628B85BEF7E1C69DE - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 4A4FE954C58A372C9E84036ED835EBD4AE917AF7DCB4D445B36FC64544 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = FEACFD02EB4F47407BC0FBEA7F22A043CB8E59CE13DDA7ABDFCE39B474 - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = EE08659BD50882A3359148470B9131172BF1DE529AC9884F8167062E67 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 662AC360BD11126C3D03C3A8FC011121ABEADC6DED281F40ABE017F9C2 - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 203885E4B1867FF5A18ABD4CE0ACB07F40F4F941FE2A05CF9A7C6E433C - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = -CT = D431E5E7C92B7A2A6FCB93C2122F87FEA7240C60573853C4014C42E6322D - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 3B8EAD9D67BA04DC0CC68B31763FE2BBB19D70C8676D92AA9E8B64A08DEF - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = 21C446ADDE408CBF508B453EBDABBEE99B6EFD133874A77129C0ABD65042 - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = 6D14F3A685B476CFA9FF14444A3CA8797C5A054CAED5030E18A477994734 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = E7EE6A056AE5C7275B2F73F67840130DD4A0E9985AA3761FBB4552BB06B0 - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = 43D4ECEF3AA834F245509B883254FF454118266E70354A316F28775280BF - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 6E7232DCB0166736991AFFA834289E671A8132BA164C49C5DFB0FD231C7A - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = 4E3B0FFD5C4317389B2DDA9791FE7A247A16C2067864E2DC9538B1C27C00 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = 6D7E5071FDFBAD6A70F93189EE2B8E0355402C1AA962D10EC7DF89888A46 - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = BE6915794A985BFF6687BD059B5E1C253F2FB3FBADA6633B2F1F93AB2636 - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = 3A8C7B6A622AF90D67A1476536ED37FE7C6E058D27620797E40705585923 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = C9CFF677F144B884F25073F16685032F336B38F681A26900EAEF97367482 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = 211B209339122B8E74D8C8BB3CF5E1FF99EBED0EB0DD8F79F6FBDD464FDE - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = B766EF664874F45009DB32C68C546F8ED466382830CC66A4D9CE97C500F7 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = BCB9F193786F1E2E550F01A1BAC4F6F374D6A123AF3F59294196BDC1C9C7 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = 64A3A96B7C05CE379E02E1E8A8255F8DD6E430FD8E871DA5D7C7C8A394BF - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = E81E68200FF336ECFFCD386C3DD9094008A2A99E5E83AB3EBD871D88C8D6 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5F5B29F8BB16C9BCE946D1C8B5A7F555C76240B1EC45C62FC5095AF01FBE - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 37BD8CEF702A743C5FB74C15248458DE7D7A83011E03E8A4F92EA2BBFA4C - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 948DBA9B1CBC84B92980D978CCF947072738F2876BAB6035966A73373133 - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 88E7FF8804EBDB31B06721A7701D1660D9C5CF357B39437E42568B1D2350 - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B6078436188473901BF7334B46F2DD0FEFF1BFF41D8ED2FE3D7BF77B943B - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 9DD889B8ACE77181A13A23A4A8D1A06B28AF276421BB0ACE3D654315090C - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 0F1C2F4306CD2D2A28A63EC80D5DB62537258C832D137E32A8C99E340B55 - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = C4D45B171A4C71C0CD645D49B891474498B4E24E97EB0E7A81BBB41FF28E - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 42E7903E6DB116A77615761B4F17AF38FCD4CFC64ACA67A465298A6CBC06 - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = B29854BC4BBD5A0F42BA7C3A4CB84CC21383D8869EB6C27387C220370810 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5481D8DE53E904501AF3919FB5680D48C7F1F429F1461D1D9A5BC9551C48 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9325410ED1141C0668390F284FCFA97BB0DF439768CEABF920B230C613EA - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = BF24284921ABB09D5ACCDE0D1DA7802467C5AB95EC23FA24BD87D24B7EE1 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 29DDEEED920B6BB1883B88BCD05AFF7AD9D6135F510EF9E0A4C9B40F3A70 - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FF242A07AF4036F6E6929EDB4DFFD326F136BE29AF93DD59DB3C54462190 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 99FD1E2F1E4493AC05514DAE2BACB20D92FD5F083F08865EF5D87CEC1EA2 - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 81D9E49E87809D1183220D411159A499BB5507A012D342A5BB8273DC3B2D1B - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = 1DE23CF52705D1B63D6D0AFF0A8633615BDD4DC4FD6F5E7C7961A46A262777 - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = CAAB1A71021F6BC72E503B44F8E85F0992891A23C71B5D77B0110B1B974E6B - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = 1478AF549F768CCA6BF37DA6ED42548254723E600E71C250F5343B36AE47F9 - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = 3C43EE927EBFA67BDECEB5AD0A305D4AEDA7575D9DF6FAC41981DAC2E4B9B7 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 2A5A114243F0638046F814308C1C88DD8D558AFCF90303793B269F76AAFC45 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = D158A999FF04B392279E810F9080F05AA8F6DE82A065DEA39E37FD1F44253D - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = F77E6A824836F56212F2141BA6C506A4FE91D2EEEB2F0CA9B14388E74AB98E - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = C8B159434E45D20866915C4038C102D7A74EDBC02C1AD4BD035F5988DC6926 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = 207018E92EAADE69F01602E70248A5049D9F8D7BC2C3BDEF360849D861921E - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = 4F88EF8C22AE35E96E2D2F986535702D33ED40D61AE2A56D3BD2C7DBB3A1BA - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = A4FF360A0ABAD8F7D1AB53D7A8C42DFD64F29A709FA0876A4C46F12CE02E5B - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = 1AFAD577FC4801ADF3297A4452FE9FCC291ECF7EBF008628B2EF610E7A0C95 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 2F15CCF4F41D03764CD4534648D700835218E4185C11A6E22E70842B53B451 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 72619E579A8B7F797330743D6411DD908D034D6F941880BE53CAE22C7A839E - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = 1CDB0218241709FBA89C072C4750EE2B75CAF2CCE66B0ABAE61E53159A15E7 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 456EA7332A8226B27DC3E00A224B255D0E7EAE9008A1AE166CB2DD02F3244B - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 93E5820E1755A2BCA32031B5D7C61EEBAA597B000CE765401AE2ED064C53DE - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = EF15A8E443023B250AD971518E134AD94F3029B2A64B32259C3C02670771C8 - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 3C66EE313DC191F888B76B2A7056ED3C3615B9FD6C2C8FEDFFA56271D69361 - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5A7C90BD787579604FE072938087BF032CFC14E3AF9C3F622D9109D61FD5A6 - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 288A3588C2E734E067A6B9E3C629ACF3E16A813CE80252B1DDDBBEB4325E25 - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = BA35E48BF020EAC842D645511E3389ADB5A89B24D39CA39FD2D367685B2F69 - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 2E16C52C18D9CF9F4EC982EAADC4E319DD509CBA20AEDBFA4077C20B4D4300 - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = C0D2B0856A617586A837995E3ABFF47459F5632736AC04F05DF2B128883532 - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 54246B32F4100873AA335CEE31AE781E80F3F342863B12FF8716EB91A29253 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9BE2CD7070E358AB9E3C2B37CEDB07B5091B71637BBA9ABE5BB27503CC7AB5 - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = B7EBBB810F9F9D260FA69FDEF88A03A634A8F92460AF6DD3A1E4073ABE8B42 - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E9FDBF6C3DFF14794B8D524B756AED72BA8D89BFA2C0C2CF4FAC737CEEF28E - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 977C3CBDBDAFC663D146FECAD8B5DC46D048BAED9E10C985623DF0B81730D5 - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A97DF770C31F64BB2A3AA95AE0846F1355DF0CC9613DDBBAAD6207191EA648 - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 94E6327206A3F1EB634371672F55D7DB1DE2AB22793165F434D5F94DB13384 - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 9074FB8C13B4C986299909349EA65C8D1A60BF53935BB992D1275FBD6A6016 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = D2AA9B49F85302E5D6B75D030BAFA1A16FF0F95AD8003A0E6911AFAC98B0FFE6 - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = C19DFAB8562E3C2DD3375F5376D0507E85820C1972FE66FDC55CD83FDCA70CD3 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = 2206EFC7BB8516996DEC6EF6859635FDB83C668B3BF9D26282067A9655B497DF - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = 604A36310FC89AFC97F7CE44B36813230DDB6A64244767F671E2DB4BAB6E5E11 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = F9550B631D91D644226F4A29D4914ACE798F3FB467287876CCD98960A89FE739 - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = C826725F049A8F1C4FFE38EBD3D3424314131A53C46CC75F94E9E5F4283634A2 - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 946A12DA616DD0A917DDB7F76B7A2D890B4DACAB9CEF7EE1D2296079C1CCAE3F - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = 73173E83D6710CF60D0360E2FDE2F77544C2ED7CEBA4BA26649CE9ADD2C9C70F - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = 8AD8399A1A8A6C2F593819D6BF4FE2D3ED97C4486EA30B70B9C8182004219F0E - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = C13E1E864830841CDAD9B12693B3C906E2501B775145D5B3CB3BFB2D440CC577 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = 4D47B4F4CAC3478E47241D871EFAB71C97F049798227A8DF466DD5E7C8DD22AC - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = 7EB72DC6E693F448E1D91FA71833DF2E5B558884173F34EE183AA322E18E7139 - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = 7ADECA63A490278075A444B65BFDE578744B4A26252E02E1C044B51A32A002FB - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = B22E2C1B8E58FF764ADD87959310B379E18FD72C40ED811ABD556CAF60478A47 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = E9130040443EF6B5B8C6BFA146BCA7F0076E84939E55066223EB6381681C7CA2 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = 22FA5FCF54505BEE0939A60FE1550491281323BD812B2D039A70FE047DFC69A7 - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = 1EFF644234D3E6B8DD5106208F9D261CA507136F7D3437B5E6EC3F7B0E21BE0C - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 9C53AF139F6600813D94C95DE3826B4DA177CFBE50D342105E83C89E8AF7A459 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 3461A2F33F5FC01DCDBF244C57CF62918F9C68100279ED65088B5676A6F34599 - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9E5D418B70E763A16019B3A9740AE1686A1F6065D3B95256C385D2CCAD06E10C - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6E69E689EE76FE110F4D9FAD44D7DA80FE39BACA680CC27A59F6262C3E666986 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3D669BD1DCE71E20F3779786D30343ECF90A4126FA6D5145F4381D277532704B - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 295BF0D86B0DABA41A44F6B3E1160308DDFB6909B4B862A2B3E57F938F88DC5C - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = D199DCDFC9F6BFB290FF62E868B8278A859112BB5284CEFD4480549F7689E310 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0CDE56C48BEC8F058DFCAE29723631A9A6905D4B2BFE41B438E107B2A1E8E5A9 - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = DF5018202B6266838FFB8F5539048228C82B8142097AAD21CFA8F3F5C365AFFE - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = DED964D016763A9A89FA189D845083A20AFE1A25039F127863F88B390FCC5140 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 3AD025CD6831E789A7AF6163C6BD65B849B695AF89F597C9798D70A79A6AC3E2 - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 86A80BC511D728FC498D845FC24FFCBF207A8A1AB3275ABD6E7D09093E3EDB42 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = BAE53DAFFC901F78F7C76EBEA51992AE405651114A146EB476BF0A5C72FB4A8F - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 775988064C05165E4BE8CCCB4BE42BF832C790159C5FFBB5C3146162711500D6 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C5B6CD0229EA801D5993A0D62A1C48471DB63E4852179F063F140999E3C52F3E - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D71B55BCCB6DE5A5D2BB060CACC4F6AA188192A8815AAF42C1E340F86E41FE9A - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 3F2A11EB565FE2562A9AA01652235421C9E23D9D700896576E6DDF421CD3A48C46 - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = C27FB0F3358832248DAE16B9667DA912D5E5D61F23F90299FBB74CA830962FAF09 - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = 258B3D8DC600F107CF9FB2DCE3DD0978C3965099793C9B2520035F29167F742200 - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = B55A34C038599CA164802FCDB5A4867D65C1803F81D79C0E45943B48F6695BC759 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 65EDBF675A60B722870F515F779733D95EC72159E7ABA60C41B6CE9D476F3374F8 - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = 34D0482A978A80CB95A489789AF9D51A14FDA59C11FB3B33355C5C3FE049E59774 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 4A4D9C075BB426A4B120ABA013110DF9729087ED71F3C3F65FE345A07D2448372D - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 8E32D11ECE744590173F687CFEFA778D63DCF1ACB040B7E889BB56BB89E4DEF254 - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 60750E8CF4AB750923915FA0E1CBB89211023F83DABE34A30F88A4D922D6A63418 - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 24E8E3F37B41AB8D46DAFD9A03F742C0AC1F8ABAEF1DDE3483C02F1B531AE942E0 - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = 4F9E830D7CE22019C35678868F5A23ADCEC7A407A55FD8C1A69F3E2133600F43A2 - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = BF0B5076BBBECFD555F38DA0CD5E24B1EF3A9AFF423E590764CDBE28AF45C78F5A - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = 3AD6A363DADE669E2DA425A532AFC9939B7ED49B7AAE132F112B849CAA10EA372D - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 90C4CCF7CAC14ACA3524E24828884D7247C4195126C2649F6F1D216588E5481AA9 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = 57E7172397DB7742DFBF030C390DBED1CED646501908162DFD79EC98D3CDDC3E6E - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = 83C2F89657F886A09B4B331133FE191024020E24CF68AF8642F46FAF0D11B9729F - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = FF70FAEE2C06A4A6127A4FBAAD495AAE174D18DEAE7A9946C1CB3D8C357A87CB61 - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 66CD53EB76FB27DF098C22DEBF2627ACA5C109C3B99B1AD12DF42AC6CCB68C32BD - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D79256ECA98EDC6CB8CEE336E62EB967D64CB2988979D4B86D23DB5FB630792586 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 21D03B9DBF8435D824D725AD419A4EEC617C521469384BBDC7155577197DC10CAD - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 3D20CBB8ADB2EE111F84BEEB1132ABCFE27C7296E0C5B94F8E908512B9214569A9 - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EF019521ED376228F05A995011BCD732CE4AA12B620C74EEF36ACDD4BF0B2E9762 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = BED53E26E9B5E80CDA6AC11B74811C74B672E56914070788E55046A427AB22FB77 - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 313C6982C136D3A466D14639FB611F4A4327658CBD24800C8191CE54ACA42828A8 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D3B5BEDD9DB692AFFB8B091D03C25602BF7C4EB2FCD02DE5CFB0E8F0F33C53E1B4 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = CEB8FD9717832EBDF2BE18548E34B177575E805BAC1DC4456078A3172727B346E7 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 20B04E183E5C98B02E68A0A441CD60C5EE25EF83D99B4E602313DB858BEBABB081 - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = A9354018A03F899F8BE7B2076D0423A62F373545C16AC753C28AF63992BCA90817 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 7492D1ED3E50ED123F3E3F479874649B99394B9E8DD6EE8C4D93A6C7959DEA947B - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8F0CC75226A22E04E7516833AC14B63B41CA86DC7ED9D36BF67E55057113C67ECD - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 4D857C86219EF79DDA59C32B091060B82ECC64CF91E31E78D52B3DEB46B21C8F32 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E6AAD94C564C81E88D2810046379009AD0AFFE7CA9B04E849D8A8E976E32595CE3 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D67C274A54656E4CFC3B711975DE080F24AE2DDE2E85315B502EE39BEA6F1707A0 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = 7C92230E5C6E8B50809C4EFF343CCD84E6885FCFD723474EEF69885F12BA2F7881B7 - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = 48E78C2873157A8B2C230C1C03A7634EBC395C749851E0DCE8BD59256687B0F9BA18 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 6EBE5CDA491FF2B1174B0A9C5A790FD948438E2D244A2B7D04191C36194EE2F77E06 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = A4FD9C3F38B8355B4320C145AE4BA5BE39D6D9F8C65D58259D0DE8F60D976693F06A - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = C3545146C29B604715E6D8C4AA4AF4D928276516AAF1DFF1A9C52F259B509D763898 - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = EAEBF3A1A6522DFC50A0027B2B8B16E09DD59A993298A594A35F21B8F390C42E7FB8 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 6E9D1AD0CBEEA980A86A9AA39EF0E17ACF1AA36656276E240A8B6414388CF21A38B2 - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = C6A8885D62F423BDE35993FF390DB26CAAC5CEFFF53B149AEB10EAF7544B6EF3AF4B - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = 38B7DE7F0CDB9B4FE785E7FBD13CE585E4168D87A6DA5691B19FDC6D6A2F0AA20024 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = F9016CEEDB6EE9C9D4E2B4154520309C4ACD93D5ECF621C58E3C4DB3C2BE2FE2D74F - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = A72C3ABAF4EBFFDEA8BEE1B300CC5092A3FC207E2E2249841DF5CDD5F705D9F08BA4 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = CDBE69D08BCC420FBBC521AC55EAE94FAD21116A1703E08BCFFC9AA1E5D5CCCB573A - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = 07C9E5F5912E3C49E24F86E8A5A46A3DB4649B40915A644B6E5209ADB402AEA081AF - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = 636A84C75D5F9F122FA1CE3FB0B15B5C0933820A683353CA70FFA1D3F90F813CBE5D - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = 2FEF691DD3EC32EBB91B2B61869B93D65A62CE247BCF25F7D3266D2993A92F6A05A2 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = 24B59491FA73CB97682083FD07A4A7A08A14AB001A9DFFF1FCBE2863706419B6B1C2 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = C604C37EC3DC0ADD7847789728C32E977113997572173E6856D3B2035EA0973449CB - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 729B84E2F5273F4E4B0082B47FC1C074F8FF126D41128294AC9FA448D14D2325ED6A - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 44A0051AE80E6C6E47064ABE22D4C44612996737588FD77819F1609AA6B80FD35DCC - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 175F6FDA243C59A03185FEC6C25D8B47B9660CAD5FBFE181436912978D819A2FECB0 - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = A2C2512F9B54FA2D34903EC6040A7C08DD34C02311BEB7503572AE12736827D06373 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 3F9B61024A0986F2E9925314784CDBD2F96D60BE5AD01228CB76F5E73DDF41E40102 - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = AF0B0C026F6EEC7A1B300C17C7EFC25317ED8CD274B0BF8383FBE0BC25F8FDEDAC6A - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9B7834D0E37A780C92B83CF443744B4682DF8783449E912DBD0F2963550CC704B4CE - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4292E8D6214636B9D3E248155B2CA839ABDDE7D774214C50D4C0A63943F70043EC5C - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 1852203E59A71FE5644EB981F88A366ACD77EEFA9A8B6F044DB051ACE1A32E4D08C3 - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2FC0B2171B1F0F53FB8BC4FE2FFBDA2FC3EB185D79AF476B2B1DFFDB912205B17915 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BC9AC0FFA8D1D31256FCAEC47F1059234B0D6DB45165AB81CE8ADD75E6FF6BFB429C - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = DE7E3F859D5F1035B7EFE1A16ADBD7DF1EEA670B9331FBA0C20627ABA482539F5988 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 79343FD18727550AB65BB635D469525BDE4B1FBD851DB5F145CA45BB4FF6478D9E5E - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = A55480CA26AFF3ED42F634C5EFD74500EF09037BC9C78F64EFB460F16A3B57FEC92B - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = A24111C6C79A5A0A990EF1E6B6B1FCD097B17F349552CF33623A389026176B4FE82C - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2679BA1E4F9124E72A77AC599BBCA1C50E63F1AB2B2B12F0D0CD677BD958FAF25A4D - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = E17B6305CFD61C1A83B240F7E90FF3445BD7D8A953CB09389B804BC5D6780709490CCC - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = D3CE9A4BC1BEB1C49F6379465F747B43D4DDCEE751E57DD840484D8B6FC71014545C92 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = 495584914157170AF47E93672987F151DF2DF54A67038C824D35CFA07A2619EBE625E7 - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 9F9221A81B7C81F4612F4D2DDDA30A6A15B3B6CDE6BADF8133B2230F98E9BEDB3C247F - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = 8275EB3F103F64062E4727ACBEB34C33C8C01A15F8228A8FCE061B827A1FD3FEE02DB3 - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = DA2F4C668B57DC533152E1EB72B10A22542B47C7E1C54E5156519CD1B1C79F18D9DD8B - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 95730B51A3A42DB86EBD09D27BE11061CC737EBD5084CBDC52E089CBCDF08804FA7BE7 - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = 209605BC4BF4E1EAAD65A44452531B86825459ED5F99C999C724DC1F6AF3C35F6442A3 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = D4346918700DFC78EB89EDAAC14BA434F2BC1238DD6ABCFB7FD066DCA8F972C1026024 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 1866609C3B54626A72AA5FA839536A7727A61044577DD22B0A42D39C018E04CD242788 - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = D6F46CA8C75C41F3F66EB050ACBE0624E11F155ADFA73B8669E9D18EA530A21DB5E75C - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = F6294F7F0AE78E5B7C2EBC5180A6839F70254814281E144D5944D86ED498856D2A6F28 - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = C5F635084BACB18630D0EE739B4FE79FDA1EE55798E4782289D4D91E6FDE4EA72D863B - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 996B1095E0F2160E57B6D1D90C39FC9D0A6063CBC19A1AF15D1BA48267307FD6A54883 - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = E9561368031EC726224274B17848969C3661352E26C7F436F809604F58C509BCF3721E - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = 6C6AFD9E7F774F76917665FAF5587651FE310283A43F8754ACD1123A898F6037A83FBB - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 87DA88E605424B6851495322F8FB0A53BD6FFD18BB3BDE1EB876AC3636C85475D88139 - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 95AB4341D4FCE6093790438918AE611D3BB6E61619CFB340FB97312552F1BF62639997 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E994D26E020E0D283C690EA8F39AE456DA4A73E5518C327F5AC0A44284FBD192975E23 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ED20A0BF2E46267DF2C82CD09FD19BBEE7CAFBB77AF85874D473275B1C40AF7441F42D - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 9363C383C09A96AEE25EEC269CD0E4D03457673A95F23B7BE111D798A9B2A0F1453379 - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 74680A9919FE56E9167C411F487D187CA78B43A4CD28952E0FD94382C6E1ECEE271234 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 667C8BAD758143E9747427A72B61774C37B21EF1F97854CFEBD7965108CF0FAC3D5527 - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 8054C5EF9B3C23F29D31C03E20111344E41E6119EA0BB4718F4D4262C527A20D117F97 - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 951C647A08F8BD1FB980F427864658F55C46960ACA2F4FD286C5A8847548671E5C8CA1 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 16E7067EB1C36016750DA7C0AFE9826DBCAD9F5AF812E3F58385D67AF24DCB73FFCB4C - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 7C999C47402120DC26D56F0DD400C80DA8C7BE86C30F83AA39FE345A4FED7ECD5CDC96 - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 54CCA33AD5986708F74A00D53D9CBD373994D0B402D345683D1570982A5F426AFA73EA - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E4218AB456165F2D41FA5ECB7F31575425C70FEC01B03B2ED165B9BC57F891B78B0459 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 16321D7389085ED95141DA32D4264D35114FAC4444840DF7BBEB4CDE26A550AA3FB01B - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 76E6D7C4F8F50FA20A0EFFBB199938EE19EA6784E6B39A75B54627917BEFC6504A5B63 - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5B35634618D845A32A1BEC57A9A92C224827D2716B7E2B37C04334374FE484A310FFAA - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5A6EAEE0113BF5C974E640EB1E67A09465C1E390101E3CE2DDD851F0359D06CB2B0B6 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = D739DA26420CA2A006C351ED2434CA9F2EFABD378D645AA467DBC51681ED1B14708FCE4F - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 9698C5C838A24C6FFFF5D8E0986BF74F6EECB908DB52DBA4151D9E17712DAE51C38D9DE6 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = 378FF31CCDD8329AD441B32389CB6F36DA0E62F86D00DCFF7E62C4F3B6899A55C4EF1443 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = A3CE54B47137B3644AB35A9F61CEA18B8BC7E1107A30F8CF83BEBA9BE3BC1B1252E276D2 - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = E10775AFDD6789C9D98B24B6E1C1D0D5561E4C939642624C297EF81AD0C1CC22305BE7E2 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = C1536A4A75C62C2F0DEEC31AB0907EFE8833B87B17A07B624ECDE2738C1D74B60DC5F7B4 - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 04CAC8BBBEC2F6860F59E972787418D34F288B79BE6C8B4F7888AC9019E6CEF1126AE3CC - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = FB74B550B59070D211848246B984C4DB64BD20BE70DDF84A8947A24DB81B0AE14009DFF9 - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = 95EF6D50381CF26BDEB5D450AA751294794B49A92B6E2F39FD5F1BE05F385BCA43CB8F74 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = 31B7CFF424D2E5647A0791AEFF5A0E27D8B491ED3F457A803202CFED9FB91CD1C325CAC0 - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = 99E3B912B62FB9FB55345FAEDA109A49709F48262FD6C3CE24BF7C9C4258D5E5CD44ACF9 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = C30998FA408869FF296253365AC6AAE8E94D6D2B553DA14AE2B074CB0DB044A004B3AADD - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = 65F5D76BBB31CACF976267909A15A359AA9AB0F452DCDF57065383A8E814402D37D45B42 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 9DAAA7359B9C097FBC5F91C8953FE8F2BEAECD440DA51ABE2E8BEBB3D6C747EA5C98C118 - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 9DEA51F20D2C7478807CCB20C24469C6D3D17F10B909814DF0FEBF44F6B9E6B8811F5997 - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = EA26A4AB2EBABA54FCADB3FAE8E8C0C6E5A4CC91C0B85F58D47B9B212AAD684866C29A97 - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 8A994D9D3B7AF37915786D1B0B3B3CE66155E35056975D4EA7654C86F2E7FC7898A8A3F2 - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = ADA2E48DA40985C114D7824CD46694E3E9AC12851C19896397F402E3481578697DD16598 - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 2D18DDCC7781A0AB5F98C2CB7B48B4A348F301EBAC0E10538BB326FDFC241A283E43BF5D - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = FF95AD5474F64DEC193500F28B8D98D03607CC72092A72F85EBA4A9F00F188D5D8ACF9AE - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 6A6A8E930B487978030EB3DA4135075B0CB596D24AF45820D4DBC5FACE760E7197C9587F - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 0E5F39EC07A421CC4AC5D62BA5C05F84D229581B3F39BA5A848DF276B6F96DF1B2D7DA33 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 4F31E115F79E6C951402EA2A9EBB6FB2C20219D8D12DAA380E2370AC20DBC242E4F3EB05 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 2A0B38E02F8B8B64F84D7E6A1BFF1FF3EA56AD55BF5D887481B268D0D0D12A10F96A7246 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F28A9A7D01CEE9D81F1497EB522A3FEE07BED3D3A7257D3171E48EDEEB2C0D1BBA2E789B - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = BAEA89EAAF019D45EE3E5E860591252200FD071A74AC6A49B1E14CBF37710A29D70E2475 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = C4C0B3CB09CCA82956B3B1CD3B753AA17FF3108C18D14852E865AFE695B18DF46E16D2EC - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1E03254F15726E98F5F9B220E5444387ACD49C7C4ECB908B7ECFBC7E1BC892BD7814E6A4 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 4B6E6CBCBB5841C88C9E4D2A3F4FF69DEF4DE0D85E62FE87809D8BD9193B47DB97089EB5 - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = B796E3A79CEADEC8FABEC1ABB26AD4633DF1C085D65327B0D9C089B1D8865AE60A1D09C7 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E4F0B77FDED72CF4A6F5ED6296E3A109C57758D758BC582D16D2AC231FFDF78CCEB4A47C - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 5316CC14D8E690C9F40BA8F34227EFB095627037384345257088E6EE334CFA611316D8C2 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 3341314D3A814A1E1BC0DF7FDC2D5F614C9D04B8A89FCF48F6FE96165B9CCA6ACF6452D1 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 880B0CF92D8200E7B42827D5C51A26666568948C4377A2DC686BBBDCFA64A81B544A07DD66 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 3D2238189980579FD1CA587C15BEACE577FEB13782253BB14FD12742B3FC724CE09EBE8429 - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = ECB1116E5CDCCFDDAECB2888A2166057BAD1ADD84CA6460BA11FC50A2BCF902510EE2C92B7 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = BFFA1F344EC672D5E47FB23A2E97F5444AFFA33316061AEE556006D9BFEB7A14686363F2DA - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = A49F8BFEB318210453E9DD1B378E43937505290F5F2E21D6F73A65A224E6D1618560BDFFEC - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = 96597959752A8156ED05E0BE558BBE9324D6FA929F20CEC24DDBA163BC408568AB7631500C - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = E4E54BC879B06904BC1C542706641F248D05C03BAB85DDE871ECBEED460EA499CDF788176A - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 8F12C0CD08D2ED94EA8DD47CFA07DAECCC1662B90999015075F6B7CEAC4797BC8BEE9D0F61 - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 9BE4451FBF9A83E673AF18495A24AE44B909F4E6E3DF9B04C4E7D363D38793B6A61DE60655 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 6364DC516C4A464FD9B0CFCD2EBD722793DE44BA9F478766C0E49B6DA942875AE1957C92DC - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 32147002739F62500D61FE131BAA1802801E4EBAB4B38EBBDD836F34FBEAA034FD19E195A3 - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = 3BE31FEDA3DD2AADCAAFEC8558A3237B2913A1408BFF8ED69F3FFEB63EC9EB6875CFEFAA36 - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = 4F0C64B922D4E28D2ACB35AF5AA0C68C30CC63813EC6074CF48A5874A60D50D7F8E31AD46E - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = 423AB2B02EC69DA2183EBA8AFF236404FCFA85EA4EF0956190184AC58FD8F0EB60776378FD - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = 98972532113070FC7254F8EEEA361E476CA60A82383FF115680AB092F7B3D5B04AFAE60D34 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = 5D806E8B5EF17172C3DBDC7B2E75E1B7632E5D978D8A3C5415228EEEAB2FE754C7B27FA657 - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = AD44248AC3A992A6B12BF2E33F8C5BBDCBE73D5BD0A417677B915945BBA70FDDA62C8B811D - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8C783C16E63791F922AB52E29BA01AA318A07EDE84D1B7900FC578FC87BF259179BB021B14 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = CF9609F47FCB1A9FE2F207469965241CB4EACD5924E7AB547677565E1E95DB009FA3318147 - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = E5D82A39534B3FD3CC204DE88957A30C6FC21B8753A8499BE06859EDDC7743F74D1D02FC25 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 949D193588C7CCE877E7A261AAFC5C78975026A7D915A7B3C8F7C1F8D298B80041D91599CF - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 02F59A7AEBDCA352E95F44635966A9D87671D4A97F69433E2ED4BC1DE6180F532EA18B9D61 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 864BC324A1F66099109EAD3FEE8169B9940856D14FF362837569D8E26F70E86396AD06D4B3 - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B092E2B7B72236DC808FD71714A2F19DEE3EFBD7D0F30F698D3489F8BC7BBD81E64F4878B1 - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = A95001EFA8F311BAEEA0811CCC3B343059C095E3B29992B5E490DD927D50111B6C52A6DFAB - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 3FF6CC682F58A55E9B2ABDCC4083FB8C68E1C13D2DB262FE59E8D3295A220C4125E56BDBBF - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 3B47F689B43B1B8EE13EEEC7E0F2B580013AEA4AD6A8C20A750249E9B289CEDDE6C2ACC995 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 74F743A8E7FC998D90E992221D9C91C498B89489C3FDCED59AAF5A5CA0F24D47C314BAD639 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 856DB5A143C201C69BF09A4F9D5F9AFD36AB1C9966EB0307D8DC392D86685FD902FDD44BFB - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 82AD46DE06B5CC51DCBAA89153B1883A91BC00C84DF93D03DD7625FE569172A2FD73CAB05D - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 873435FAE5BBDCC3E622B6545EE39AD031C76CC5C0C9DB1A08C677362DD21B5FCA63CAA754 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = E5A5E6820F85E798FBD2A94661A177DB3588DB1E92034691005DCBAC0366B6C9389A2A3070 - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 105CDA8EDCF2C02334E5B98A36F30EFC943AAEE739E5DDD29E58269BB13305AF6E6B5272FE - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 59FAA7444F538B5596B816E369BF43EBE6AEB4F430C9A62C2152D649A3B1C0E757ECF8F1D022 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = 0BC75D93993386DC51BD6316BFAA84DB8D34B557F87FDB7AFB8642AF76CAA611C301AB747805 - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = FD1C2A926B7B62017C91A2BCDCCBE3A15A069BCBB537E48CCC33B78DD0C4CF4FF0EB9DD56DE1 - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = 929248358A079DFC4A06DFF861AF36E69B4F42FD613889238C75CEC6D3E65A4ED5A3261B0CF3 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = D251C29774136EB11C80561C0FC2633DBA5C0D38037B6C903BD183904985C137ED10A230699D - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = F01CCBF21E35BBC3232C8E4CE98EF080574FF29FAF7679D4228D2006D84C4216D145DF567C91 - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 53054F6CC4C87776172E4861B0FF7AF5B31C1F9B8AB3DC9201A6C2A57CF4EB9E7019C7A037B9 - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 5C61ADC8FDB70D8D368D19FC9C29C42D88F9EB4194AD765CC3BCF0487F212B897E351697387C - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 1B22095AF3F886C3F43C6BABE8DD1989C6B0B5EBBFB6B732FF50AD3B1BD380517D18BBD639DE - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = BD3D6D37B6FEA5A5DEAE756980DB61ECC262727146BBA94E7C8D5F1558159E9775CEAF0B806A - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = 57A13F1BCE6DECB3A1CF4C2FB7E5EF368D83C57ECA8350017C6BEDE528A783233B1A45EA9F71 - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = 6D176F863CBD81534ED4C9D42767C549F2C764D6ACCAD1D6346D0DFCDC69501E0989995588B3 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = A494CAC770AD669B1CBB4DD7F4E164CED0EB7B1F10B6A0A176A5F8D519FCE0EBE83EBF84CB17 - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = 4BD9AC6BE553362F76E9EB3E5DC6B2C0FA110032C13D833E05CE582567EC03D61C9A8CC73AD2 - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = B3E219221099D44A9D06233B763266B2476B339532C1EC61EAB4CE3B8C8326B034B400821667 - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = 58AF353125AA817AA013F5CE6B5319A16B9ABA2EB84DE1EE779126434E2BB0B151A85A37B233 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = E60F66D86B0D2CE91A9FE6ECAF179EF9CC9D4EA83350E8FEFEDDD0ACB0DA75E1CF62C20A4877 - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 257DCE027DA121CF508B23EAAC59A3A412A0749F44AE52EADAB5E1B1F4E17186290213B5AEF4 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = DB8A7B8E17C2719028F8B6AA1DAE7DAC7C0D785952943C78E2764B50DAD3844E7B4F76C96857 - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 387312CB84248ECCD9F591DF241D780011DDC1E80C6275B3CACF51B706610BB1C999469D87ED - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 8699A1DA67EF56ACDC0C7F28860152BB2454D34FA36C25D2AF6DB4A69419A0EB767FC0954B7A - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F516D94376FC0D08A1DDC3213F338F2281D45503C3C3BD0611C96BB001D81D6F40CB1079A800 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 596380D6C5899E35BBBA7FCE461170BD1CF67B6B8325A92B7935861609DE376F2CBAA8B5C7A0 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = D05BAF1C8C0C858D0B281E5E98FE4CB0F5F731F9A6FA60878EAEA1A815BDF9634869F9D66047 - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 2D894B2AF3285FD86C151600A429CB33196C7A8F1814DD07F661241DED4011B0A85835A6FE98 - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 55A814BF8F9608BDD76D7241208A6361B07A7E7DCCD63FB6E3891784A74A41F8CFC1A3A4F214 - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 8096AD1B18DB7AFB95E60D0CABED5ECB8B14FC0653B6CD5FE7EA01F87D029D18B3EB541D26CB - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 95F6E255D94B90F89B52DFA22E710B6C1669AB464C431C57279640980BF998A377D0E31AA9F9 - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 77BBB2E36663FB27B55E156E5A0E463306CCFD8E7B123234D99BE5325568DFCEEF1341209BA0 - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 939EA5F855EC7D318B726D2AD1ADA5DA5E1D92DE99E4E24228445DC9E6B5EA88303E90FD4AEC - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = C36A9AD5E98279A951A6FA944080DA41020B0F4414E741970D07024A9D328319A305862CD869 - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 6F70F3FCA30C1371DA2D3A79DFEDC387D4FAF04FFD215900E7E84F5557509DF0ABC8C08D06C7 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C7AFC53C21319F1825838B26706B2F816C0349E73994E7AA4B7B5861B648AADB0DEC81DF4253 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 83CB45ED5A90EB44ECDEDAFD7FC6A228C86DFC87C221E275A16201AF3726A1810B6565EA4FE31D - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = E322D8EEE0E0785D0D7E22C38E42729D68D515C0DAE92972CC7A2127B43500900B30F58574C1B3 - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = 42EFFA3AF9BCC84BF7E5A1236AF2C4C81F484A85852218B4CB6B39114721FA9AD0E40487F193CA - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = FAF05DA538FE77AA8A99EF6BF98749E2C7F18B84FA9CB766E54FAB1376B19B56B1A3B23CA761E0 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 3C02E6A5D2BF198F82756CC647CC9C91CEF439E39DA31E51CBB78B68C5D312F35CC758AEA74EAD - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = 230736FE15328737D2049C62C8E68B02DD7092EC299EBA8399029597E7A97D6BE5BABC751EA389 - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 27AC7888533C97CB882931255D9204CA304E5B48071D5D355A450DCAA42268D2D34092E243067C - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = 32CF4CBCC567DDFC08453A11332BFBD23AFD86D8DCF4234CCD7E875388FAD8994CA1A2C357A3D3 - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = 34F5AD9BC1EDA299AC22C0D942C917FC4351CFC58CA9A84DA1119569DFF860159083E9EA1699A0 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 345DA46DEDEBEEAA5629760F8F8B84577A2C5020E34810FDDD729D1F9926CC0C40F1B25F981FA0 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = 67772578480BCFEDE2B6B1E901CE3E4B0399008D74A52CA51AE8E38C63D11A744D347BD1688A3C - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = A2896CE8029ABE938CB5D98CB69FBC02BAA2C4AFD3F57970E71311E89D3AD1FD03D8869CA95252 - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = E883C06D8D6D7C47FA98B1AD550685396486F160B0FC5EA9A63CBC0B13F27E522658DF8F74EC6C - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = BDD9D5560254DEE9E3A9E67B223498E086652AE00D2189C6A4B9E8DD2D9FA32FA8EFB9564E8B9A - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 7A8516527E667E0CEB56D13C7968ED76D671D4E130122ED655531553F4881B8BEB178BB3AC366D - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = 6E2AAE5FB9C97B94EF0152CAADDD9533D39950A916BA899144874269BB6F8B7F4381924DD81927 - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6F03E8AF8EB0FF3D99C931EE868D0EC74D6892628A97D66AEBCAF42924181E5E9E22C07D6751F2 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C7DFFCC7CD8A799F1780BA6FCAEEF77B9B26CC62E9DDD4DB2CD33EA28009252A1E0CB0EE08A38A - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 264AC7647E0DBDCBEF00DE08AB9243282EDF187FA4168B362BCCD7135AF7563403CCEBB00FF540 - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 43D15D9BC3ADA91FED7FA8CA37CEE67C0AE031C93FB6D5C8C05325EF335ECFB4C069E617E20003 - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = FA8C90C1888C4FF3E26C55F46F5943349516F74BD909414B22506874D008B91041B2F61DCABB94 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 5465C8A7BE1D02E4E6AE5859AFB60B03A8E1FEFF7CF42AD76572286170506841DE460B0C433A34 - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 5C8A19615E00D98AC7CD8D2D8FF6293C372BF6481FD2DDA93631FAB4A17152F4E8C3A220D5FD07 - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = A2C318A4389207AA41D207F0F4B0412B224885238E8EBDF74EA5C44B73955F09F5D990C0D9CE53 - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5F758B95F4CBF6E5F0BDF755CF3850B6550B208A795F612DA8BACE9CA494E588D90F3860522B11 - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 04628C5AECDC751D909B7CEB0AC0C6521183389FE7F8F2F0F07CFDD82B8F57F117D82F6D593BBB - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 339AF241936130FC9F5BE39FA07F303C2AB0120B66ED17AD9FD64047380AEBE53D7D174EB4D619 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 377DB1792DE8F4C697538EEC6A254F0CEDB773784A9B8C2B9562B58046D58D407FEEB24A9B965C - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 9E9E4DDE8537D8B641708A2695D20E3D662BCC97CBA94F223C8C8D92F42B7E8FF06EC941594811 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 9A638C71B360D893CE6CD8FDBA637CDDBC8EE9D6BD6ACF820D0C50483CBCFFFAB0068164E237B6 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 4C484549DE71E4D569BD15A179474BD2D095B7C48062729CC75C0CB983E247787870265812EAAA - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 51C5C8E0D8147327DD7D5192A909117B7D549CDBD53925DEDBB44163DB75AB9EC0DB0C7E8BB1C3 - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D4688B6110C6704CDB580E01B50AFC79F4843107C82ACC5161808B56E44332849C3F6DE7AB3CE8 - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 308A26387CB8EA7D216FE70D0163AA94B76D766BBEAEBB6E5957D3558A597160083F8E1696AA0D93 - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = 9ABF22EA2AA6BDA4889737ACA83690AEE62D9ABA28E1D33D2B7656F3BE175DF5000D1C1A32507FEF - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = 162DDC70856B2B903AF004942EEDF24B335316BD4F83B24667032D5EFF404B034B7B998048B8915E - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = 1B409B9C14AA78EB25C3771163798DCBB889069F2BBCB7FF9A6E6EB2B9836C8ECF0352E2B1CF48AC - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = D201140F8DABBE126B96492C14072EF31199C83892485176EE8D44B745765C5BB77245EDB3238885 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = FD441A0BB3D50D58858579111C69DEEB946FF5A01651DB2D201375F3E09382933E7361CADC58CBF8 - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 19542751618CE94E87AEC3654A784AA111115DFF12814F43C96F3419FB8A018A0BBF2571E70F376B - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = C6655F277FEC497F4A5A68AE93C2E1295F265AB10C6E6D5904B347942F9BCC6757530BF3BB34C962 - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = 78A7AEFEF5DE9C5A60CBBC8CAF9F925D09BAF01ED6F421702031BF5C311B90CD51B93D00196EE4A2 - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 2AA30F844E46E613321D16D1E88D7AAB02331A57E7B912ECD907DE4148F1C8E7D869D036DA92B831 - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = 7CCD205F75F64784AA4191FF826456D3E694ACAE1BF8D278D2670D8D8C2A35F7DA03CE2CF3E94D88 - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = EA541C0AA0223BAD61FAAE9456D3FBEF11419661D4F2F2D3719FDDBC361309BFA23298F99D75AF62 - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = D08AABEE642DB5006527CF086985C7F332AC3CC956AEBC0B661C370967D0E889C8B424CBEA8D020A - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 8241FFCA43E30C3F89DAD59AF01BEDC9983D163E0A20552CCCE758742A7C732BB381A2A8D03D1ADF - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = BC8038974294ED861010C8F07986934460FBA83B3FF627720CB436C15D0041C027E1F8F89B0E832D - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = E2E79FC7E597F1456DAA443601B9717529B40D4FB69055F4A2635F0E6212AB473D21F391554448D5 - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 7F4023B3599BB6B8D9659607D8E52F9E8E055661A7C17EF8D6957FE1F7F005757ECA5387ECE30514 - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 0A400FCF43EA6B3A0CFD55C6BDF0B27ECE9B9A4BF776754380F6BB158F54ACAA892053FF59650F68 - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 599F4915A719C7E2D5E79F70E1DEEB96F639323F8F7789E465F7C5D538F5B1D8AF751259A61A31A2 - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 00F88C13D7BB96C2AE152F12827D05E08013B57EDF7AEE590A277708A8354C3B1C9061BD8B504234 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 5BBE842564260C4F2032FEF6DF016D9CDEDFA0651FA55BEF53D4DF78F67596D21C0F0267DD096CBD - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B7DA78B16C6356A44A0326B3F0299477225D72FDC6A425BBE64AACC923A9D9200BBDCF7DF7B2DED6 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 43F2C87733D9DC4277C044BE93F3B60108E08B04047458CEFB7FE70B2345E2E7CDF5ABD2141BE44E - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 71DAA794014FF1695A726E5A192CB7D6821B6F70310A4370FDCD6057A55CCD48E3633F8BF83FE6A6 - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 84CD812D8E3476269B390310F32A9ECED622626CDF69E8313A08AB4038ED514F28EDA2922DBDAEE7 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 320C1D42E3C3258C368F3EDAC4CC18E4BB74579E901DC4AFDAFBE1C1DB6421A810C21B77846B63B3 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = FA2AA0A7AB6E0CF8151C93325C2D1A8EF6538EEE737C4BA86280F894501E61AD1D3FD8DA3DB3228A - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = F26FE2844C450FEF43B6F18446FA3BF7EA137EF968D949E700A5B895FE48443B592220F6ADE36167 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 26229E49A66A7DC790A21CDBA7B284798663630D0E472E36B11A47E84A27387CB907AE0F1D83E88D - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C133E8E0CD23AA76F451CA908EAF8DD83DA66A2CC71C3319C29E4DFA9C8823E1D308D5ACC10302C8 - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = D61A6CE92699A52333CAC43F75F1C8DFF2DA6CB9B1453F35B9FA5B79BA4CF0F26EF67ED840E1F678 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 66C6938A31279917A3D691F94ED4CB2A8A2679992ED12E67C5D7C6D61BACF0660E84E8949E4FDCF6 - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = ADC368EE7D57F78D73FE6020D86C5DA64008A77BA62C05CBFE5E9BD0F41CE598ECDEF29D70616238 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 83C1598E5B6DF2A92386A6E84A3F29F89D329EC33A698F517546AFCA6393AD2BF6232574CDB275415B - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = 06B57F4DB547F4EF542CB870FF9E5FA52407F5A40EAC90A2B8743FF75F50A1EEA940FCA7CDF003EE3A - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = 6D1076C6E8D06E01986ACAD56CCF3D6535C1DC46A502F444901BF8F518E49A5D64EA3B396620986974 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = 91F1E794A61E5CCD7026877FB9BEA459EBAB80A47929C685D41C71250E18C3D7D8C1FE6BF192D49FC4 - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = F67730931DCC79E66D99C6ABBEC70E33D108B43765C69ECAC661A93A90B1035C5FEC4F423199727E20 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = B0D5076BD8016BA63744AFEC4CB7331D01CD5C6FA97D0C3EE8760CACF05E93C5E84F2F44BE7FE0E757 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = B84D07AD08A962BE351B1AAF7A262EB72C21ADC66246CE6E4AB53199171F1B063E7D56ECF43B0F6E35 - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = EDE58CC50F9EA71E06BF60F2A9882AE53D4F8036B0A513FBD182AF01BA8A85082AA30BA2A35F76374A - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = FD9464EE81A4405CB6121BF6161C7F6F0D5DAD1967D165916B01CFAEDE43F203568A5ED16FAE405C16 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = A04EBBF62F4630980EB8DA634A8DCF932165C830F22EB336A479CBE1A5B6EBB6548CC1FD641BA41A9C - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = C5C6F301453FDD3330CA15A72D2A5779D8B8597E1451F5659C54D86F4D4D70C307E77C0E8131A84DCC - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = 0A3D6965E0ED5320B6F57F0F1B1D984DE353E0FA25B2DEBADA5020E10E0760BA2D8C22BD19D07E134A - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = 65F66C65E19145435CF38AA35E99245B1E2B874E0FC26C2CF71BFB96FD4C590B09D7E4FC912871DBEF - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = E20ADFD17E4578803E9C51733D8EB30CE7E2ED64F999496B8669B409260D440C5056266667898FCC02 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 684AB31213099AA905D1239B3F86F8A3FBDBA8BF2A5741B1AB867406917060EC9E967A5369D850F9B4 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = B68DE009911B6CE8383C6ECF1118BC3DC85200308BB9E0CC2CE6C0C7482027C615B921C7B59B835823 - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = FC1F94721CEDBD839C294CB087E118F8AEDA4DB4500D34D5BFE0C5F3A01E27254CCF31E725990EF6E4 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 1636DB001BB0351410B3D17B2AA79309F656C09017103E3E36D924C4631BB844844D09BFC10FFDBF57 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = F7E8EAD57F81AC33C2BE6FE41088D62EA357F405A364C8CEEEA5660990A04CF1C961BA067F0BA2FA27 - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 44E02A3E3F4362712E8FAFEA2D0BC2E30171467F3AE9BC7DDEE2C1C113AC57F4224E1691122995346A - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = B5B0F04C2DC7B31A81B929840A2A76435890DFB0D20722D974F8462B691981CBA67AFC8CF135CA1321 - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 390D640777F620141E879FE2932C03C847142C4A3E86464DFE50B298E92C544C284400576B83939760 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 94F2FEC6F1695B37D86E04C43FC73B19265DB2916C8808DEEBA9FC365D4B0973B8D39F50B4A7B1622B - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 5589746E3AC76485228C9788B5CE26838FB40DAAEFF948847AC11CB261C4D6D52097A8604221D71100 - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 809F267F5232B77BEA251038EC3168B6BD73334A16C9A774542EEEC2C7B9BE4B3201D097EB47BD020E - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 3AE8C62C4BD01FA62FBF1EDC5232BE6E25750149D1897AE93B93003D3F9B8228DAE65C6CB3EA629A55 - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CFAACBAD7714110A707DB2A3ADB917FFA180F13760E40F8034487A69765117C7F1118D81E6F287AC12 - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = AA2F9DA96A999818E9BE8E01E18DADA802D3785CFFE87930294332865429BB44D174013F4154562856 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 5AF0B3CAB9B9CAD326482983472EFA9D96EDE434C9E110176C18D496C0A073AB10BC2AF57D7CE24388 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 08242FC7E554891E2393A2824D2A2B6691F6172442E2EB0CAAE0FC94E59C5E71F14E273A9C1234691B - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 8643E3A4EB0131C425365289F3E7AAE68965D8FEB9C07920B318DECFE9B568D0BB241EEBEED26B066C - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = C3FDF6E522F92E80FEFDBC2FB8FCF2C0228F6275C185E059F06DC23EC35B5B19D8EE420A1F495C22B8 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = FC7828009F89CDF8CB2F13EBFDB7D29BE9C36427874626610185B2096DFDF80E827183722A872015C0 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 9DC5CB4CBB3D9AC8781D86C4A1544F59F5D8AF8B981B997186C1D99563A374184266731536F7B8DEAF8E - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 84ED05C9CF8D795923C3D26EA57B7A37065008D41B2928CDC5F8072B03F2340F67B0DEEAB5A8CC706C14 - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = ACBAF3B5B7EB50BF8CC1813F7810F573195BB3C3D17BD80A6D165F920BE5B5B36F1DAC28F573CFAC25A2 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = B1128FFF7AD5C950C4CB5F9E20A0CCAAB24C8B35208972FA918536FC4FF365CCA38D0B07FEC44AFB75D5 - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = 02E7D7DEA1B7DC3837DB88FFE1762A5AEBFE65BA1B6FAEB0C0D76E6AEED9507CF15048308EF89FFC0D21 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = FBA3F4D3934A96E931957E13378283730E5944F87FFFDAA4C9125581845AAEC94F46F3D2BF6D8EBC1F02 - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 24FCFD60BB2BA86989C846242F63DF551898553101B3C2247F7E9660534E4784732DC3F83E5B46A2E5BD - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 4BCE5260DA456A9AA9B7B12066798BC34B1438D3F91FD7B7DA344890E2B1C19634CEBBBD60AEA2C53476 - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = B724A9760CDA9AD54E2929306219A95343DA3C44D0B318586DCB753CB480790A5E2EE3F1A9EE98C7D79B - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = E7164AEF50B2E9571D88492C26196A6E32335231C44829CCAE7D7A109F391ECA7CADF98F57AD9D6D9705 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = E118F7D383BA90F2796F496CAECA6884A356C207046EA785FF13D759C18849E8D7710F127DB0B8D5A239 - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = E2932FBAC967FFA98697149A06741951B23E38E85B2FF8D85F34F8C518235F1B38B3A5F3094F4F51222C - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = F45AFFA0F221C46BEBC3B8B4FCA78B281F5FF4548646B24EA2543462295D30F2F3E271FADE1CE556341B - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 1AFA1060065473477C36020877D3E771E16442E028A77BD27CE176ECED35A768CF2D250585429A18BBD6 - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 8DC03F8B1E45E5153D12833DC2088E966BE516AC10F42A34E9F05B6F9F1FF4ECD56CCF59E58AD745EF35 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = BD70947652B4A44C7E466DBD72D90CBA28D02B1CD9EDF4F22BE023F8D4222A32E79AC6BDA6A23FCCB644 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 9101813F0DF609073D741B3223A8DD57977005429E3AF341B0AEBC0EB0428D628AA8EA362F6C468A0123 - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 85519B6D306823FD522F3BDA0A7D2827E90D6C4D1B52AE42816B4774EA37E33913D2F364801F80C34A11 - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0277DC347ED4A6AEC69A095053C1969792D007CB1C3420E64E9FE445C2760AA2E87CCA22385DA8B28E4D - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5DBFC7D921E240E6EAE0835F1024755DB40CF9A4C7D8666CAD5C375CF24673E4B70EB1CCC045E96AFFCC - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 83B1BB48FB9BA9109A8C8788EC110C1E5B2419068CE727506DDA047104D67260A069640E825081B38069 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = EF5DF9D9E5EE02D691A97B71D04B45F3BE3A8C089A2C0F2DDA7CFD170077A36F4E200E4E8B0665AA5CA0 - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 7CB4995B29C32684C3C05637CF113621B9750A44189E08044852249AD60B769BD58AD48AE1534D1D4C9C - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 85526117E8C15AE8FAA3999E42620DCC5484A63E25297D7C8C8F9F56518D935FED6A0E04E97BEBA85C8C - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = E66509680E225B07F3815ECEA5268FE305018523E6FC03EC775CDC36F0B4571EDC5D93CB235761575C42 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = FC19D09CFBD663BC8AABD9BB6D013034F92148439C9BFF0A0F6B4E377F63C9A961852BF0937F8D96568F - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 83CD10314BB98C2A095A5A48338D6978F7F368479A8C69F96873DA9228405E4D58714B5350EBF9F5661E - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 2D0D8424F95645C312BBB8684511CBBC626CE4B290D1E7848E1D28DCAC3D50B2113F01A352372A25743A - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = ADDC9FAE1343CCBA0F769991F1D290327D11D248681AA4E881F0D5266AF3D2CB8E447CFF7BB5875EF707 - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 636DA76002C261A4639EEF43BA0B6E03D0759ACA5455EB08D6A0279596757394B2A2B1A68267804CB1C6 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 76D3D94750F6424EF499F7BBBF55C142CF5C8747E3800B196F848C9649CF5D8AB816258229AABDCF27C4 - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = A433022435CC262AD128434EB63249D3C8CADE85453E891C42A58703E559D6F71001BD7F9E0CAFD643E0 - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 82B52960E84CA63C8897843C0FC7CE4B35E5505D3526349E732B2EA7D94842EEE9041257A7CD5A86484E - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 50B722B90309FD05523C2E9E9ED51C0AED1B12F9B94B6B985A8624594865E3C03F4FB0A809DA7A4F50F2D5 - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = BE16E67DB9DE0AE936643EA5229A39EDA9A380BEF710FDD6207409F1AAEC92F7B573CD3989BE29CFF73C4D - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = 9C25EBDD2539BF80F614FDAA2A9C63B751877985FD1E04B77FBA510DC0A0FFB87E19A95DB66F2E5E1E2BF0 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 9BD039CA5C16D66DDBEC36E22030A81382428A2B9D8446F12FDDD8D3550A73D22C41FA6CA54947EF6DABFB - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = B9E677CB893353937FC96FD326EAFBFB3D1F503BB8E2C8AED3966A8EB8BB7B8C11F856D1553BAE3B1E0196 - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 12507646F32E1F7DE5B36F559597EC0C7777BFB8A7C29A5E9AE18DE9D48D563972F8B68F5DCF5D64AF1357 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = AD5218B6F38A90E74279EE1BF4B955EDF7C77996D3DEB2AAEB22E5499FDFC01943921CF9E5B64D1A4F57B3 - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 517642743145530387583E64C641E4DEAAF30211A8702EA69B84F13EB553C9198ABA3E55BFA1B97DD0EBDC - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = 0E9F2F37088A2496530B120D3F3BC02E0FC9BA6C1BC81BE1629C3E0E565B94C6160039F1EB35E2218962A1 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 0E162565C67A325D224D746427BA2750330DE73847A37A2C10FA953C3C9E532DF5A70D8E3F75C028A64993 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = A0BA4B5CF07DF352EBFEE4B4C2F6A8056D33C135B0C9007907F1D39D4A8A7EF248FD6156F5E26F1A63DA35 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = 52056A637072970B485F7D4E92EA4DFC5C0D46DC8DA2A223FA0449F61C6E0D990A984C102AC2826AAC9381 - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = 60A63E52DCA506845206C0D38D493F6CD4D217D6694122C1265905EA4146D9C17907614D6E111679495B6C - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 13E5A39AC08D5662B10E8C990C1F3260192D66A1CAB709B8AE37C29F1C1B5E5C5D982DB73B675BED70532F - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 37308EED8E56FA35470C708A162EA0E1A909534F77246A672EFBE5D49F33B2FFEC869F958D6DBEC64EEBB5 - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 087C5B83BD5BDCD500B2C982BA9A3DCE2F2495FD526D10267D3867F02660328DDBF8D66D5707E8F3DE52C3 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = F8E06FFFF9E4E8A1F8D22276C6BC1DE9015531645B5E8418A569E35E50B0E838F4D45C325C733958F59802 - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5B7F41F13B654D0740A538516C1B8976D443E839250A425C6392ECF2CCF060242DA2B70BB5EB4455A6C823 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 5AD96FF40A77D22588B88E12B92311807A267D568A979DA662A86600222DE8E519D6AB40CFFA63F6987691 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 83430F392B6602EE499CDFB6A10344498AC049DB14E494BF6AA3510884982E5047D1CDE22FB5251F8BDEBD - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 01B98EA31E57DD37F96B2E2BEDB0D572529B4B8CFE7C5F4C3A7C22360CC8177E637630A5F72DADA8352A8F - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = C56B95753B5330618DB971E64A9771965E2A6F9043CDEC91225BFE24524CA893D4882F315203ECA00B4D13 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 57D40599AC6B62B733EB663549AE4EEF77DBA54B562B92001F94208A85578DEDCC5BA4DA0FBA866AF3D078 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = AA0784DBAB183DC362E71C4E2985E0F7A79B174D8417F4992713E1FEA14931BE13DF241DE6DDB3CD71FE24 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 036E2F3345F00E2006372CA14CA9AE85D6B0A68E61AB8C0A6C4D5732E7B4B7E2F99D613213EFAE650BA5A3 - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 2DF9C04BF8B92D460D008640E853DDBD02C6625EDB87BBB1CF3F4B2E745EE952AE4A31C8B478B8EED3825A - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5B68D45A360B031F3A4776B15F8BBBFA0F7842EA42EB72DB96DECA86D99784A5818776BE74C272FC2869D0 - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1FA9ED62732A13E5A21729D1C73D9C0294DB391244AF96769E6C1E461641DB206E542F89F8369C534F47BD - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 3AA837FDCC874C6A48B2101BF228719E016F66A1F88234CDAF049EE82320EDF87ED778813BEE3F152A99DA - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 82F69A3BB0BE9C8D0B12F5A6D66396D18C90924D8C47BADA36CF83351C3E292C24C528BF55A2F1BF71EEF6 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = EB5ADF186B11376BA8DF5FC57032614498FE0D639C13C7CC3D2B24FD39359AF906FECCE8E892AE4A8C66EA - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 946587D814348D837198C511561F0AC212958AD792C00F85C2F5CBE08F0514463C4E59FC05D9BAA6C7D6D9 - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 25B9EE523352D3BE0B895F0F08CFAB3DDAA8AB3180E2A30D8280C15C9C3CB9BCD491164201A53933F88984 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 9F24633A6B57170CE4E7F1D12DE6D81F156840D19C710AAAC2B83B7495166FA534F948CB518DEE0236008612 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 5E7C0EA984621A56443F5D130708D72D4C1ECD4A110EE4EB716C1ACEAD946EFB3F832FB9DCCD0C4BC0758F02 - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = 5E58C3744AF2EFD8DD891EF24DCA1494AB9E9A43B28D5BB2E805EAAEE7F273971C0C83D6CF8750D156897A43 - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = 35713C2B900293CC13A2CC27DDB5975D65C0CE80F024D74BD7ADD98FC1E2CCBFC2157E9C8EFDA3C0960DD962 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = 2A57B69B6A059CBF173D6E4E967287E8999AA0FDC5C3AFB5695DD4FC7F55153FB2EF2C9050A50D47DA15EFCD - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 9F55684890ADFC25E05FBF98C5DE461AC1C8B233485E9732D36AB81CBA7C66CA3644DB31C6BB01C9F9907CA3 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 7E3F1FF507587BC53B35E23A6347D9D6B43A74B5A6DF5AD9C9C28B5EA8E83C754E5F588C6CCFCDB572ED83BF - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 38B71D00A3459A896160E1BF24969A0CAE0BE844CB11B72D7336154A996F390FF7F0B1ECBC9DDE2BE35CD5EA - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = D96A6D1524E88CABC88674F7D58AB4F00F511DF1E9F3F1D49FE2EE899B853259FC33201AF8CD6A606C05AF09 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = B9E02DBBDA5FEEEB586312AD5B19D21D05A860A16F9207C156AACEFD29F4766E1416D26125BBEBD384E0451A - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 803C304D1B20F01D0068B3A4048FF8385E6FDA343F275EA6B713588AB98B7293361C4403164F033A312658A8 - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = 98DE6DE76EFE6B88642C4C383640D2E7289F44A3B7A7BDF3E332627AC53E1F80D8A3B7C213DA0895FC84D2DF - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = 7548E51BB5E27050E37E7F240BF269186AB6640853647BE2B756C92F79E5467F0B8F0A3949364491AB1E734E - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 8321C875595C92763A4A0A3E24A3625A00821C3002EEEE094D6E1F6768C4D3156C35175259F821FF6D0EA5DD - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = DBB59BB6AA85B8B79D565F13D553C7B71B5B283E2D3010F477B3AAFEB36F296267C81566E1EE0A7B32B5A4B0 - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = C6B7B22399F2ABBB77C9BC45BC8209EAEE01009BF2544B3DBB17EA04C2375E17732B5B4A89F122FA381F21EF - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 4CE27458062E0185F4F8805192DB9D6FEE10DD99F04ADA05CB2D2BB388F3924ED757FFE6699085807A458888 - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = C61EDF8CDEDBB5F62E7B5A0CB4A1B0AC36DB739C22248E8E9A2A17BB71868ADF8C13228F836EAAC7B6FF5C33 - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = DD802ECEFC2FB87534E5F37F4B7DD5E2BC1A05E7BBED3435BC9DFA631BC9879043F3BED443AE7941301FC5F6 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9972DE9F98A58B1DCCE9E5D2AFB07C8FA8629DE9102AF4A29C1CA95EEC6ED285F9CFDAA8FAEE0A43415144AA - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 1BC07508167C7A98B949EC57E5007FACECACFD4D644D88922E2ACA55608A67C3ED676EB44EF2C6EB8F18D561 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 20E4C704BBC9EFBDD9DC63C6EAD154756D95A0CB859502D13E11056AD9F663025D913041F7C22141A0BFF017 - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = FE273C22BB03E0E258172A2BCCCA851926B466AA1DE27038CA4C51B563BC5DC64A2D02BF8D398B67FBE8F7CE - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = FF315002E3CE5B7985C7131977F94D5C1CF1CD0712366C831D3C0B4921BA475C8669F750AD62197136FCA5AA - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 525B4A62BEEE0370FDCBA1C79CEE38BA85C21F452C99236441AB922611D2ECB5CD8F812F1874F115DDB9DB28 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = B46DAE126141E2438E49D4D7A9A32B6A6D94443D4FF40BFF5DDB7CC4415D470ECC0DC44D0DF8B7E4493E0F9A - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 9CE4BF645F4C6B3CC4AA3506FCB7092CE35D3CC3FB870E98F9F065B847597BF706E00130A07BE707D9CEC8AE - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 1107272EF633A035CD6B27919C37E756EC016F3F2FBD872557C7C25CA79D9DB71E7CF0028AACBF83BCF40DE8 - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = AD47454DD0AD3558883CD0B9F1DC6BA555170F953D78BDB820074B69C7F0FA51C11CC23A7F4D393B655B6ED8 - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = EBE24999270ABB93844E71D7674447B7739AABE17D8D57BB2E858B559579148933F4B3EE580324DE1336647C - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E63DAFC8BB435F7A0E0CADD690DFA43B90D65D2155A1EC44758F82FE8DD084FC41B11DDA31DFFD650F8D8B7E - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = D2BE4B871914452FAB405080469A7ACCA4D32A187B78D112D31C0B9616066762392248EBBFD7CABFFDB0AFC7 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 5E423936CCD0C5B4FC33A122316C0EAD5591D7D979C34D9927F84BE52D5FBAB06B6989E3B1E2A7602B9425E5 - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 2486FDABFE7B400BAD4C5C414AE51C5EC8663BCDF5D6B974AAE8D78F794FCF1026E945EC2E9F0CE1438B2E56A3 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = 7A36F725F26BF96C72E6DCB4CB63F71F7585B04DF270F3ADFAEE18A9924286C5E0718B7818BCBAF73241B2EB57 - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = E687FEA7DAC794E37961443319AB39B6D9CADFA0F1B4B8A5AD989F061601A1E4DEA50047EEC1AF7A7098B3A700 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = EF6BE16CBAB58F6E9DDC3FF8316CF10D73F45550BC3E44F98320F772F464DE966FBA8B61F71F7C0C86129066DC - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 687707D2AE137D3D99B1011EAC0F754D3655326CE826BEA0377A18E30AE0EA14CF4632317AA530E63D8554E3B8 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 8AE597FD0D0586138DB88154E2FA8AC6A8638A5495D98257EFE2D2B481D9F24C5218910C424F5C2D6B472D6F75 - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = A96E4AB029F2FFB09AEFDCDFCCD985192C925A413985D9C691C3B683C5274B2627BC3B33E8AC94C620FCF28681 - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = A537B8566ADA1A8537A2810ED8D08C9D39577DF7CEBBEA904A8273366753C8B71A519FFA4F735A9C6C4A129FE2 - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = 75AFF8AD11DC4AC83DAC52FEE4D140641EE4799FA758A4261B09B2CFBFDFF11E2E17AE5EBAA9B7CE2ACD648970 - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 190C91B5B1B4E619957000A6350AE2F5C2664E4C1B835ECFD381E3C6B50F7564C8AEC9B14A5F6FA1326B7E18DF - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = F3DABAE2F04E2E0F2E226C37C9F76A090BBCA8A439E0FC80E07603EBA7B5EDA0499FABCC1791D6BE675282951E - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = EED92D0E4E20F3869310475FBD0D2BC50EA143B7A663A36D00613775B986E60547A29A29C852A375C235ACBEF2 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = 96B224A6F05C7A3F07CBBDFBF6BC8AFE6C44738BF6C2E3923DF8852D19B989A4DFE6B234C77B6A06087DDC6F1F - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = 6D56634E5E8C1BF496E58F1C949E7E5B93424FD836E4B4EFDCB77369936BD3A0E1585F60159DDCF0F8D0C8D196 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = 5493E493C7910D5D5BB6F5D6B5EBDDC526EC9A1C4B93F640547FA91876BCAB522C56D7A5FBC1099D668150CBBB - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = F82CF60D0751D3CB711544FA90D261018CA8EBFFF52B70AD6B9F65877AD1570295C1C85A446DCED23E85C9B8E8 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 7E20E355C600AB52EC11D6084FAFB5EC59AB743A87DC30030E108A9B7ED53F1EBBD4882EEF6CCD522D5317E427 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 8759CA4745E2669DC195140A63AFDEF2CDA65C692606A83BD12509B98278CFEEA4AF7D1DD705C16CAF5A15E11C - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = EFFB0E22C1A97D130112E378805050E108F2EAE79A882196C3049521055B67108C87FF20215E293EC12A8F1569 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 6D2D760329D7C7ABA99828B3BD2959CD0B1E4D9C99D6F77DD068EFBD0FF1C71F0ADBA8A5BB5D52834252CE8302 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 3344CD2A1CB48DA3A222BD7702E968D228F5793273AC4EB81FDE9031C8A3D51B5BD97EF9090E212B728CE7EDDC - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 4EFA8EA478532758C8BA47C88E16500A1843F2B020A873B69F0722C15171810FD0AC102D2E91E2937015B60C4F - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = EDFB6286D8DFE075FEACC8916BF640F7C5BFE4AEFC6FE1994D8B907A82EB8FD4186CF789BD6229B1E3C6AEDC02 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 66B78879BEFE902186F3A428654D76F442C5ECA2418973E9EE2A4725E2887A9599B1AB6353CD5A6C2452E005BD - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FC31CD8AE37AFCF64C59AC2F51BBBA9BE51E24C2572376DDBD7897E405FE79AFF0031435454CCD7D03EEB06701 - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 50DC17A31197B051ECA4A0DE6BBC066D3524F6D1E1264E3EFED053BB110F29AE0767BDDCCEC0E8F1BC75A6FC81 - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5E2E5D456FCC9CDC2CFEC467F380FFA373DC2829D25A911F9D2A4AEA5E0CD9C1F1F9A3C80F33E1270CC134FA46 - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 523BEBA8E8320E98F50CDE402C651C672340F7E01A6435CB1845565E82AE7844D494D5B1452B875C5B6073C2E8 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 95FB55A007311EF7FBF3F6B29374E5D7E31A39955CD8572A20F855B5D2CA30717B6C87B4DAF5E82CB5C34CA196 - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 48F8D6458E1AC9921CEA8C49412267001F0BF29E352D6BE7A6B4F819022A5036051465DB3A675538A3CC8F5C34 - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 99D9544A4ADB2C4397DAFA40237878149A8B0C29F39B73038ABAF41B39080B66805ED421987C50FD427A1C656E - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 242547FF0714192EBF91F15B3D75273E3967F867196A2C1651541602DB392B963B2F01C11C7958FA9425E1E53B - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = C6D7E32BE22CF1A624D1D6F3088F7A7B04059403C8C787F30042DC1D7BDDAEDCA32A3B61712535FF921ECE82E7 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = E4ADB000D77D823B2EC395491AF63C30D01C012D59E1BBAE9D4B50240E014FCC67ABA8FCAE23CEBE96E69B66D985 - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = 0EFE89AA64920BC1E09702790301B0E1CC1EED4CB5E7A104570C9928D7F3198EE24D1E677B2699704F7E0B7EBF6A - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = 1A060CF96B980A9D041A9B4745F16A36AD8B24405B7116882911FC12205EDBF28B13E87D10E860D443130E9DB255 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = A48822320C9DADD7CC2871AE049ADF19C7A9C8D5BF6C9AF3E8CD83621F571B4E1BAA9689C5CF5EF456FACD3D06BC - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = A573B83B6AB5AB75833FF19BAC4FDFC9B620671454896543516720F3500631D2126AFCB6D4808E79BE3EAE610D1A - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = 3C84C22EE46B607D3D4B3CC728698AC01F407E5C69EB2B28D2C9EBADB9202D2A8A1C8DBEA1C8EAF9CCECD7D88A60 - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = CEA9CC7C944E721750A1BC1143C610A8A289969A9885C40EA089B723CBBED5BC219FD4D8109E45E22BCBD2D7492A - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = 6D16CD84D3AEECE0EB0B124EC03BF547DD4BB7D36EABEC41925090E8516D8029DF15FC0A8F7AFAB5A6BB41B7FBCA - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = 2A3543B8C7604CA113A8D31E17CAFCBBB2843D38A3A5113C4B4D2E84A834FC168CE46DDB0A1E42B31AFE5366C465 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 07A19BB9223316A1E207C52E79AB8EFD14457416C2DD0E5AFE609472B846AC8FB95DCB23FEFCC4ACE038BBE4FFC3 - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 4F3FB3B74E484C7BD6CC7A13FCBBF364FDD31387C15690E85D056F3A3616AD8E7AF3656DCAC6AC8CD0F21FD825BE - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = C3990661C17D7C1F66C70E6F9980A0FC96C23F0235D9B7508EC611BF763076572F12D1373B5D1AE4FA23ED784952 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = A3FC5BBC457A5C138143F0B41F5486921A8D5AF1238CCE61081C6FC1FB013DD555B47AA90CC1F87325DEF3F4DB0A - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 992D7190D8FDFD0FCEB3E6FCB67E876289559D46D89DFB1B58E8F25AD5F9D320CBDAC7B364A37A675A55A86E01BA - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 613D9ED9CEA3BF3841A469E671FAE43C4E093B8C595986116A03B38FA2AA9AC5AAEA7D00CD838896B57D7BA34351 - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = 82009068777F098DF837691D7A8B4A52DAAFFB545674B6A71291EEDB20E5E49E828E8BB16B6B42162B97214ECDB9 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 082DC66E7BAE9FA948E6630327EF93568CBF9C55E4CA5EF12AAFE995463DC64D0BCD5A46DDD4C9B728CFF02A5D55 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = FAA0B3A7F49E169FAD255C07E70E7F8B35BF90A28F245A944F35BFBBFB4C5DC90839F0C14AD211E1781D14F5C785 - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 0C58E0D295C526973651603028F35483D1740B4FAB084E54433947C2C881CA2C269905E61F9A3AA201D644EC5F08 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A4570A3FCB168B22DC50B35A92B7CDB73E0BFA86F331904643103BCCF2B5500BA91F91C6BD6FBE25B77B65019B2A - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = BA5D69C404EC0EDD26E618933AD805185CE6DE628A9240D731D83FBE941121CBB981E396CAB697B6DDAF6427D6D6 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 8500E038B4EEB39701DB4B6EEB0119F9A1AF6815AB7395DE9F3AE618658CBB7AAAFA16E9ED454FCC87698EBC7C89 - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 53FDD10A49BFF42B6C4236665DFD46DEFB1F060FCFCA6437500A6975D855AA1C85CD4276A26CF2D5B9868369DB31 - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = B2400087E387BCCD2975BC46C542BE97AEB11607ED5460C3A4AC07B0E3611053671F0C017190BDCE3BA505357529 - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 0B3A186888E14C5EAEA401A1F825808C0287723B36E2FF40A78FFEB7C2CDE56F971BE186EDAB6C774476504C68B8 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A328682A4A93B278985A4CD8954D4E7C8CF3B58D78F5CA1614C5235410296A389E4C31C3621A7A50D461DB61CAD2 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 20C23798768D20CB869EBAEEF35A3F0508ABC80F7501DE318ADC949C122448A916093C4B1D42FCB704FF43CC2E46 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = AF3D2170EFF0D9BBF99490792725B9A3019B7EBEDB4A3C94B70ED2A33315363179EC70912AEAC8DAF72019A478D9 - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = C5400730AB373145141A113E6A55E6D74DC27DA4C99E5EBC8FE09E4FF85E8D6100B92EA0E08450EE3F8C3C8325EA - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 92822E47F36294D89650D7415E7377C317138341A61167F4837201A9149D4AA0EAB86F737C63348952325E2839AD - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = B1848F2E2A65B35E987E2EB4A347470A88E785F604A2CFF8A13C6D7F38AC3B281F7A2D9A836CCCC58140A20C147F - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = FD7CCA6C1F5897F318CAF5CC8AA83ED133B0F633E49B043995389D46FF314BED81F04B9A36CD6404D0088C4E795B - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = B925AD0C316E1839C088F6089579A8C1E75253371AABFF11FE7918D4ADCD79E40BBA3D4EFEE4D22F1DDCD9564239 - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 790193BB1C25437DEEE6FD1BB7E2B620F24F3BE210552D29B164613F0D007ACF17EBFAF69C7931CF76731234D084F6 - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 83E65CB6C4DCC2C0055EE5B46A9926B33CA1453FBEC334FD012AFDA4C54A0FE903BAA821C1D0B124C44942AA6F1A5F - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = 80AAEDA17DA227CF8B02A936A232CD4E9BC2504D6E782BD1D96C04FDE3ADD9054C3ED022074305BC4EF6FD2CAE9D2B - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = 2AF074E517322F2722A09412E1CD67FFB02B7AF0590DDF8DF22B3F97B8A6EF9E58E19A37450569A94296F7A71510B9 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = 718390EBA9C83938F19170093C8DB99D9C842E3F636DBE258AB88ECACD4BE8BF40131DD3262E9A325F11379C049AF1 - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = AEBA7F198399E899585CC00BDC44E9855701CA8F116B8D6DAAEB19904CE0307BBB4549A3B4D2A999D7F4885BEA9BD9 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 6BE7DF3299585C843F57F628EEAF8329A9666921BC067CB527E5491E6CF3B31960D95CAD57C918EFBC4DFF3FE71C6C - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 2060B5D0CB2BBBBE9DB15558E8E67615D6D093AA535552E9672F98445E127E1B1D845FD0FE362B23B42C1C6A46DDC9 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = A2D997122FC5AFB4C0D13FA8E072CC3A362E2170E4D664C01972D563431AB39E961D4C6E01927E87EB4C65C6287AD1 - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 9F16D744D0419A7259A5F28F68DCD64767CA45C04322C072EC45B751333AEDA9F8551E7A9BA6BB415F28B5777510A6 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 353BAE23BFCA3DB7EFB90939E6BD62B4B136F301A5BA2CB9F634C32F9CC9D3420B9EDFE6A0570541880F96676FB633 - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = 7763680F84EA1ACBBA63E4E30C91F8E4453EBD6A3A6AC2A52701AC16134CB76C12C561FBE73D287D7002BCF0BFB837 - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = 3D8801CA6055C29CAFBE886C6EEF1F51B46F7A54A5D6737D61751E875463C2211BB9C1E970EAB2077D995927748B5F - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 5DC2B24CA84F938740375B57858DDB62A098AFA58FC61BBC6E88A521A1C250FF6E068552786E4E139CD8EF21F6502F - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = F011652DB1DF1FE18A5CF42426DE3893B8D922538936674E4F6923FBCD07C3FDA605291CA42AFDC8BE621CFD1DE435 - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = 471FA2C8A04D8271B7D861C42CEDF1A87A628BDECBBE069BD949A2B61F496949C9D63B51525CD92E688A5784BF480E - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = AC33C89A97E953D90DC05B55102ABBEE98743F32A2EB14DA98BA55D79515601EAFE94F6BFF320DE6E6BF66810FF4E6 - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5479C0525F7547AC6FA232E155E272D716F7FD9AD3AF2278196EDE4293747E86283ADC771B4F3BF0EFFE06576F0712 - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 372F5BCCA5E04E7C0C22AF3E9ABE780FF4E0B9020081BF5F30C210447668AF6BBB15742828C503FE0E06C97A7D6B86 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 9066FD3299F983A0A51AA38BCD70109C90DFAFBB097B7056E653589837B1FA6BAC706E4C47BEA5FB96549F65A67598 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 108622616C3D3E8C42C6107D6E630BC4D8B793792345DE0C5C91C09FC009D06AF3CD275C0A6C564F58420ACD25F1F2 - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = F51AE8741BB82C5EECDB494B1C625145CBB72EFFD7200E99B89BE333284CE24F10DE5BB8668A00CD630C9FBA24D41D - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = EE69E89B8C0FCBD0C98D72130FCA6D6275D6F6D3D0F4FA88839C75B358489C13A92FB3FD4E7E504B28A169CDC7D018 - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = CB46D03CF2B6537EB2A0E1453D966CDF325A9373C46BD783C9FBE2FFB7C398A5BC000A5B2A7B7F1B57D08A3DE6D8B7 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 2AB2F326BE0426B7388BD2C7C451F0522ACACFEA3A4DC337B900F49C4EF5823E84B576D85084997A9BE7BC6FC0854C - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = D8EDBD01F920A7B988A561DF77F5B5A6BAB460F4707FFA234C24F51F24CE8AC6C503C528CC4F2B7381FCA10E68C688 - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 4D8FC988C8BF8D8D5F5DE5158083E6566F73CD33CF0C59F0D8804D46B695BC83FB11C5D8EE651604D0EFEEF5FE3E08 - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = FD24E11765C1556D542E0CEF5BF95DB75CE1F20D6BF48850C4F80BA49F6CEAE76B6720FD7E31FC24A85AA8B39A0E39 - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 1CE7219F7380046D6F1BE5CAB1AC1A4B58799E2113567C9C11A962DE52AB177BA9E22B1F536B954730FCA62656AC1D - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 498D94D46A1F4544F58511298EDBE09A81E10B0071BBF92630797AD46FF08E2F1327A6ED3C033A1E773817929A6357 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 3500972B78420A5ADE37BEAEB1959A1D5F89E1C5684454B415685B02B12EA5A521FBE10FE33CE9DE19FBCA4F6D776C - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = AA65DEB55D343669E12B2A8230CAA6C5ED528772E6AD3D441DA423BF5805DF4BEC8807FF9FF58C762BA3A3B6793AEC - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = D44647BF011AF3C7A39F0590EB84252C816C479EF804966FB3DC0C36BA6EF097A5983A3110090D09685185834EEBB1 - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 7F65332D7B839D96DC14FB7B7B5F58E615502352023A44DE62C04216A8EB13C5451F5734F7F858A5CE1EAEB6D11119D8 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = BE15504A0104660E39537D0CAB08EDDACA6D5192A3029D2885BDE0A313AF7280F605A4E08497BE72295F4196E6C33BEB - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = A5A02C1CE3016EB8332F01CE89ECDDDC9552EFE89CAC38E60314B0322E2238DFA05AC353B82D4D51FF0316EFD7FD38B1 - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = 3664068029067BF058B31AAFFFBA64FFAB0FE55D27A86706E95CA8A74C3AD91BE939F5FA2D0DD954505A84BF5B06EEED - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = A5EE864EAF074F21D031BE145A7B18239A209C35FF78E5CF420583EE4CD1CE12F389119E91970964DA4BB5123ECCFBAD - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = 39F6472BF1026464DB27FF18DAC8F430EFCC41E6F3E7D27761BF095A645BAABA18C6FBEAD8EA045AB80558B074A4CCB4 - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = C58C0F0E6D0B8A9CE15DF052E4633859B176CCD4F665BFF2031F9EF9E1C0D088F179C4E99E6433CFFDE9A0300DC02048 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 4A1197B82435CF774A946E00F5627014E409150A2DF1EF2EEFB25BA95F188292FFAFC43B70BBF1E3791547D2BE409989 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = A6E1A157F63791E4BF77A3F4A46C11C2315820D7C216FF374C15E337FDDAEDE9BEF06D1B5CF9A9D278FCA018C4C017B1 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = 183D7ABD1F7C7AF1FBFC6A886F05E4669DD5F268B2ED6E99A99ADBAE00FBDBF864641F96276475C1882FD137697F5907 - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = CD0C0994EC351CBD90F45F2DC1991D3F654ACADC7D85528FC1307293658D2312F1A82D57A02FC05A058B9A938FA0C7FF - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = A95E819DDBCBE32DBC3A2E20F2AFCFC9F40AD0CAEFEDBF97DED9EC6FF9F7EDBB2954AE40BBCF57F3115006C26AA45DAE - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = 1840A4C446E52ADE3AA2F24694FA71247AC6F3CFF6E1077B6EE758683CBEECE2118131DC605AA805010C0ACB00365865 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 981DB0BD0A8C231D03BC321F6EDE52536BB77A5C484718E5B497604E5B70B5CCEB3573FFA6DC6499AD949C682BCE6398 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 144C7DE3905DC3E8F338DB432380184D62DE08752AFB82FDFC730BD986E6A6E9BA9D8E5A005D9C73CF47F19E9543B941 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = 60DC5F04EC92272D36B900304385EEB35CE9C776B0F8136262F07D7F68736C77148CD3C52B39A21477D3F6D8FBF4B9FD - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 4BF522D015DCA85035D9DEB608FF3CE97D2AEA4383748DA312D8BA480B481FE0D16EA3B4BCA440049CD1195EFBC3E8E3 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = DD59A156D4509B1A79B75AFDD1518405B1664350F2821E3F35962033EF44798AF85AD51C055482F028DF64B92E14EC4F - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D77B73377E39CE033CBAB9DD29050D744D5ED225418EA82DA1047A3581C28C77BB860DF61EBA2C173F7C44D7B57184DF - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = BE29580C6F7BCC9D232F268F6328668BEB97E21CF1CDE68FE8DF609AC8E1201FEA535E4425C354BE6575164CBDF4207A - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 406513CE38A3A135495C4CB17C112960FB04AB01B6B6BCF631090E9F6E22AEFDD5444E5310754D595856767A3070EE8C - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 153D5A126557F57030D6AC4BC5F18F0F7578224421D0CA612D3951DA288A6D0F9E1B2510735EDE9CB1208B7772D8E13D - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E73BFBF8BD3650B2A26D24F70DF0A13DE718B775C600AACB503F69EDB1658DF53645F3548590CC65FAFF0CB6B7B285AB - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = C76AEEDBEED3992046A598DC0978FB8AB47C731322F5E759E47430AC3A8CED8F6D38FC5363DE43AC7F0A27D908317266 - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 2C0AAF580F52F3EE90548911CFBBC030BF119A491B753302296799DFA1910D454C47E4FFB613D74DA746D367C086615B - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = A528D37B2F774355F4872D9E4000AEDA1FB2448FB0DE6E3A7DC57A350E6AB6CEA2FC0572B8012DC29E46BAB0D9874E4E - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 4D4104ECB4E656BB41351EF294B88E385C14D949EC5C5C757BE3AADF40841082F763B61117950FBB8210836D241C3480 - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 4D1C23EAF6626EA67B51EF4E1A4735981D3428E87E5388308D1DBBDA8830C9930926439AB1DD92E99E3AD82CBAFDA84E - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = F196E21EF9D0D19D9F1A4429B49CC04A0ECA31674F9D99BEF71B48353A2452C5D5EB0EB5D85DF8E41534F3A5DBA23290 - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 8C962B03F6B0211076E7E09D0FAA2DA78440CF2BFC8295ECF093FD0B59F13D752C2CA9E312EBF38160EDCD6DB2BD7416 - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 35BF8ECC498172FA86E73131E2188DF55756035242CC26D30EB293D47914F2F3D4E38C43E6807AF5B52F572B610C77B9 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 3188823982684B8819B4D6308EB6585B5208672979FF678D910324C16A4DD9014F63721F7A25D47C8196216F8D46DAF9 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 7D8154A8A2C9D4476C479FDB99D85FFAAE0C666C6CCA97F0AB05323B7635C8520D3F3E695B54ABB4321812B8D7FC32C8 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 27E3EC935A23EB9783EA9200440386EB + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = E6D107F6BF53285BC286169FC2B51286 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = A756F62D8B0D9AADB53009E3283509AD + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 5811C9790A0D1135C0CB555E246C0F52 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 87A16F77AF05EEB7AB399FFBDDCCB76A + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 1F69B61D00D5D3927FCFB96DC31145FC + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = B6A35C549CBF0FDC909274E1492BEBEC + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 1C2BB0583735A2B001551603CC45E014 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 2D9094783564CFAC5DF23F45C2D8A71E + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = 76232BFC14C73BDA1ED66514751EAB03 + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = 77B4C51317D1F41F5C920536EC4B990E + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = 9071C8BDC10C019FDB2005E111040AD1 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 7D02FF411727612C6024B4CF50C77A62 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = A949F616C0BCD323031CFBACA5D58AF4 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = EBAF56EFA313251EC91808ECCCA319A1 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = E2C5CE8C968B79EE79D53CCE2C37566D + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = D2AC7881EAB3E7B87A4BB40C3EE8BC9F + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 56B5632E405BD430877D7CEAC05E326D + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = B65625FF4CED31EF137A9E1220E5290E + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E426D802AD46394642A01BA86C100A98 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4FFFA5EE91F009742335229F34F47895 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 26C694E2D5B676C0956B5D932022EE71 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = C5F84B049435E5F01D88FD29B0927959 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 35EEE737B5B812C9439C16C247AD54C2 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5CAF53E8FA918EB3CF68E088479490C2 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = ADDDF897725E05EC2434C1FEC467129E + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 01BD9A96F15DB27CC2364D0EBDB05AFB + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E4B23641290A3398776496E85AECBEC + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FD457EB289EF20B132520A7E580EC90D + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 788757696F6AFF760F244DAFDDB667BA + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 68DAFDD24522F18F87F6901DF7254E00 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8063E67327A69D0780EC35AB2347AEC3 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 60A1700E7AFD01C2FFEF99850DD8E0E6 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = D7B9D631D6D5663ACF2FD336E424B9D45A + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = 2A963A46D29E878AACF53627B337CED825 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = BEBB22F934CD66AA5F66CD1DECA3B15B07 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = 7A4B00EF7A3D731011494D7405DC466045 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = 9F566EF5757708424643E5C8D108E969F8 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 2AABBE3C7879EE89BDD145CD79278B8B6E + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 6343261560787F1062396E5D5132CA7EA6 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = D07858A171EA2C4223F3A47E4B06D57D4E + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = 1C892FDFFE7821844AE5C268A9F8B638CB + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = FFC8E442796B6F1AD14A3684F794E13BC5 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = C79E812C2CC3AA074867D14E6A9FA0F8E6 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = 89F07D41EB1585E7637E8D7074E95F71E7 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = AC4ED87C16FC32ACB8F5604C3118FEB06D + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = FCE0C434795B91FC4EEC9502D6179D1E7D + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 7A887B4EDF63C7B7F04CA5CB4858646DC8 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 49C02FCECDCE3F84EC9FF9C31957D6DA9A + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 89C8CD2108263F6F4275D5B283BABD0FAD + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 3488158BEACAF69B3FDA4CE6020F70BBD6 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 412AE55FF0CAAF235A7B7431D010233F27 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 10123A52F934C48BC91AEC8214AB2103BC + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = AA180F47C478FB256A123FAED71DA809DE + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 9DE00A6127EC2AAC9B35067A1EA211CB77 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = A2E71B9BE526C3E0E078122D5320E044A8 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9CA1C25308918A4D211724F38EAE2D1A12 + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A58AF084302512620E154972166B58E3F9 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 6949C608C4D412E734DDAEADE95B42C90F + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 522C9802C6284A21A3C706CD570AF196DC + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F45844887E364BA1F038AFE0FBEFEA7670 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 850F7944C2AD71BF694A6ED52242F6B543 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9BAE744E648A3A95E0364DD87E71D47370 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 5754702ABA2BCA396560166F2194AA703B + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E265F75ECE42DC9316D6DF93DCFCC09224 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7441839F91D4493097D5855346E38B254E + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 1F481665AC68E21B93DFCDB5C80FA31B29D7 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 1BFD3B18F5745EF939C848A8262497EA963F + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = F78A19BA7E6EDCB617A89C11B22BA5099083 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = 01002C6B40E4C365F379D1D8BE0134CDF6CE + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 0ADA925283C22F1E46605D7128F460898FFA + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 82ED1F61249F6FB23AAB8CB1B78E9B8BA200 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 54B094BB3C0F96C0E12A9FBA4CACCDAC03F4 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = E20CD2BBC242B266FB56351C7FB92DE3EB90 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = CCD346EB167CF71534C6903DB10615CA3793 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = AAE7978C95B6FA5E7C2535E65150C2116803 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 3A5827C24AC76EFA4723F24565C67394097A + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = 4885B346FC14824E415E3FA347B6737F7AD3 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = 91E6CCF320242E8B353F5AEF032B261DDC9F + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = AC617F2C2306E965BE2BBD5A7498F04CED32 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 49DC69AFF1F2AED79C245E7249B86D3CA5C4 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 423A6C8F90612D288E34C20E9F0D157D4007 + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = DD2F95E04E2A6D929C328E3F385C72B98127 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B7B1475D720220C7359190228C9B0CF81FE2 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8DB6F7152EAFECFCAF745AFC3EDB009E88CB + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 83D6BED4DC6738572BD4AA147C45BBEDCE5C + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 877A2E5F114FE154FAF88AF3703F817F8F56 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 7619AB42C969750E915A6E11C461B92DD6AD + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9AA7E5774CD4279E75643FA076A79CE728EB + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 745207E700F6503B52198A179A35A52D10E3 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 197DF9CACDBD74D0ED91877CC16BAB3F23C5 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 7805801AB553E4F4E4E6DF09D880CFBBEFF2 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 90562BF1A4828D75E5A68A6D58222A69C284 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 75BBB2E14EF5E84034AFD4715B44C133AA74 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E04A6269029E24043D3FDCF27BD4B0BDE504 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9B8D53CA9EF1090BF47844F62422156844EB + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2D8240B8B928ADEA6AA39DC6B640062B42A1 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5A09E2F786C3912DE12CCA3CE3952E8E0488 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2E3CA8F45AA70B92C956616D97CA3200F2D6 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = 7440035B214803A82FC6063F0502DF7767753F + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = A8C25BC494735E27F366D269E19FE6777BBB32 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = 7D0917208D5AB1B13E06EB93B66796DAB1533A + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = 66632E20A04312DE8A2EB79E7D5D0B64990DEE + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = 0CBF65511ECD34BFAD3B2A7027D176FDA1D487 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = AE5E331CB7FA6B9FC416980967AC599809ED74 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = ED06990EE2BBB525E3043FB991BC5848AFB36D + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 149A1CDE61EEC6F4ED0CAEA7C57605182EA527 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = 3AD539D62E8191F61141B3DEAB04F04B7F0C86 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 1BC6C986E7B672A12ABB6E95ADAE7441AAA15A + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = 720FCF9908C3A1BBD1ACDC9A20F4A9C96B1ED8 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = 1021F6BC8C29BCA6F7657C44C71EBED7E59BF1 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 4F0F5B2506265E0C2813826ED1DF1E2DCB110C + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = CA6894893DA3CFEA0B658FBE7A34E3473C4B89 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = CE209168215BBF8E4279B325C03A5E49EFEEC1 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = 164B133EDDF7075DB6AA3E98BB8FC6EE1E064D + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 5B0F776088FA936BF3ED7CFEFF003ED651EB3C + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C4B0F6CB1A96595D98E191437D4D728EF2DD8C + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5CA9AE253F9924A5100F5444325B1ED7CE75BB + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 072A87906D7EA8DF3AF61CC8752E18952EB85A + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E0B972AE0DACECF115FA293DC5B0AA9DA68F3F + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3B460189F104E5AEED7089886DD702711D9450 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9B74B0732969625745DF04D08826939710D930 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 92E9B1A80E35B5DCFC997E34FC8AF2914651E1 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 002497B01C25618456B9B3CE7B0F0EA00FED11 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = F0DA00E17CA6E01EAE13D6C15DC6E525A5C46B + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B0E7BCF6384B1FA64D45FCCC19A4B2DDA7E8BF + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 546C1F4F0E747E5B30DCEA915D4E181CFA8092 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E576AD933F891763A9D4B06C84D4ACD981D7D2 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = ACE3591B470F614DF4EDB93CE7258BCB3DC2F0 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = CBA8B7671F55B70518F5C5FBC121DD4060EC59 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D77248BFA8F03F053F562F84EAE98F41FF2091 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = EF9E54D6DB12E748B50AC3E6F3A75C8BF25893 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = 856A79756B78C88228F198B5978175FD3F61B094 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = 233DBF3CF126BFE01C3BBC9C0084033D9055ABA6 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = 37A33124F4F423930D7F123F55AD0EE789279F54 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = 0D63F94F6201A5E912D490C6C163D3980C99AB79 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = 078D6E1C018FD7026232CB3DE5D54DD9921D4AED + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = F693F91271144DDC6359966D346D869803D511A0 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = CB472BC5B0E9F503472E95E1CCE46C37A1D5520E + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 65DA488731361C58001963795B89D727121B20D6 + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = CDBA0A86C5839BEAD029376F1636DF40CF62E85A + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 9FB98E0A8427519FC1AE9F9141694B049A4F32C0 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 5A5729D5D8639E37B14BCD8504DEBD7BE9E5D7C0 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = 1AE24FF1DD09ADE6552AA999FA8F0AFDDBE825A2 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = A7F21E2E0DBFCB89AD9B8D1FB0E7CA5E020CCC3B + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 5F67B19860CD662FDBFB8609C11D25A60F861688 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 2E96A6E1681D88C8E89B360170AE6AB3846CDEAF + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 6F80C16BF49BA15FD7B999E1B95AFB00C806C7E8 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 3CD7CDD0D1098C5F5D31CC6E2B557F3BB99B43C8 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 57AFE33B09E80AE0DE9178C380A738CF677EF5F3 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5F80C505BF0ED641D4EE00003411BEF037E45D55 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 09D0A3CF53082BB7D0A13938A0A60F560D05CB66 + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5C9D9E90C3AAAAEA85BA3BAFBD022AF09BB8E27C + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 96F2317982050C141FB3066D3E05A4F6FD3FB871 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = F95109476CA03C2CD0F5A60D9B53F97ED78548A3 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 352A1959847117B59AB2FC0A702694819A6F0E50 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A062AC7C6FE867D2E47F2EE7A2C07A2DF2D22E4A + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BDD8C7CF3D9377FEC1E551254F2CC3698B6B2B56 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 581C4397D41E4FD37EACA2F69A4FB724E5808F15 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4CB2DF524180ED64B67AA3E681D11542150B030C + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F4D99B8CA49E9398B9EB71715C59B07F18A138DD + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 837DB6F28B682F0F26DB314200AA4BF487B9E051 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 564E9289F44B5EBA8AB87BCCB39AD24CFE406855 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 1DAD1095388C4B8A841780F65626B011580EB7A7 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 707249314A5F867F31AF06EBB74C0F0F55B06B7A + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 4105D92614E5D31B24F96F7E945F1AF0C908AF6244 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 485C3E356BDAB3DC7F6709B8E9CC5C90E0F40A3DAB + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = 7D5B35C577D9AA03C367F2AC91034520E489748B8E + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = E2F1B18771C525182F3F1F336A10EF48FEECF43514 + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = FDE54BE8E591EADE4990A8D8F8BD8B78EFD6B1058E + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = 0FD7EE267B79E5C0B65117650F86260E6165CC09E1 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 2FFFC3B6E489B60016F17F6E00740F7C9527F49F3B + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 90469FE62A412950969E39474EDC0074E9C6145A59 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = D2A74C1D0993C11059A92BF53C93722E7FEB8FED1C + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 52C2AB131CD0936394CADD6B1E7668E89340780A64 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 755968200B60185C3C5D0C005DA4BC0A38AD57EF01 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = E7C48EB5A4AC84F4A036EC72AB9C74881CD6838BFE + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 29F998B1A2310764DD53DCAB6BBE65FCE93E6C8112 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 29C373CAFD5320AC8CAEA3FAB1826B0AF2847339C7 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 8246E8975D891B1BD5F62032289C2BA6EF9D567667 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = DE974D7638BAA783512AA15069BABE284EB8A98226 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 0D691B7CE398018965E778D1AFA822FEB65CB32990 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = B546306D7C5A69A1BBB4815227690B04572DC3094F + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D566AB39DF18F71B88872F7A199A6C80C2FA1422C3 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = D12198A03ABE18EA0302844FF36F7D2074154ABBC2 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A71363EC9760E12BA910EDA9B5B6A7E66310CD334D + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C345580CE5C1D9A9AB0E2995862A0DC7F9C53522C3 + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7B87A082CE9350F4248C839E129BE993A816BC2B43 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8317318FDCC51C6269356E42A230C27A9AF469E6ED + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E649C9F373CFC8A942B7CB0339905F0AD42EF3027D + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 38DBA6AC87A46F40392DFF78FA6CEEB2C6F03C0795 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7098A4C24909DFE5E1B9BDBDA790E3FFC6F68D2FA4 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F2A537C7641F20D37DA9C4738EDD05FE884CDFCC93 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 30A645177BF4EC0C3DCE8B83CC298717DC4AD863AB + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9799605F731C7FEDED260D95F0A8EDEAE24A6EF2AE + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 9129AA9AC9392843010EE0F7DF53C3804DA5F41969 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7B4348A968D222FEB96037B227D6CA1B1211EE78B9 + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = ADC60F74A395A2BD6CB66D3C1F04E2EBD272750F33 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = D9E61ECB3CA1225D36C29A8A44A9F104618BECBD88E3 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = 0E1B607B5427683C2D0AD36F9DC510F89B98CFB91F10 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = C8E0B92D6660A5C06CBF36436B0BAB0B45C2E0758A14 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = BACFF85F80FFACE1A7EEE9F3342AB1852F8D3A364EED + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = F790556DFB04EA1EEA0C5F506CF339ED5FBBC5A6CF23 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 918C5659159E82EC39D9A01AFA6D3B678B37192D133B + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 05E514F64BED52444580C98F714AC73FFBC1FD65B7C0 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 384D5CA29BA841164C5F2458123ABFFD89EC3E99E586 + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = 0D9A3A6FFCBAC2F5F990767921E1DFBA58C9479A8602 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = C312C6FAAA00FA1B0603F093072592C31359AFDAF3C0 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = B06A2F9C96B54FA5E7B502D84A518B66DF0F83268FE5 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = DC29A9D1C341EDFB6E6E68954DD2F8B65A575C0E299E + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 23BF3A23FCDA0AE04062ECEE6C2A10F5F99F0D300404 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = A20D116A45AC6E58B948026C150E32B979AC563AA272 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 82009EC61D29718C25315526C9E1E416C62FFB9B396B + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 73599D062BE994BC8EE72114082679E98D10FE1606FD + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 21CEE0A0725DDD440C245F360FFF0EA03CB1D762970D + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 7A368FB92E6FE9C606A7DCCD72576AE3CB990CF4E21B + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E933FA9E3F85635CF35B9111F56E28E51E2952628A2D + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = DC8DFD5C02F298CF25484B0B4AD56EB616A46A00FE53 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = E5A808DF4E611B450E6582D9AF9444E927F45F57FD5B + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = BE6A49CBA53DB8C20D90BC8F9CFFF7D004107F00CF33 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3F823A3084A883F1BFE68C845244C7281C738158D96A + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 67672566932B0E71E0C4CD469B3689CEA0227A87EF7B + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 34B493E04D8E7CF48D58F5912F911E5CF548D225789E + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 728693780345D7BBBD2B8F1EFD8AAC477FA7C90BBD94 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 746F80CEA60688688AAA33BCEC2168182BC6AE92D537 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D1DB755A5273FA97B60F73EF09828672A0A9E123C872 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = FF54FE29E5B20A94022CA78572CFFEC9CE672C423F0D + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 197AFAD1133E152E029E55B3E6ACDD1F194EAFD9AD7A + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = F4E04FC1C30E3BCC1A7C6539F5B5226F7A61785CA2B2 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FF3EF917880F727A9958BA3151417253B3538FF71EF2 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = AED49FFA6EE595835BFAA1A1175D1EE8D2F1C490AE59 + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = 400A138657EE4529E2D3147ACED44FF74111B1433B0DFB + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = 833233A3006E974F6C88FD4A563EDFF14050E71F9304F8 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = 15608E1AF67525FCE3EAD96B38F14796D17CDED230FD24 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = DCDA34890195C1226809D65BADC442C1798B044118C4CA + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 0E5134391EDD4A581575F5370185041A089641687CDD34 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = E6405946513F3BC535C8A670837A35A669090D3735FD85 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 4640696EF78A50BEAAC14AEE47338944A921B4479173AE + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 4DB9B3BCC36EE7F46A186352CF2D29612CA89CA07C124F + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 23F1D2034C3B44781C819B010881D1A72181D20F6891B1 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 5ED838B7F5A934AD8C97D2C3C102F1C4259C30C91D14F2 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = 07CF0EEAF22AC7E1EA9B58344DD71737DCFBBCDE39719C + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = A565F42CCD176876FCCFB2696FD5259751855617083EF0 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = EE50BE7D903F91E8BC7824E29CAB984511783B5BB04598 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 2EA5919F4899908A06B786D995A7A04C716DC6AFB1E1E4 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = B20DE289833F9C7AAE501F05A1E346FBA640694D0C3A61 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = ABF09694B73B0FBF7BF339E7D405FC13D815DB276BACDD + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8C61E91987730C2A097E80FFA2ED4DF2F46D24DDB176F9 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 89FBCADEC82A2AECB541B296D7F9F7F8555A7B10B3B023 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 963C2F79446E7D61C4F9C044AB0FBAA2104EB5B15915B1 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3A616532EB8D6956B20ABD2DE174815EDCD3C67D579E84 + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 74EED507CB7C310C55C34B394B403C5726B5CF6D145285 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0C3E0F3903F3B7DE8486AFFAE6930D9C9017C27BB9A70C + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 38EE7A7E0D058457D72521E0C566C270FDC09818D4434C + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3BC9321F566F5CC7A2419690057C39581F7E31E3BCDD4B + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 8B14D55EB5D9B22917858049ED04CF0B9451547B73A3AB + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 26F09618B02322451486C78F4F8FB4F7BBFFE7A56E964C + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 0BD72D7D715D79C9209BF7090B9F1B99C50119925B16A2 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5614BA2F74F32B6330F19F51B1FD8D718003AA08C2C01B + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 01B65D90B6952B6AF4715A22D28CE7311BDEE1F303EF7A + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 79736B2BAE0738013CF097802CE1C395ADD576614F146A + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 358BA5EC275AC8B6E62CACC38C63C73DB60AA889F57296 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 0477629F8ED03B06917D2E1FDCFB992A0BEC12709A6CF2 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = AA3FB68D3214EA765B9E2C50EBB7851BC22A0421586168 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = D2A1A546F04ECA07E08F360ABF0EFA99D05B766B5FA6B5BB + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = 67DF4027A76028D65994CA3646B8390720695AB9063CBD97 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = 49F7E478289C6B0DEF64B4F194DD65FE73A44EA88D79922C + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = 145285318A1F4A0065A1F3A08757A366F5781D0D838F60E0 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = F80AA94AF68A5B59C6070897454D10A689DC879CAE29CC54 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 9328D55D3BB89B0400FD97D99AC700BDE49D8597CFD940E8 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 7D86739C905AEA544CE5649404D14DD3659E0AE82490933C + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 87D5E40E602017346E3A6F061DE85CBCC9FC11D4EE99D7C9 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 10D300B146EDF93298F48E387529A017F133E18DC828DE11 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 954D23A0DCB233F3C240FF755F96ED16323E2EF762B078CF + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = B440753E14B36E63EE259BEF9DB0C5D25540F5B416BC8DA5 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 4920AF5BA98AC9C115D9D799A5F80897913B9240C3C375F4 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = D74A1FC45CF7EE955F7CC8F75F9B773B9D70E4C99A66AAF5 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = A142564738E6C5B9FB2AEF3F2382450D4414CB974174911C + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 5ACB3FEA98FFB0B88CD9951FFC5E6BFE8ED1127DC3E163BB + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 5CE0343F0C5CB7C74BF21D9F9DFDF500274F52EE5248F781 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = F624C8F722064AE3E479804F673617B88673400DB85251F1 + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = D540639F199000250478678EBD65E0DBDD46E419F591B1A0 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 47C6446E7334387C4422BFF80E61B6A22B03F0EAE10C729D + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5A1FE874BC73638C62795F5E2AFFA5F5B93865A4B3551D57 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 65D222D37B4E381B6AA10D409A59B379328A54184396A435 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F54838EDCEB51E988866BB56973F2E6D1DEE0F0D33307B98 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 065C36DE58DC161DB2F3D36B0D1063FC47FFFCEA6D57A751 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 91B89E030E0A89401DE212CCBB3464287B4093C6DE9EA96E + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = BAB7D8EED315649D283D872F85CDCA7410B837BC456D600C + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 9363AB1248E92AC640EA22BA060C8FFC2B8D2F8D46BB48BD + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = D9478EA800DA2E1587BEBA1C4373FACB4537DAD16EEE9D83 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1A989256B89406334AD153222A4BEB73DE6232774070C7B7 + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F130AEFD87B43F3E83F2867D7B3A2F393A43BC61E71C097D + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E4EBFDA6E179A7CD3B21F8F8CF92D8B9472752153751E8DF + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 72B3A46EFA033785D1978F6B2B8E0112487D8F83A5171073 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5C32077FA8D7316929B6E3BE4C42E92D3C1F9BAE26ECD1F8 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A3F9AD281D644BCB37B87B99B051B49A8E9B3988A533C17D + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = EF704DC02F24CD293A14A492E550880A7653B0C19CF47EEA6A + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = 53923A774D8A3DFB30D35761DBCCFEA18A4AA043A859F42083 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = 171812EF91212C5C56D265C429768D8A78415E7F97E840F65B + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = 4912C42F94895F4131F6A66EBA94AE5B5ACC62614F8A081C63 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = 2EC8F81C8916BED78EEF61BBBBEEE53232739B0525010B2A2A + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = A994A3B33749E8535CBADB5E92ADBEEAC9EE45FF1504792A5B + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = E70C0606BD25B0DE10A82956F7BA3EC380B3405841F1CA506B + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = CD2EA8FBE95475BF54202A2A6D84F8C2D4FAFC6DA5B8A8805A + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = FE0CAF80622F26913BCA964610713E68B11756B7F2C70AD002 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = B8718DB70FF8E76E922D822D934A1641440409F776B8A6B83A + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 5E558301B4F5D0BD4E269E81AE4571DD84FC7DCCBFB8CE7590 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 8CAE9417C39EEB2196FBDB4CC0A249E87F8DE81AB2ADCA6CE3 + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 3687C2AA93E27744136181AEE188288602DA99CB6CEBF46EB3 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = BF544D47F7DB3FC40D8F41D3577F375B6997E80A066EC5BBD9 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 36E8340C6866E6315659A160B8919D1EDFD0D42F09D23FD008 + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = E32E0B49626EE6A75E346219B2524C0439F407FA40FD558E46 + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 78F234732CC1371C0A5480B10AF1BAA208D820EDFCEE4CEAEC + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 6E1AF7E5764FA845E3AAD97577C5F79E0A7ADF6E3ADFF5C1E9 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2F0294C47384B625A8F54211C0F430E05E4A7276169B9E8AA5 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 4B3B6CBDCA6437FCB5F57D81C43C650C37A0668C54773CBEB3 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 84DE2D296735D2E1A2B15485B682582C7DBF91DAF407643710 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 17B5B96C1D3A67A1F7C79C55931EF7D956F332469DF909053F + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 905460AF85A270CD86058DF8F19A7151738DED53A7DDAA11A6 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9E10E9992413A5D2237F593C58F7E3099D063E27F482794F83 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 03F75C524D672373F84D5DD8BF825F3673F4829771AE2DCB96 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 4EC9BDCFBF3B105BDE661DFE3BCE9DF1EE061FECE2594A0B15 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 909EBD70CE56D2BDCF2FC13B2F294FDBDF49D216ECDD09A790 + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F610B46308668D0A8CD8CF852E60F8A9A8DD77EDC670E03C60 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 70C9B6D86A35ED67CAFFC07D2F3923651A2BA46F72ADEDD1CD + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 699BC11544568818B48C3A09CFE8AE7F2FE4B452642A5386BC + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = DAF42DCE39D2488A9ECD2C59889011C87043FEEB3497E35EC0 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CDA3251900C9A03C8604DBC486116D248FE5E4FF87B1A85B9D + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 55143F082332129B2229A9922939E0C6397ECF69579CDD5ADE + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 893F466A07839493CD2215760A754565D3295F1FAF766D0CC863 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = AF3369293702BB2CFE0B0F51BE8E64035A170DABC1281A89E265 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = D922B63C69836C5C5795F51FF0065505F74389191814F14131C5 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = 34D761D63C925C2B55D8B18919F82D1C18FD6AE7928B6EC470BA + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 55D5D2347ADD488CCC188D31BF09FC5C812B57FB5766648AC3A1 + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = A0DD3A51085C6C528F53CCFE0AC673E74083406B20BFEF914061 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = D156B1BFC6A83F59A7A56A46BD636FF972169540BF84B0ADE248 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 295DE41B6A23281FA45CFC3C51C505056D20AF6C263FED843FE4 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = BDFD03B3C1509A19D47655265A4640D3D4F98A6CB83DE52D593F + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 1D84FE63AD07C81DD122CB7E4C86A846A284ED962A5790AB9C88 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 23917033F5AB9197F341105A368B51DE5856604880E50E37EADE + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 7EFED57A1CF5B66518F3B749A7A41C736304249E95D7EBD2BE0D + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = E829A944603EF61158C7C560A5F839064F06B9B9953EB6B67384 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = E38F80E53B795C177302E6733E478AD9025C66C7FC7D67C5A10C + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 9A7CDCE9B3C04EDA923E7FD51F136271A824B82FB7D844085F67 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = DB0DE1409DA78C2E75DEE3F573E581828EE81CAA7ED3F200F415 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 2257DD8A35CDB32289870A863D3F31C1AC639E4B76F1ABDD7336 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 294C4FC20BED4AF7366E649F141EDA07E980139D0EB47B1843F2 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8093D9B3E94C6021833419EA0EFD8C2EAD3984B4AA614B524465 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9A61A86087A6A77F686858A833FDA0EC3744FE9E6A00CE33CF43 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B6B1F8E8CC67B7914729C2D0F7A4E379038BFD20F574EF8150BC + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1EF346BDD1AEEB90F096552D587E4CCA981A5AEFEC212310A31D + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DF9AA92B2D4C64DAF0DAC45F8E099EF38327AB7ABEC3AC9A7540 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = BE51DEF15DA574EF2B15D88EB850C6146F4E1F7AB5785F795068 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 75C4E178C414DFC60F84857490B80197FA7EDCCA321F76C8C3CC + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A471C29AE0BF40B078F47EC73CD240CAA788A7836DC90037FB93 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C101CACC8A72E150FA42F03C28F7DEA1BD5FF80EC2AFF0FEA54C + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 72184586A4DDC735CEC80FBCE3C8BDFAE18EEED2B774DDDEFB1C + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1E77268F4FEC53F2E83A2A6035702D4D5240C9911B182E75819B + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8EFDFD609F9CC8589FCBE955C4B061DCAD4AE83AC269385E28FE + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 77B80C9730E9EAEC7AC89AF6DA43DFAC6F3F858E36A0A13CBE87 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 46086E7AFE785638CB08EE0CB6E08253EBCC9D4E0EE96D6F4A55 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2DF74C978A8AD6D7B6FAFACD5E082756F7CC97C8F7763178C37A + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 70CBC7816BA001A7E26449230C8F86868408B3A7C35508D7D25F8B + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = A96F243459824D47A8CD1CAFC184954DFC0FCABF902A53525C7AB6 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = 3C76A55E1D63C291A4BFC20D88048A8A0BBD844E80DE3DA690BF45 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = AD0A44350410E4DE0DC434D7FFDA19A2F071C157A7E4316FE147C6 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = 6CED9F438B102574E7AC404AE856ABE35B51FA80BADC17B21E1AD2 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 0CE5DC23A594AB447AF115C0BDD89E9D6AE04E9FDCF8C3EE388D7B + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 821F47B30FEF6E682DD2D856A4C32A199CB9D291B937F598AEE9B6 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 7C4A294C3782344DCDE5147767702CB389E6413F853FDEF5D839F7 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = D0A624D16A6B11052364888BBD7C27DA120B38E66F382021733884 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = D10B9FF967C7C0FEB40582F08769F76882F1D56619841BC87F4503 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 53DA78FD8450174A19E31609BE2F1357308E93123544210D2A8E76 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = A2DD5DCDE4A41D1448385286BEAEADCF19BA82573CBD77D149BDD0 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 4DDA9B223848C6A79ED98A2A7A443AE950F4A8015C39FE7079EBF0 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 8271A38B970AAD6F1E415821D35B97803274EEA855AEF091E63548 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 134DAEB3220E76C3B4A2A1592ECEF46B3ECA9CC58EC562A0FDF4C3 + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 782D619840241B9E6F821059B912F97E4EEE55BB641FB35CC03671 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 7E073B42E876AB8B7917C0FEA45B449B6351F03D743BB2721F3CD3 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8B8AF2168CDC3A960ABA5CA3A61A732C9FB89D6FFC275E8B29C97E + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 7EC5C4756E9C6E8DF41E9486FE8366ED872E140260705C58C192B9 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = B6CAACF30D55B6F61E20E1C31B6AF28AE85F4F1A22FE75EFC2CCD1 + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = BE80D79593A6AD4EE3BE87849EA5497420490C1FCF1F3E3745B5EB + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F1D3EF147DEA7CBC3EF193C99A613230E83E5C81FCDC09C0100718 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = AB905E9B2ADED1806549DFA3BBDAE0EB285BA2FF40BA498CD95007 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = E646205A506D9C0EA4FA8B4C8D3E7BFD1086E7DF73FBB76FA3D057 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = AAC312ABFA6E731753CAF131149CFCEC5A81EC2869061B626EFC31 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 85320118C135ADDDB1F8A0ADE2FF081DE50D6FC486EB806133AA3C + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 58620FEF596B7BE754A19CA9FB8E5C725AF2D8638114933CA38F20 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C9A4F9AA13810067644D091258981A3F24E98D6256952024A692EE + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E9CDDE2BA755F98A81192FD50539FAD5DC29638CB6533790D8FD12 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = AC55BE693229DC05191087ECE239056F519A4EE137FD10C28307C2 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8371BF3B769D376F401DA1754D5F173AF5C5A53E7455D4924542E3 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 7A83F6AD1A0C309C4DB3DA89715BFB6CF7600929087E4E41453702 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = F892970293B06FE5B3E9A7DE09E95AAE5FF568C8BE77AC78580971 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 107D349285AFAD01A80CBE77E044EBDC7791453E8641A83D22DC6F42 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = BDF399012242BE08C9209FC7A154DC2E69A07866F057AAB7BA815C47 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = C56F8DE591A31E6680312A268399AA03C978D301324E5A5A58B21FA8 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = 1029307EA61AC5FBCA419CB14E38A94F254D667443879DD792B0C0C6 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = 6904156DAC0FFD2A3DCE9964805835DEA3EFDBF5CAC40C874711C12F + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 2DEE5C7AA566EED1BEE3EB72BEB030F85DB378AE287C00D2E2EFFCEB + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = C059E82C1816F16A5AEDAD336715C18F1DE361024046BDAC42617596 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = B4C3CCD5F2B82DABA556828EDD77291A0AB7B022B61E4034CFEA632B + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 5DEC2672424138346CC3BF912E7F5728DD5C0DB016A9208F20B32124 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 741F9C339F46BCE3D1E0E2A98E53E608E4BB93E6CC1223940B805941 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 7AD8AD02E620EEADBC82BDD5A375924AC347FC58C0BF6651AB4B5FBC + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 1216038C968AC55F6B8FB379D150C1FA6743A69C4E8DC4645AE92BE3 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 74DC1A6D1989B1D0731166147381F1CA8ED7FC9574A291E2B18B26A4 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = ED7C18EB2C8198AEB4BB27DB754DFFC56CC2562BA7018DC478E9BB69 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = D1E9F0E1F69F4990256F113958828D837DDED0E6EB4867A77975E27C + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = A5321ACB93B427BE26ACED605E2591C02F70FA8C2D05C455936737E7 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 2A60D6ED48C48DE2933BC7B65D8BBB1C25CAC12A22D103516E220CF4 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = E9192F9D2CE376CBE7C519F76AB976B3D769CA74674A36E66C26515C + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 121DCBBD4A3414A0D6A7AD82D9526C6701127AF6EA3DF002B1F7147A + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A89E8CD098B515E64022994227E7E9007E9B82CD316943C92026C2B9 + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 801795173D1F26767477A4412A391FC4992565F73DC6101812797AC5 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0FB23595880A34EE4A702472222DC7B78F7D890D95171F9B2FECFA3C + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 56B5DD929375314600AAE8212D82FD3DA9046A87E804B37AA96A0AA1 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9D0F5A9E2AB1615463CD7C42927A8A746E4EAA0EC59ADF43D65754CD + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 3F0048EA3509E32E527A3645B4F596BDFDEE507B5FF68B4082E2157E + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 210E3A9B28CB97B28DE3F4A139EA03E3616104C1D2EEEAC9DCC7EC13 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5FFA69A8355EA6F29C98C298A02DF5DE83B65BCECEA6565DFEDEFE5E + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3BCA23733032978A54D6879D7B1CF991B544912696E32A8FC89FC975 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = BB1ECA55877C0342865A3482BF231BBD5F877DD59E45D0D6CA033636 + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 15D8483C2628A69816EFDB878B8DCB9E674F59A0BEB64646FBCC0DA8 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E4CCF79E70AEE436C3D9A42E05D8BF781BCC657D4D0173D7FB0943C2 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = CFB0052324585B3EED4A53DD260D39784138B0160A1696DB9245141A + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 938E25A823335BF73976906F74428023DCE88DDD69BC097E9213413D + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = E5C8B27CB932AAA36B8C14C98660DB9CF9B7A4D5A9A040ED42182F10D8 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 82FFE645220474310A8BE3DA0FF23817E0CFC562EA07F7ED0099422A75 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 932D708F3335883FBF33D1116368902B85347BECCB47BB915CB932A5F5 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = F900B533649743FA66735940F20306E9048B3C8CE6C492402181089295 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 766C8D9679AA543704F582FBBAC90E83808F53B6416963B74390A7B698 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 5EE583552649ED21E87D00FAAF76F2B4DE4B75A5B36F7F25B140F66D78 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 8B1DE64DE5BA65C415DB368BCB48E0897315CB7D1CADFDA06555BC7EFB + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 1F4DE12DFAC15693B8460735C1FEA3B7B3BEA3E70CEC442941C4A9D419 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = CEAE75AEE1F2D860BEEA0393DA1483DD3B28B2433D98876E12299F95C3 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 8408E248B353B264F3DD4AF4F48BBA3DB61B68A17F935DAEBA57ACF929 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 8C5F2C97163DECE7F2D4FC294D4CC5F0CA2098DA588E549332D76C9B33 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = B8AAC4A25A45BD3FE95AB48C558C27BC90129582C8579E3B00FCA31715 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = 858571598D621456ED5D18CBBA54E9EE53BEBFD51347F5DF5DAA621627 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 2777B5B295437CDF6EDF398C6FB2A9523BCE10C6325ED52AA88582E67B + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 64EBC4373942FBB827311FF32771314C6745825E5A2A32E65056ABE1B8 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = 07844AEDD8B09B9D275D088DC53F37CC3A3F70E9822F4E2CBB6E33D448 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 3740A592A10C9227B289A0CD1658BC4F54F564391C5A7F27B831E3AE3B + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = BCC889E4872ED8453D6588AE559952764E645F3E868D818845EEB06B99 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 8FA726124B480525426663F3871924D8D9AFC68DD6BCE84BA23D8610A1 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E7987E156CCF88201E48BE389421687910212408655F39132CCD52B67B + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 28D8BB62C31F82F1CD6743323BF09B80E0524E7CAD459886B3FC481A34 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 26AC12A4972F4046FBAC5A712F209B9455719366550AAC60CF233837FE + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 3B6254C1AE741B16E73608BF440E11EE6E9B578D70C8BB8ECACBF4A9ED + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 7B02FEED08C9023A331A905BC3089B222E1EC605BF1CB11BDE5AAA840A + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C8D8763A16058D11BD20A71E347F52ABF56E6A220BAC3E76F42A932144 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 261D4EAF15F099E68CABD28570E0296F99357181B2102C2E0EC6775A7B + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = EE1F23623C9984A9B21DF8A6B236F752BB58678B2530C7E5BBB2D5B877 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = AD9864A5A62B001D1629BE151C110363321062E54628B85BEF7E1C69DE + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4A4FE954C58A372C9E84036ED835EBD4AE917AF7DCB4D445B36FC64544 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = FEACFD02EB4F47407BC0FBEA7F22A043CB8E59CE13DDA7ABDFCE39B474 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = EE08659BD50882A3359148470B9131172BF1DE529AC9884F8167062E67 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 662AC360BD11126C3D03C3A8FC011121ABEADC6DED281F40ABE017F9C2 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 203885E4B1867FF5A18ABD4CE0ACB07F40F4F941FE2A05CF9A7C6E433C + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = D431E5E7C92B7A2A6FCB93C2122F87FEA7240C60573853C4014C42E6322D + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 3B8EAD9D67BA04DC0CC68B31763FE2BBB19D70C8676D92AA9E8B64A08DEF + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 21C446ADDE408CBF508B453EBDABBEE99B6EFD133874A77129C0ABD65042 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 6D14F3A685B476CFA9FF14444A3CA8797C5A054CAED5030E18A477994734 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = E7EE6A056AE5C7275B2F73F67840130DD4A0E9985AA3761FBB4552BB06B0 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 43D4ECEF3AA834F245509B883254FF454118266E70354A316F28775280BF + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 6E7232DCB0166736991AFFA834289E671A8132BA164C49C5DFB0FD231C7A + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 4E3B0FFD5C4317389B2DDA9791FE7A247A16C2067864E2DC9538B1C27C00 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 6D7E5071FDFBAD6A70F93189EE2B8E0355402C1AA962D10EC7DF89888A46 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = BE6915794A985BFF6687BD059B5E1C253F2FB3FBADA6633B2F1F93AB2636 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 3A8C7B6A622AF90D67A1476536ED37FE7C6E058D27620797E40705585923 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = C9CFF677F144B884F25073F16685032F336B38F681A26900EAEF97367482 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 211B209339122B8E74D8C8BB3CF5E1FF99EBED0EB0DD8F79F6FBDD464FDE + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = B766EF664874F45009DB32C68C546F8ED466382830CC66A4D9CE97C500F7 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = BCB9F193786F1E2E550F01A1BAC4F6F374D6A123AF3F59294196BDC1C9C7 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 64A3A96B7C05CE379E02E1E8A8255F8DD6E430FD8E871DA5D7C7C8A394BF + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = E81E68200FF336ECFFCD386C3DD9094008A2A99E5E83AB3EBD871D88C8D6 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5F5B29F8BB16C9BCE946D1C8B5A7F555C76240B1EC45C62FC5095AF01FBE + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 37BD8CEF702A743C5FB74C15248458DE7D7A83011E03E8A4F92EA2BBFA4C + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 948DBA9B1CBC84B92980D978CCF947072738F2876BAB6035966A73373133 + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 88E7FF8804EBDB31B06721A7701D1660D9C5CF357B39437E42568B1D2350 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B6078436188473901BF7334B46F2DD0FEFF1BFF41D8ED2FE3D7BF77B943B + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 9DD889B8ACE77181A13A23A4A8D1A06B28AF276421BB0ACE3D654315090C + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 0F1C2F4306CD2D2A28A63EC80D5DB62537258C832D137E32A8C99E340B55 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C4D45B171A4C71C0CD645D49B891474498B4E24E97EB0E7A81BBB41FF28E + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 42E7903E6DB116A77615761B4F17AF38FCD4CFC64ACA67A465298A6CBC06 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = B29854BC4BBD5A0F42BA7C3A4CB84CC21383D8869EB6C27387C220370810 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5481D8DE53E904501AF3919FB5680D48C7F1F429F1461D1D9A5BC9551C48 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9325410ED1141C0668390F284FCFA97BB0DF439768CEABF920B230C613EA + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = BF24284921ABB09D5ACCDE0D1DA7802467C5AB95EC23FA24BD87D24B7EE1 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 29DDEEED920B6BB1883B88BCD05AFF7AD9D6135F510EF9E0A4C9B40F3A70 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FF242A07AF4036F6E6929EDB4DFFD326F136BE29AF93DD59DB3C54462190 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 99FD1E2F1E4493AC05514DAE2BACB20D92FD5F083F08865EF5D87CEC1EA2 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 81D9E49E87809D1183220D411159A499BB5507A012D342A5BB8273DC3B2D1B + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 1DE23CF52705D1B63D6D0AFF0A8633615BDD4DC4FD6F5E7C7961A46A262777 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = CAAB1A71021F6BC72E503B44F8E85F0992891A23C71B5D77B0110B1B974E6B + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 1478AF549F768CCA6BF37DA6ED42548254723E600E71C250F5343B36AE47F9 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 3C43EE927EBFA67BDECEB5AD0A305D4AEDA7575D9DF6FAC41981DAC2E4B9B7 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 2A5A114243F0638046F814308C1C88DD8D558AFCF90303793B269F76AAFC45 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = D158A999FF04B392279E810F9080F05AA8F6DE82A065DEA39E37FD1F44253D + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = F77E6A824836F56212F2141BA6C506A4FE91D2EEEB2F0CA9B14388E74AB98E + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = C8B159434E45D20866915C4038C102D7A74EDBC02C1AD4BD035F5988DC6926 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 207018E92EAADE69F01602E70248A5049D9F8D7BC2C3BDEF360849D861921E + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 4F88EF8C22AE35E96E2D2F986535702D33ED40D61AE2A56D3BD2C7DBB3A1BA + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = A4FF360A0ABAD8F7D1AB53D7A8C42DFD64F29A709FA0876A4C46F12CE02E5B + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 1AFAD577FC4801ADF3297A4452FE9FCC291ECF7EBF008628B2EF610E7A0C95 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 2F15CCF4F41D03764CD4534648D700835218E4185C11A6E22E70842B53B451 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 72619E579A8B7F797330743D6411DD908D034D6F941880BE53CAE22C7A839E + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 1CDB0218241709FBA89C072C4750EE2B75CAF2CCE66B0ABAE61E53159A15E7 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 456EA7332A8226B27DC3E00A224B255D0E7EAE9008A1AE166CB2DD02F3244B + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 93E5820E1755A2BCA32031B5D7C61EEBAA597B000CE765401AE2ED064C53DE + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = EF15A8E443023B250AD971518E134AD94F3029B2A64B32259C3C02670771C8 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 3C66EE313DC191F888B76B2A7056ED3C3615B9FD6C2C8FEDFFA56271D69361 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5A7C90BD787579604FE072938087BF032CFC14E3AF9C3F622D9109D61FD5A6 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 288A3588C2E734E067A6B9E3C629ACF3E16A813CE80252B1DDDBBEB4325E25 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = BA35E48BF020EAC842D645511E3389ADB5A89B24D39CA39FD2D367685B2F69 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2E16C52C18D9CF9F4EC982EAADC4E319DD509CBA20AEDBFA4077C20B4D4300 + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = C0D2B0856A617586A837995E3ABFF47459F5632736AC04F05DF2B128883532 + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 54246B32F4100873AA335CEE31AE781E80F3F342863B12FF8716EB91A29253 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9BE2CD7070E358AB9E3C2B37CEDB07B5091B71637BBA9ABE5BB27503CC7AB5 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = B7EBBB810F9F9D260FA69FDEF88A03A634A8F92460AF6DD3A1E4073ABE8B42 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E9FDBF6C3DFF14794B8D524B756AED72BA8D89BFA2C0C2CF4FAC737CEEF28E + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 977C3CBDBDAFC663D146FECAD8B5DC46D048BAED9E10C985623DF0B81730D5 + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A97DF770C31F64BB2A3AA95AE0846F1355DF0CC9613DDBBAAD6207191EA648 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 94E6327206A3F1EB634371672F55D7DB1DE2AB22793165F434D5F94DB13384 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 9074FB8C13B4C986299909349EA65C8D1A60BF53935BB992D1275FBD6A6016 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = D2AA9B49F85302E5D6B75D030BAFA1A16FF0F95AD8003A0E6911AFAC98B0FFE6 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = C19DFAB8562E3C2DD3375F5376D0507E85820C1972FE66FDC55CD83FDCA70CD3 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 2206EFC7BB8516996DEC6EF6859635FDB83C668B3BF9D26282067A9655B497DF + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 604A36310FC89AFC97F7CE44B36813230DDB6A64244767F671E2DB4BAB6E5E11 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = F9550B631D91D644226F4A29D4914ACE798F3FB467287876CCD98960A89FE739 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = C826725F049A8F1C4FFE38EBD3D3424314131A53C46CC75F94E9E5F4283634A2 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 946A12DA616DD0A917DDB7F76B7A2D890B4DACAB9CEF7EE1D2296079C1CCAE3F + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 73173E83D6710CF60D0360E2FDE2F77544C2ED7CEBA4BA26649CE9ADD2C9C70F + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 8AD8399A1A8A6C2F593819D6BF4FE2D3ED97C4486EA30B70B9C8182004219F0E + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = C13E1E864830841CDAD9B12693B3C906E2501B775145D5B3CB3BFB2D440CC577 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 4D47B4F4CAC3478E47241D871EFAB71C97F049798227A8DF466DD5E7C8DD22AC + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 7EB72DC6E693F448E1D91FA71833DF2E5B558884173F34EE183AA322E18E7139 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 7ADECA63A490278075A444B65BFDE578744B4A26252E02E1C044B51A32A002FB + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = B22E2C1B8E58FF764ADD87959310B379E18FD72C40ED811ABD556CAF60478A47 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = E9130040443EF6B5B8C6BFA146BCA7F0076E84939E55066223EB6381681C7CA2 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = 22FA5FCF54505BEE0939A60FE1550491281323BD812B2D039A70FE047DFC69A7 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 1EFF644234D3E6B8DD5106208F9D261CA507136F7D3437B5E6EC3F7B0E21BE0C + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 9C53AF139F6600813D94C95DE3826B4DA177CFBE50D342105E83C89E8AF7A459 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 3461A2F33F5FC01DCDBF244C57CF62918F9C68100279ED65088B5676A6F34599 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9E5D418B70E763A16019B3A9740AE1686A1F6065D3B95256C385D2CCAD06E10C + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6E69E689EE76FE110F4D9FAD44D7DA80FE39BACA680CC27A59F6262C3E666986 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3D669BD1DCE71E20F3779786D30343ECF90A4126FA6D5145F4381D277532704B + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 295BF0D86B0DABA41A44F6B3E1160308DDFB6909B4B862A2B3E57F938F88DC5C + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D199DCDFC9F6BFB290FF62E868B8278A859112BB5284CEFD4480549F7689E310 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0CDE56C48BEC8F058DFCAE29723631A9A6905D4B2BFE41B438E107B2A1E8E5A9 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = DF5018202B6266838FFB8F5539048228C82B8142097AAD21CFA8F3F5C365AFFE + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = DED964D016763A9A89FA189D845083A20AFE1A25039F127863F88B390FCC5140 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 3AD025CD6831E789A7AF6163C6BD65B849B695AF89F597C9798D70A79A6AC3E2 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 86A80BC511D728FC498D845FC24FFCBF207A8A1AB3275ABD6E7D09093E3EDB42 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = BAE53DAFFC901F78F7C76EBEA51992AE405651114A146EB476BF0A5C72FB4A8F + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 775988064C05165E4BE8CCCB4BE42BF832C790159C5FFBB5C3146162711500D6 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C5B6CD0229EA801D5993A0D62A1C48471DB63E4852179F063F140999E3C52F3E + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D71B55BCCB6DE5A5D2BB060CACC4F6AA188192A8815AAF42C1E340F86E41FE9A + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 3F2A11EB565FE2562A9AA01652235421C9E23D9D700896576E6DDF421CD3A48C46 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = C27FB0F3358832248DAE16B9667DA912D5E5D61F23F90299FBB74CA830962FAF09 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 258B3D8DC600F107CF9FB2DCE3DD0978C3965099793C9B2520035F29167F742200 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = B55A34C038599CA164802FCDB5A4867D65C1803F81D79C0E45943B48F6695BC759 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 65EDBF675A60B722870F515F779733D95EC72159E7ABA60C41B6CE9D476F3374F8 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 34D0482A978A80CB95A489789AF9D51A14FDA59C11FB3B33355C5C3FE049E59774 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 4A4D9C075BB426A4B120ABA013110DF9729087ED71F3C3F65FE345A07D2448372D + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 8E32D11ECE744590173F687CFEFA778D63DCF1ACB040B7E889BB56BB89E4DEF254 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 60750E8CF4AB750923915FA0E1CBB89211023F83DABE34A30F88A4D922D6A63418 + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 24E8E3F37B41AB8D46DAFD9A03F742C0AC1F8ABAEF1DDE3483C02F1B531AE942E0 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 4F9E830D7CE22019C35678868F5A23ADCEC7A407A55FD8C1A69F3E2133600F43A2 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = BF0B5076BBBECFD555F38DA0CD5E24B1EF3A9AFF423E590764CDBE28AF45C78F5A + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 3AD6A363DADE669E2DA425A532AFC9939B7ED49B7AAE132F112B849CAA10EA372D + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 90C4CCF7CAC14ACA3524E24828884D7247C4195126C2649F6F1D216588E5481AA9 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 57E7172397DB7742DFBF030C390DBED1CED646501908162DFD79EC98D3CDDC3E6E + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 83C2F89657F886A09B4B331133FE191024020E24CF68AF8642F46FAF0D11B9729F + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = FF70FAEE2C06A4A6127A4FBAAD495AAE174D18DEAE7A9946C1CB3D8C357A87CB61 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 66CD53EB76FB27DF098C22DEBF2627ACA5C109C3B99B1AD12DF42AC6CCB68C32BD + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D79256ECA98EDC6CB8CEE336E62EB967D64CB2988979D4B86D23DB5FB630792586 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 21D03B9DBF8435D824D725AD419A4EEC617C521469384BBDC7155577197DC10CAD + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3D20CBB8ADB2EE111F84BEEB1132ABCFE27C7296E0C5B94F8E908512B9214569A9 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EF019521ED376228F05A995011BCD732CE4AA12B620C74EEF36ACDD4BF0B2E9762 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = BED53E26E9B5E80CDA6AC11B74811C74B672E56914070788E55046A427AB22FB77 + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 313C6982C136D3A466D14639FB611F4A4327658CBD24800C8191CE54ACA42828A8 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D3B5BEDD9DB692AFFB8B091D03C25602BF7C4EB2FCD02DE5CFB0E8F0F33C53E1B4 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = CEB8FD9717832EBDF2BE18548E34B177575E805BAC1DC4456078A3172727B346E7 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 20B04E183E5C98B02E68A0A441CD60C5EE25EF83D99B4E602313DB858BEBABB081 + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = A9354018A03F899F8BE7B2076D0423A62F373545C16AC753C28AF63992BCA90817 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 7492D1ED3E50ED123F3E3F479874649B99394B9E8DD6EE8C4D93A6C7959DEA947B + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8F0CC75226A22E04E7516833AC14B63B41CA86DC7ED9D36BF67E55057113C67ECD + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4D857C86219EF79DDA59C32B091060B82ECC64CF91E31E78D52B3DEB46B21C8F32 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E6AAD94C564C81E88D2810046379009AD0AFFE7CA9B04E849D8A8E976E32595CE3 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D67C274A54656E4CFC3B711975DE080F24AE2DDE2E85315B502EE39BEA6F1707A0 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 7C92230E5C6E8B50809C4EFF343CCD84E6885FCFD723474EEF69885F12BA2F7881B7 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 48E78C2873157A8B2C230C1C03A7634EBC395C749851E0DCE8BD59256687B0F9BA18 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 6EBE5CDA491FF2B1174B0A9C5A790FD948438E2D244A2B7D04191C36194EE2F77E06 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = A4FD9C3F38B8355B4320C145AE4BA5BE39D6D9F8C65D58259D0DE8F60D976693F06A + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = C3545146C29B604715E6D8C4AA4AF4D928276516AAF1DFF1A9C52F259B509D763898 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = EAEBF3A1A6522DFC50A0027B2B8B16E09DD59A993298A594A35F21B8F390C42E7FB8 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 6E9D1AD0CBEEA980A86A9AA39EF0E17ACF1AA36656276E240A8B6414388CF21A38B2 + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = C6A8885D62F423BDE35993FF390DB26CAAC5CEFFF53B149AEB10EAF7544B6EF3AF4B + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 38B7DE7F0CDB9B4FE785E7FBD13CE585E4168D87A6DA5691B19FDC6D6A2F0AA20024 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = F9016CEEDB6EE9C9D4E2B4154520309C4ACD93D5ECF621C58E3C4DB3C2BE2FE2D74F + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = A72C3ABAF4EBFFDEA8BEE1B300CC5092A3FC207E2E2249841DF5CDD5F705D9F08BA4 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = CDBE69D08BCC420FBBC521AC55EAE94FAD21116A1703E08BCFFC9AA1E5D5CCCB573A + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 07C9E5F5912E3C49E24F86E8A5A46A3DB4649B40915A644B6E5209ADB402AEA081AF + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 636A84C75D5F9F122FA1CE3FB0B15B5C0933820A683353CA70FFA1D3F90F813CBE5D + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 2FEF691DD3EC32EBB91B2B61869B93D65A62CE247BCF25F7D3266D2993A92F6A05A2 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 24B59491FA73CB97682083FD07A4A7A08A14AB001A9DFFF1FCBE2863706419B6B1C2 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = C604C37EC3DC0ADD7847789728C32E977113997572173E6856D3B2035EA0973449CB + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 729B84E2F5273F4E4B0082B47FC1C074F8FF126D41128294AC9FA448D14D2325ED6A + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 44A0051AE80E6C6E47064ABE22D4C44612996737588FD77819F1609AA6B80FD35DCC + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 175F6FDA243C59A03185FEC6C25D8B47B9660CAD5FBFE181436912978D819A2FECB0 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = A2C2512F9B54FA2D34903EC6040A7C08DD34C02311BEB7503572AE12736827D06373 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 3F9B61024A0986F2E9925314784CDBD2F96D60BE5AD01228CB76F5E73DDF41E40102 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = AF0B0C026F6EEC7A1B300C17C7EFC25317ED8CD274B0BF8383FBE0BC25F8FDEDAC6A + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9B7834D0E37A780C92B83CF443744B4682DF8783449E912DBD0F2963550CC704B4CE + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4292E8D6214636B9D3E248155B2CA839ABDDE7D774214C50D4C0A63943F70043EC5C + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 1852203E59A71FE5644EB981F88A366ACD77EEFA9A8B6F044DB051ACE1A32E4D08C3 + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2FC0B2171B1F0F53FB8BC4FE2FFBDA2FC3EB185D79AF476B2B1DFFDB912205B17915 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BC9AC0FFA8D1D31256FCAEC47F1059234B0D6DB45165AB81CE8ADD75E6FF6BFB429C + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = DE7E3F859D5F1035B7EFE1A16ADBD7DF1EEA670B9331FBA0C20627ABA482539F5988 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 79343FD18727550AB65BB635D469525BDE4B1FBD851DB5F145CA45BB4FF6478D9E5E + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = A55480CA26AFF3ED42F634C5EFD74500EF09037BC9C78F64EFB460F16A3B57FEC92B + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A24111C6C79A5A0A990EF1E6B6B1FCD097B17F349552CF33623A389026176B4FE82C + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2679BA1E4F9124E72A77AC599BBCA1C50E63F1AB2B2B12F0D0CD677BD958FAF25A4D + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = E17B6305CFD61C1A83B240F7E90FF3445BD7D8A953CB09389B804BC5D6780709490CCC + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = D3CE9A4BC1BEB1C49F6379465F747B43D4DDCEE751E57DD840484D8B6FC71014545C92 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 495584914157170AF47E93672987F151DF2DF54A67038C824D35CFA07A2619EBE625E7 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 9F9221A81B7C81F4612F4D2DDDA30A6A15B3B6CDE6BADF8133B2230F98E9BEDB3C247F + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 8275EB3F103F64062E4727ACBEB34C33C8C01A15F8228A8FCE061B827A1FD3FEE02DB3 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = DA2F4C668B57DC533152E1EB72B10A22542B47C7E1C54E5156519CD1B1C79F18D9DD8B + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 95730B51A3A42DB86EBD09D27BE11061CC737EBD5084CBDC52E089CBCDF08804FA7BE7 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 209605BC4BF4E1EAAD65A44452531B86825459ED5F99C999C724DC1F6AF3C35F6442A3 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = D4346918700DFC78EB89EDAAC14BA434F2BC1238DD6ABCFB7FD066DCA8F972C1026024 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 1866609C3B54626A72AA5FA839536A7727A61044577DD22B0A42D39C018E04CD242788 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = D6F46CA8C75C41F3F66EB050ACBE0624E11F155ADFA73B8669E9D18EA530A21DB5E75C + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = F6294F7F0AE78E5B7C2EBC5180A6839F70254814281E144D5944D86ED498856D2A6F28 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = C5F635084BACB18630D0EE739B4FE79FDA1EE55798E4782289D4D91E6FDE4EA72D863B + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 996B1095E0F2160E57B6D1D90C39FC9D0A6063CBC19A1AF15D1BA48267307FD6A54883 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = E9561368031EC726224274B17848969C3661352E26C7F436F809604F58C509BCF3721E + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = 6C6AFD9E7F774F76917665FAF5587651FE310283A43F8754ACD1123A898F6037A83FBB + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 87DA88E605424B6851495322F8FB0A53BD6FFD18BB3BDE1EB876AC3636C85475D88139 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 95AB4341D4FCE6093790438918AE611D3BB6E61619CFB340FB97312552F1BF62639997 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E994D26E020E0D283C690EA8F39AE456DA4A73E5518C327F5AC0A44284FBD192975E23 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ED20A0BF2E46267DF2C82CD09FD19BBEE7CAFBB77AF85874D473275B1C40AF7441F42D + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 9363C383C09A96AEE25EEC269CD0E4D03457673A95F23B7BE111D798A9B2A0F1453379 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 74680A9919FE56E9167C411F487D187CA78B43A4CD28952E0FD94382C6E1ECEE271234 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 667C8BAD758143E9747427A72B61774C37B21EF1F97854CFEBD7965108CF0FAC3D5527 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 8054C5EF9B3C23F29D31C03E20111344E41E6119EA0BB4718F4D4262C527A20D117F97 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 951C647A08F8BD1FB980F427864658F55C46960ACA2F4FD286C5A8847548671E5C8CA1 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 16E7067EB1C36016750DA7C0AFE9826DBCAD9F5AF812E3F58385D67AF24DCB73FFCB4C + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 7C999C47402120DC26D56F0DD400C80DA8C7BE86C30F83AA39FE345A4FED7ECD5CDC96 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 54CCA33AD5986708F74A00D53D9CBD373994D0B402D345683D1570982A5F426AFA73EA + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E4218AB456165F2D41FA5ECB7F31575425C70FEC01B03B2ED165B9BC57F891B78B0459 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 16321D7389085ED95141DA32D4264D35114FAC4444840DF7BBEB4CDE26A550AA3FB01B + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 76E6D7C4F8F50FA20A0EFFBB199938EE19EA6784E6B39A75B54627917BEFC6504A5B63 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5B35634618D845A32A1BEC57A9A92C224827D2716B7E2B37C04334374FE484A310FFAA + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5A6EAEE0113BF5C974E640EB1E67A09465C1E390101E3CE2DDD851F0359D06CB2B0B6 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = D739DA26420CA2A006C351ED2434CA9F2EFABD378D645AA467DBC51681ED1B14708FCE4F + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 9698C5C838A24C6FFFF5D8E0986BF74F6EECB908DB52DBA4151D9E17712DAE51C38D9DE6 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 378FF31CCDD8329AD441B32389CB6F36DA0E62F86D00DCFF7E62C4F3B6899A55C4EF1443 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = A3CE54B47137B3644AB35A9F61CEA18B8BC7E1107A30F8CF83BEBA9BE3BC1B1252E276D2 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = E10775AFDD6789C9D98B24B6E1C1D0D5561E4C939642624C297EF81AD0C1CC22305BE7E2 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = C1536A4A75C62C2F0DEEC31AB0907EFE8833B87B17A07B624ECDE2738C1D74B60DC5F7B4 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 04CAC8BBBEC2F6860F59E972787418D34F288B79BE6C8B4F7888AC9019E6CEF1126AE3CC + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = FB74B550B59070D211848246B984C4DB64BD20BE70DDF84A8947A24DB81B0AE14009DFF9 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 95EF6D50381CF26BDEB5D450AA751294794B49A92B6E2F39FD5F1BE05F385BCA43CB8F74 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 31B7CFF424D2E5647A0791AEFF5A0E27D8B491ED3F457A803202CFED9FB91CD1C325CAC0 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 99E3B912B62FB9FB55345FAEDA109A49709F48262FD6C3CE24BF7C9C4258D5E5CD44ACF9 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = C30998FA408869FF296253365AC6AAE8E94D6D2B553DA14AE2B074CB0DB044A004B3AADD + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 65F5D76BBB31CACF976267909A15A359AA9AB0F452DCDF57065383A8E814402D37D45B42 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 9DAAA7359B9C097FBC5F91C8953FE8F2BEAECD440DA51ABE2E8BEBB3D6C747EA5C98C118 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 9DEA51F20D2C7478807CCB20C24469C6D3D17F10B909814DF0FEBF44F6B9E6B8811F5997 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = EA26A4AB2EBABA54FCADB3FAE8E8C0C6E5A4CC91C0B85F58D47B9B212AAD684866C29A97 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 8A994D9D3B7AF37915786D1B0B3B3CE66155E35056975D4EA7654C86F2E7FC7898A8A3F2 + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = ADA2E48DA40985C114D7824CD46694E3E9AC12851C19896397F402E3481578697DD16598 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 2D18DDCC7781A0AB5F98C2CB7B48B4A348F301EBAC0E10538BB326FDFC241A283E43BF5D + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = FF95AD5474F64DEC193500F28B8D98D03607CC72092A72F85EBA4A9F00F188D5D8ACF9AE + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 6A6A8E930B487978030EB3DA4135075B0CB596D24AF45820D4DBC5FACE760E7197C9587F + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 0E5F39EC07A421CC4AC5D62BA5C05F84D229581B3F39BA5A848DF276B6F96DF1B2D7DA33 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 4F31E115F79E6C951402EA2A9EBB6FB2C20219D8D12DAA380E2370AC20DBC242E4F3EB05 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 2A0B38E02F8B8B64F84D7E6A1BFF1FF3EA56AD55BF5D887481B268D0D0D12A10F96A7246 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F28A9A7D01CEE9D81F1497EB522A3FEE07BED3D3A7257D3171E48EDEEB2C0D1BBA2E789B + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = BAEA89EAAF019D45EE3E5E860591252200FD071A74AC6A49B1E14CBF37710A29D70E2475 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = C4C0B3CB09CCA82956B3B1CD3B753AA17FF3108C18D14852E865AFE695B18DF46E16D2EC + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1E03254F15726E98F5F9B220E5444387ACD49C7C4ECB908B7ECFBC7E1BC892BD7814E6A4 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 4B6E6CBCBB5841C88C9E4D2A3F4FF69DEF4DE0D85E62FE87809D8BD9193B47DB97089EB5 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = B796E3A79CEADEC8FABEC1ABB26AD4633DF1C085D65327B0D9C089B1D8865AE60A1D09C7 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E4F0B77FDED72CF4A6F5ED6296E3A109C57758D758BC582D16D2AC231FFDF78CCEB4A47C + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 5316CC14D8E690C9F40BA8F34227EFB095627037384345257088E6EE334CFA611316D8C2 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 3341314D3A814A1E1BC0DF7FDC2D5F614C9D04B8A89FCF48F6FE96165B9CCA6ACF6452D1 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 880B0CF92D8200E7B42827D5C51A26666568948C4377A2DC686BBBDCFA64A81B544A07DD66 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 3D2238189980579FD1CA587C15BEACE577FEB13782253BB14FD12742B3FC724CE09EBE8429 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = ECB1116E5CDCCFDDAECB2888A2166057BAD1ADD84CA6460BA11FC50A2BCF902510EE2C92B7 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = BFFA1F344EC672D5E47FB23A2E97F5444AFFA33316061AEE556006D9BFEB7A14686363F2DA + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = A49F8BFEB318210453E9DD1B378E43937505290F5F2E21D6F73A65A224E6D1618560BDFFEC + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 96597959752A8156ED05E0BE558BBE9324D6FA929F20CEC24DDBA163BC408568AB7631500C + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = E4E54BC879B06904BC1C542706641F248D05C03BAB85DDE871ECBEED460EA499CDF788176A + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 8F12C0CD08D2ED94EA8DD47CFA07DAECCC1662B90999015075F6B7CEAC4797BC8BEE9D0F61 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 9BE4451FBF9A83E673AF18495A24AE44B909F4E6E3DF9B04C4E7D363D38793B6A61DE60655 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 6364DC516C4A464FD9B0CFCD2EBD722793DE44BA9F478766C0E49B6DA942875AE1957C92DC + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 32147002739F62500D61FE131BAA1802801E4EBAB4B38EBBDD836F34FBEAA034FD19E195A3 + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 3BE31FEDA3DD2AADCAAFEC8558A3237B2913A1408BFF8ED69F3FFEB63EC9EB6875CFEFAA36 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 4F0C64B922D4E28D2ACB35AF5AA0C68C30CC63813EC6074CF48A5874A60D50D7F8E31AD46E + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 423AB2B02EC69DA2183EBA8AFF236404FCFA85EA4EF0956190184AC58FD8F0EB60776378FD + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 98972532113070FC7254F8EEEA361E476CA60A82383FF115680AB092F7B3D5B04AFAE60D34 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 5D806E8B5EF17172C3DBDC7B2E75E1B7632E5D978D8A3C5415228EEEAB2FE754C7B27FA657 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = AD44248AC3A992A6B12BF2E33F8C5BBDCBE73D5BD0A417677B915945BBA70FDDA62C8B811D + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8C783C16E63791F922AB52E29BA01AA318A07EDE84D1B7900FC578FC87BF259179BB021B14 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CF9609F47FCB1A9FE2F207469965241CB4EACD5924E7AB547677565E1E95DB009FA3318147 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = E5D82A39534B3FD3CC204DE88957A30C6FC21B8753A8499BE06859EDDC7743F74D1D02FC25 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 949D193588C7CCE877E7A261AAFC5C78975026A7D915A7B3C8F7C1F8D298B80041D91599CF + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 02F59A7AEBDCA352E95F44635966A9D87671D4A97F69433E2ED4BC1DE6180F532EA18B9D61 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 864BC324A1F66099109EAD3FEE8169B9940856D14FF362837569D8E26F70E86396AD06D4B3 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B092E2B7B72236DC808FD71714A2F19DEE3EFBD7D0F30F698D3489F8BC7BBD81E64F4878B1 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = A95001EFA8F311BAEEA0811CCC3B343059C095E3B29992B5E490DD927D50111B6C52A6DFAB + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3FF6CC682F58A55E9B2ABDCC4083FB8C68E1C13D2DB262FE59E8D3295A220C4125E56BDBBF + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 3B47F689B43B1B8EE13EEEC7E0F2B580013AEA4AD6A8C20A750249E9B289CEDDE6C2ACC995 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 74F743A8E7FC998D90E992221D9C91C498B89489C3FDCED59AAF5A5CA0F24D47C314BAD639 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 856DB5A143C201C69BF09A4F9D5F9AFD36AB1C9966EB0307D8DC392D86685FD902FDD44BFB + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 82AD46DE06B5CC51DCBAA89153B1883A91BC00C84DF93D03DD7625FE569172A2FD73CAB05D + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 873435FAE5BBDCC3E622B6545EE39AD031C76CC5C0C9DB1A08C677362DD21B5FCA63CAA754 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = E5A5E6820F85E798FBD2A94661A177DB3588DB1E92034691005DCBAC0366B6C9389A2A3070 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 105CDA8EDCF2C02334E5B98A36F30EFC943AAEE739E5DDD29E58269BB13305AF6E6B5272FE + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 59FAA7444F538B5596B816E369BF43EBE6AEB4F430C9A62C2152D649A3B1C0E757ECF8F1D022 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 0BC75D93993386DC51BD6316BFAA84DB8D34B557F87FDB7AFB8642AF76CAA611C301AB747805 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = FD1C2A926B7B62017C91A2BCDCCBE3A15A069BCBB537E48CCC33B78DD0C4CF4FF0EB9DD56DE1 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = 929248358A079DFC4A06DFF861AF36E69B4F42FD613889238C75CEC6D3E65A4ED5A3261B0CF3 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = D251C29774136EB11C80561C0FC2633DBA5C0D38037B6C903BD183904985C137ED10A230699D + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = F01CCBF21E35BBC3232C8E4CE98EF080574FF29FAF7679D4228D2006D84C4216D145DF567C91 + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 53054F6CC4C87776172E4861B0FF7AF5B31C1F9B8AB3DC9201A6C2A57CF4EB9E7019C7A037B9 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 5C61ADC8FDB70D8D368D19FC9C29C42D88F9EB4194AD765CC3BCF0487F212B897E351697387C + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 1B22095AF3F886C3F43C6BABE8DD1989C6B0B5EBBFB6B732FF50AD3B1BD380517D18BBD639DE + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = BD3D6D37B6FEA5A5DEAE756980DB61ECC262727146BBA94E7C8D5F1558159E9775CEAF0B806A + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 57A13F1BCE6DECB3A1CF4C2FB7E5EF368D83C57ECA8350017C6BEDE528A783233B1A45EA9F71 + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 6D176F863CBD81534ED4C9D42767C549F2C764D6ACCAD1D6346D0DFCDC69501E0989995588B3 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = A494CAC770AD669B1CBB4DD7F4E164CED0EB7B1F10B6A0A176A5F8D519FCE0EBE83EBF84CB17 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 4BD9AC6BE553362F76E9EB3E5DC6B2C0FA110032C13D833E05CE582567EC03D61C9A8CC73AD2 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = B3E219221099D44A9D06233B763266B2476B339532C1EC61EAB4CE3B8C8326B034B400821667 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 58AF353125AA817AA013F5CE6B5319A16B9ABA2EB84DE1EE779126434E2BB0B151A85A37B233 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = E60F66D86B0D2CE91A9FE6ECAF179EF9CC9D4EA83350E8FEFEDDD0ACB0DA75E1CF62C20A4877 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 257DCE027DA121CF508B23EAAC59A3A412A0749F44AE52EADAB5E1B1F4E17186290213B5AEF4 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DB8A7B8E17C2719028F8B6AA1DAE7DAC7C0D785952943C78E2764B50DAD3844E7B4F76C96857 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 387312CB84248ECCD9F591DF241D780011DDC1E80C6275B3CACF51B706610BB1C999469D87ED + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8699A1DA67EF56ACDC0C7F28860152BB2454D34FA36C25D2AF6DB4A69419A0EB767FC0954B7A + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F516D94376FC0D08A1DDC3213F338F2281D45503C3C3BD0611C96BB001D81D6F40CB1079A800 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 596380D6C5899E35BBBA7FCE461170BD1CF67B6B8325A92B7935861609DE376F2CBAA8B5C7A0 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D05BAF1C8C0C858D0B281E5E98FE4CB0F5F731F9A6FA60878EAEA1A815BDF9634869F9D66047 + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2D894B2AF3285FD86C151600A429CB33196C7A8F1814DD07F661241DED4011B0A85835A6FE98 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 55A814BF8F9608BDD76D7241208A6361B07A7E7DCCD63FB6E3891784A74A41F8CFC1A3A4F214 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 8096AD1B18DB7AFB95E60D0CABED5ECB8B14FC0653B6CD5FE7EA01F87D029D18B3EB541D26CB + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 95F6E255D94B90F89B52DFA22E710B6C1669AB464C431C57279640980BF998A377D0E31AA9F9 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 77BBB2E36663FB27B55E156E5A0E463306CCFD8E7B123234D99BE5325568DFCEEF1341209BA0 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 939EA5F855EC7D318B726D2AD1ADA5DA5E1D92DE99E4E24228445DC9E6B5EA88303E90FD4AEC + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = C36A9AD5E98279A951A6FA944080DA41020B0F4414E741970D07024A9D328319A305862CD869 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6F70F3FCA30C1371DA2D3A79DFEDC387D4FAF04FFD215900E7E84F5557509DF0ABC8C08D06C7 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C7AFC53C21319F1825838B26706B2F816C0349E73994E7AA4B7B5861B648AADB0DEC81DF4253 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 83CB45ED5A90EB44ECDEDAFD7FC6A228C86DFC87C221E275A16201AF3726A1810B6565EA4FE31D + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = E322D8EEE0E0785D0D7E22C38E42729D68D515C0DAE92972CC7A2127B43500900B30F58574C1B3 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 42EFFA3AF9BCC84BF7E5A1236AF2C4C81F484A85852218B4CB6B39114721FA9AD0E40487F193CA + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = FAF05DA538FE77AA8A99EF6BF98749E2C7F18B84FA9CB766E54FAB1376B19B56B1A3B23CA761E0 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 3C02E6A5D2BF198F82756CC647CC9C91CEF439E39DA31E51CBB78B68C5D312F35CC758AEA74EAD + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 230736FE15328737D2049C62C8E68B02DD7092EC299EBA8399029597E7A97D6BE5BABC751EA389 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 27AC7888533C97CB882931255D9204CA304E5B48071D5D355A450DCAA42268D2D34092E243067C + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 32CF4CBCC567DDFC08453A11332BFBD23AFD86D8DCF4234CCD7E875388FAD8994CA1A2C357A3D3 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 34F5AD9BC1EDA299AC22C0D942C917FC4351CFC58CA9A84DA1119569DFF860159083E9EA1699A0 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 345DA46DEDEBEEAA5629760F8F8B84577A2C5020E34810FDDD729D1F9926CC0C40F1B25F981FA0 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 67772578480BCFEDE2B6B1E901CE3E4B0399008D74A52CA51AE8E38C63D11A744D347BD1688A3C + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = A2896CE8029ABE938CB5D98CB69FBC02BAA2C4AFD3F57970E71311E89D3AD1FD03D8869CA95252 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = E883C06D8D6D7C47FA98B1AD550685396486F160B0FC5EA9A63CBC0B13F27E522658DF8F74EC6C + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = BDD9D5560254DEE9E3A9E67B223498E086652AE00D2189C6A4B9E8DD2D9FA32FA8EFB9564E8B9A + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 7A8516527E667E0CEB56D13C7968ED76D671D4E130122ED655531553F4881B8BEB178BB3AC366D + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = 6E2AAE5FB9C97B94EF0152CAADDD9533D39950A916BA899144874269BB6F8B7F4381924DD81927 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6F03E8AF8EB0FF3D99C931EE868D0EC74D6892628A97D66AEBCAF42924181E5E9E22C07D6751F2 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C7DFFCC7CD8A799F1780BA6FCAEEF77B9B26CC62E9DDD4DB2CD33EA28009252A1E0CB0EE08A38A + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 264AC7647E0DBDCBEF00DE08AB9243282EDF187FA4168B362BCCD7135AF7563403CCEBB00FF540 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 43D15D9BC3ADA91FED7FA8CA37CEE67C0AE031C93FB6D5C8C05325EF335ECFB4C069E617E20003 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = FA8C90C1888C4FF3E26C55F46F5943349516F74BD909414B22506874D008B91041B2F61DCABB94 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 5465C8A7BE1D02E4E6AE5859AFB60B03A8E1FEFF7CF42AD76572286170506841DE460B0C433A34 + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 5C8A19615E00D98AC7CD8D2D8FF6293C372BF6481FD2DDA93631FAB4A17152F4E8C3A220D5FD07 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = A2C318A4389207AA41D207F0F4B0412B224885238E8EBDF74EA5C44B73955F09F5D990C0D9CE53 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5F758B95F4CBF6E5F0BDF755CF3850B6550B208A795F612DA8BACE9CA494E588D90F3860522B11 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 04628C5AECDC751D909B7CEB0AC0C6521183389FE7F8F2F0F07CFDD82B8F57F117D82F6D593BBB + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 339AF241936130FC9F5BE39FA07F303C2AB0120B66ED17AD9FD64047380AEBE53D7D174EB4D619 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 377DB1792DE8F4C697538EEC6A254F0CEDB773784A9B8C2B9562B58046D58D407FEEB24A9B965C + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 9E9E4DDE8537D8B641708A2695D20E3D662BCC97CBA94F223C8C8D92F42B7E8FF06EC941594811 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 9A638C71B360D893CE6CD8FDBA637CDDBC8EE9D6BD6ACF820D0C50483CBCFFFAB0068164E237B6 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 4C484549DE71E4D569BD15A179474BD2D095B7C48062729CC75C0CB983E247787870265812EAAA + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 51C5C8E0D8147327DD7D5192A909117B7D549CDBD53925DEDBB44163DB75AB9EC0DB0C7E8BB1C3 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D4688B6110C6704CDB580E01B50AFC79F4843107C82ACC5161808B56E44332849C3F6DE7AB3CE8 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 308A26387CB8EA7D216FE70D0163AA94B76D766BBEAEBB6E5957D3558A597160083F8E1696AA0D93 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 9ABF22EA2AA6BDA4889737ACA83690AEE62D9ABA28E1D33D2B7656F3BE175DF5000D1C1A32507FEF + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 162DDC70856B2B903AF004942EEDF24B335316BD4F83B24667032D5EFF404B034B7B998048B8915E + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 1B409B9C14AA78EB25C3771163798DCBB889069F2BBCB7FF9A6E6EB2B9836C8ECF0352E2B1CF48AC + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = D201140F8DABBE126B96492C14072EF31199C83892485176EE8D44B745765C5BB77245EDB3238885 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = FD441A0BB3D50D58858579111C69DEEB946FF5A01651DB2D201375F3E09382933E7361CADC58CBF8 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 19542751618CE94E87AEC3654A784AA111115DFF12814F43C96F3419FB8A018A0BBF2571E70F376B + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = C6655F277FEC497F4A5A68AE93C2E1295F265AB10C6E6D5904B347942F9BCC6757530BF3BB34C962 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 78A7AEFEF5DE9C5A60CBBC8CAF9F925D09BAF01ED6F421702031BF5C311B90CD51B93D00196EE4A2 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 2AA30F844E46E613321D16D1E88D7AAB02331A57E7B912ECD907DE4148F1C8E7D869D036DA92B831 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 7CCD205F75F64784AA4191FF826456D3E694ACAE1BF8D278D2670D8D8C2A35F7DA03CE2CF3E94D88 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = EA541C0AA0223BAD61FAAE9456D3FBEF11419661D4F2F2D3719FDDBC361309BFA23298F99D75AF62 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = D08AABEE642DB5006527CF086985C7F332AC3CC956AEBC0B661C370967D0E889C8B424CBEA8D020A + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 8241FFCA43E30C3F89DAD59AF01BEDC9983D163E0A20552CCCE758742A7C732BB381A2A8D03D1ADF + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = BC8038974294ED861010C8F07986934460FBA83B3FF627720CB436C15D0041C027E1F8F89B0E832D + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = E2E79FC7E597F1456DAA443601B9717529B40D4FB69055F4A2635F0E6212AB473D21F391554448D5 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 7F4023B3599BB6B8D9659607D8E52F9E8E055661A7C17EF8D6957FE1F7F005757ECA5387ECE30514 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 0A400FCF43EA6B3A0CFD55C6BDF0B27ECE9B9A4BF776754380F6BB158F54ACAA892053FF59650F68 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 599F4915A719C7E2D5E79F70E1DEEB96F639323F8F7789E465F7C5D538F5B1D8AF751259A61A31A2 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 00F88C13D7BB96C2AE152F12827D05E08013B57EDF7AEE590A277708A8354C3B1C9061BD8B504234 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 5BBE842564260C4F2032FEF6DF016D9CDEDFA0651FA55BEF53D4DF78F67596D21C0F0267DD096CBD + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B7DA78B16C6356A44A0326B3F0299477225D72FDC6A425BBE64AACC923A9D9200BBDCF7DF7B2DED6 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 43F2C87733D9DC4277C044BE93F3B60108E08B04047458CEFB7FE70B2345E2E7CDF5ABD2141BE44E + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 71DAA794014FF1695A726E5A192CB7D6821B6F70310A4370FDCD6057A55CCD48E3633F8BF83FE6A6 + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 84CD812D8E3476269B390310F32A9ECED622626CDF69E8313A08AB4038ED514F28EDA2922DBDAEE7 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 320C1D42E3C3258C368F3EDAC4CC18E4BB74579E901DC4AFDAFBE1C1DB6421A810C21B77846B63B3 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = FA2AA0A7AB6E0CF8151C93325C2D1A8EF6538EEE737C4BA86280F894501E61AD1D3FD8DA3DB3228A + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = F26FE2844C450FEF43B6F18446FA3BF7EA137EF968D949E700A5B895FE48443B592220F6ADE36167 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 26229E49A66A7DC790A21CDBA7B284798663630D0E472E36B11A47E84A27387CB907AE0F1D83E88D + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C133E8E0CD23AA76F451CA908EAF8DD83DA66A2CC71C3319C29E4DFA9C8823E1D308D5ACC10302C8 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = D61A6CE92699A52333CAC43F75F1C8DFF2DA6CB9B1453F35B9FA5B79BA4CF0F26EF67ED840E1F678 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 66C6938A31279917A3D691F94ED4CB2A8A2679992ED12E67C5D7C6D61BACF0660E84E8949E4FDCF6 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = ADC368EE7D57F78D73FE6020D86C5DA64008A77BA62C05CBFE5E9BD0F41CE598ECDEF29D70616238 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 83C1598E5B6DF2A92386A6E84A3F29F89D329EC33A698F517546AFCA6393AD2BF6232574CDB275415B + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 06B57F4DB547F4EF542CB870FF9E5FA52407F5A40EAC90A2B8743FF75F50A1EEA940FCA7CDF003EE3A + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 6D1076C6E8D06E01986ACAD56CCF3D6535C1DC46A502F444901BF8F518E49A5D64EA3B396620986974 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 91F1E794A61E5CCD7026877FB9BEA459EBAB80A47929C685D41C71250E18C3D7D8C1FE6BF192D49FC4 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = F67730931DCC79E66D99C6ABBEC70E33D108B43765C69ECAC661A93A90B1035C5FEC4F423199727E20 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = B0D5076BD8016BA63744AFEC4CB7331D01CD5C6FA97D0C3EE8760CACF05E93C5E84F2F44BE7FE0E757 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = B84D07AD08A962BE351B1AAF7A262EB72C21ADC66246CE6E4AB53199171F1B063E7D56ECF43B0F6E35 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = EDE58CC50F9EA71E06BF60F2A9882AE53D4F8036B0A513FBD182AF01BA8A85082AA30BA2A35F76374A + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = FD9464EE81A4405CB6121BF6161C7F6F0D5DAD1967D165916B01CFAEDE43F203568A5ED16FAE405C16 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = A04EBBF62F4630980EB8DA634A8DCF932165C830F22EB336A479CBE1A5B6EBB6548CC1FD641BA41A9C + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = C5C6F301453FDD3330CA15A72D2A5779D8B8597E1451F5659C54D86F4D4D70C307E77C0E8131A84DCC + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 0A3D6965E0ED5320B6F57F0F1B1D984DE353E0FA25B2DEBADA5020E10E0760BA2D8C22BD19D07E134A + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 65F66C65E19145435CF38AA35E99245B1E2B874E0FC26C2CF71BFB96FD4C590B09D7E4FC912871DBEF + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = E20ADFD17E4578803E9C51733D8EB30CE7E2ED64F999496B8669B409260D440C5056266667898FCC02 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 684AB31213099AA905D1239B3F86F8A3FBDBA8BF2A5741B1AB867406917060EC9E967A5369D850F9B4 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = B68DE009911B6CE8383C6ECF1118BC3DC85200308BB9E0CC2CE6C0C7482027C615B921C7B59B835823 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = FC1F94721CEDBD839C294CB087E118F8AEDA4DB4500D34D5BFE0C5F3A01E27254CCF31E725990EF6E4 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 1636DB001BB0351410B3D17B2AA79309F656C09017103E3E36D924C4631BB844844D09BFC10FFDBF57 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = F7E8EAD57F81AC33C2BE6FE41088D62EA357F405A364C8CEEEA5660990A04CF1C961BA067F0BA2FA27 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 44E02A3E3F4362712E8FAFEA2D0BC2E30171467F3AE9BC7DDEE2C1C113AC57F4224E1691122995346A + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = B5B0F04C2DC7B31A81B929840A2A76435890DFB0D20722D974F8462B691981CBA67AFC8CF135CA1321 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 390D640777F620141E879FE2932C03C847142C4A3E86464DFE50B298E92C544C284400576B83939760 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 94F2FEC6F1695B37D86E04C43FC73B19265DB2916C8808DEEBA9FC365D4B0973B8D39F50B4A7B1622B + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 5589746E3AC76485228C9788B5CE26838FB40DAAEFF948847AC11CB261C4D6D52097A8604221D71100 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 809F267F5232B77BEA251038EC3168B6BD73334A16C9A774542EEEC2C7B9BE4B3201D097EB47BD020E + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3AE8C62C4BD01FA62FBF1EDC5232BE6E25750149D1897AE93B93003D3F9B8228DAE65C6CB3EA629A55 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CFAACBAD7714110A707DB2A3ADB917FFA180F13760E40F8034487A69765117C7F1118D81E6F287AC12 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = AA2F9DA96A999818E9BE8E01E18DADA802D3785CFFE87930294332865429BB44D174013F4154562856 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 5AF0B3CAB9B9CAD326482983472EFA9D96EDE434C9E110176C18D496C0A073AB10BC2AF57D7CE24388 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 08242FC7E554891E2393A2824D2A2B6691F6172442E2EB0CAAE0FC94E59C5E71F14E273A9C1234691B + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 8643E3A4EB0131C425365289F3E7AAE68965D8FEB9C07920B318DECFE9B568D0BB241EEBEED26B066C + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = C3FDF6E522F92E80FEFDBC2FB8FCF2C0228F6275C185E059F06DC23EC35B5B19D8EE420A1F495C22B8 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = FC7828009F89CDF8CB2F13EBFDB7D29BE9C36427874626610185B2096DFDF80E827183722A872015C0 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 9DC5CB4CBB3D9AC8781D86C4A1544F59F5D8AF8B981B997186C1D99563A374184266731536F7B8DEAF8E + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 84ED05C9CF8D795923C3D26EA57B7A37065008D41B2928CDC5F8072B03F2340F67B0DEEAB5A8CC706C14 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = ACBAF3B5B7EB50BF8CC1813F7810F573195BB3C3D17BD80A6D165F920BE5B5B36F1DAC28F573CFAC25A2 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = B1128FFF7AD5C950C4CB5F9E20A0CCAAB24C8B35208972FA918536FC4FF365CCA38D0B07FEC44AFB75D5 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 02E7D7DEA1B7DC3837DB88FFE1762A5AEBFE65BA1B6FAEB0C0D76E6AEED9507CF15048308EF89FFC0D21 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = FBA3F4D3934A96E931957E13378283730E5944F87FFFDAA4C9125581845AAEC94F46F3D2BF6D8EBC1F02 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 24FCFD60BB2BA86989C846242F63DF551898553101B3C2247F7E9660534E4784732DC3F83E5B46A2E5BD + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 4BCE5260DA456A9AA9B7B12066798BC34B1438D3F91FD7B7DA344890E2B1C19634CEBBBD60AEA2C53476 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = B724A9760CDA9AD54E2929306219A95343DA3C44D0B318586DCB753CB480790A5E2EE3F1A9EE98C7D79B + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = E7164AEF50B2E9571D88492C26196A6E32335231C44829CCAE7D7A109F391ECA7CADF98F57AD9D6D9705 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = E118F7D383BA90F2796F496CAECA6884A356C207046EA785FF13D759C18849E8D7710F127DB0B8D5A239 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = E2932FBAC967FFA98697149A06741951B23E38E85B2FF8D85F34F8C518235F1B38B3A5F3094F4F51222C + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = F45AFFA0F221C46BEBC3B8B4FCA78B281F5FF4548646B24EA2543462295D30F2F3E271FADE1CE556341B + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 1AFA1060065473477C36020877D3E771E16442E028A77BD27CE176ECED35A768CF2D250585429A18BBD6 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 8DC03F8B1E45E5153D12833DC2088E966BE516AC10F42A34E9F05B6F9F1FF4ECD56CCF59E58AD745EF35 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = BD70947652B4A44C7E466DBD72D90CBA28D02B1CD9EDF4F22BE023F8D4222A32E79AC6BDA6A23FCCB644 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 9101813F0DF609073D741B3223A8DD57977005429E3AF341B0AEBC0EB0428D628AA8EA362F6C468A0123 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 85519B6D306823FD522F3BDA0A7D2827E90D6C4D1B52AE42816B4774EA37E33913D2F364801F80C34A11 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0277DC347ED4A6AEC69A095053C1969792D007CB1C3420E64E9FE445C2760AA2E87CCA22385DA8B28E4D + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5DBFC7D921E240E6EAE0835F1024755DB40CF9A4C7D8666CAD5C375CF24673E4B70EB1CCC045E96AFFCC + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 83B1BB48FB9BA9109A8C8788EC110C1E5B2419068CE727506DDA047104D67260A069640E825081B38069 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = EF5DF9D9E5EE02D691A97B71D04B45F3BE3A8C089A2C0F2DDA7CFD170077A36F4E200E4E8B0665AA5CA0 + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 7CB4995B29C32684C3C05637CF113621B9750A44189E08044852249AD60B769BD58AD48AE1534D1D4C9C + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 85526117E8C15AE8FAA3999E42620DCC5484A63E25297D7C8C8F9F56518D935FED6A0E04E97BEBA85C8C + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = E66509680E225B07F3815ECEA5268FE305018523E6FC03EC775CDC36F0B4571EDC5D93CB235761575C42 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = FC19D09CFBD663BC8AABD9BB6D013034F92148439C9BFF0A0F6B4E377F63C9A961852BF0937F8D96568F + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 83CD10314BB98C2A095A5A48338D6978F7F368479A8C69F96873DA9228405E4D58714B5350EBF9F5661E + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 2D0D8424F95645C312BBB8684511CBBC626CE4B290D1E7848E1D28DCAC3D50B2113F01A352372A25743A + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = ADDC9FAE1343CCBA0F769991F1D290327D11D248681AA4E881F0D5266AF3D2CB8E447CFF7BB5875EF707 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 636DA76002C261A4639EEF43BA0B6E03D0759ACA5455EB08D6A0279596757394B2A2B1A68267804CB1C6 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 76D3D94750F6424EF499F7BBBF55C142CF5C8747E3800B196F848C9649CF5D8AB816258229AABDCF27C4 + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = A433022435CC262AD128434EB63249D3C8CADE85453E891C42A58703E559D6F71001BD7F9E0CAFD643E0 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 82B52960E84CA63C8897843C0FC7CE4B35E5505D3526349E732B2EA7D94842EEE9041257A7CD5A86484E + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 50B722B90309FD05523C2E9E9ED51C0AED1B12F9B94B6B985A8624594865E3C03F4FB0A809DA7A4F50F2D5 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = BE16E67DB9DE0AE936643EA5229A39EDA9A380BEF710FDD6207409F1AAEC92F7B573CD3989BE29CFF73C4D + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 9C25EBDD2539BF80F614FDAA2A9C63B751877985FD1E04B77FBA510DC0A0FFB87E19A95DB66F2E5E1E2BF0 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 9BD039CA5C16D66DDBEC36E22030A81382428A2B9D8446F12FDDD8D3550A73D22C41FA6CA54947EF6DABFB + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = B9E677CB893353937FC96FD326EAFBFB3D1F503BB8E2C8AED3966A8EB8BB7B8C11F856D1553BAE3B1E0196 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 12507646F32E1F7DE5B36F559597EC0C7777BFB8A7C29A5E9AE18DE9D48D563972F8B68F5DCF5D64AF1357 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = AD5218B6F38A90E74279EE1BF4B955EDF7C77996D3DEB2AAEB22E5499FDFC01943921CF9E5B64D1A4F57B3 + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 517642743145530387583E64C641E4DEAAF30211A8702EA69B84F13EB553C9198ABA3E55BFA1B97DD0EBDC + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 0E9F2F37088A2496530B120D3F3BC02E0FC9BA6C1BC81BE1629C3E0E565B94C6160039F1EB35E2218962A1 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 0E162565C67A325D224D746427BA2750330DE73847A37A2C10FA953C3C9E532DF5A70D8E3F75C028A64993 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = A0BA4B5CF07DF352EBFEE4B4C2F6A8056D33C135B0C9007907F1D39D4A8A7EF248FD6156F5E26F1A63DA35 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 52056A637072970B485F7D4E92EA4DFC5C0D46DC8DA2A223FA0449F61C6E0D990A984C102AC2826AAC9381 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 60A63E52DCA506845206C0D38D493F6CD4D217D6694122C1265905EA4146D9C17907614D6E111679495B6C + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 13E5A39AC08D5662B10E8C990C1F3260192D66A1CAB709B8AE37C29F1C1B5E5C5D982DB73B675BED70532F + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 37308EED8E56FA35470C708A162EA0E1A909534F77246A672EFBE5D49F33B2FFEC869F958D6DBEC64EEBB5 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 087C5B83BD5BDCD500B2C982BA9A3DCE2F2495FD526D10267D3867F02660328DDBF8D66D5707E8F3DE52C3 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = F8E06FFFF9E4E8A1F8D22276C6BC1DE9015531645B5E8418A569E35E50B0E838F4D45C325C733958F59802 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5B7F41F13B654D0740A538516C1B8976D443E839250A425C6392ECF2CCF060242DA2B70BB5EB4455A6C823 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 5AD96FF40A77D22588B88E12B92311807A267D568A979DA662A86600222DE8E519D6AB40CFFA63F6987691 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 83430F392B6602EE499CDFB6A10344498AC049DB14E494BF6AA3510884982E5047D1CDE22FB5251F8BDEBD + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 01B98EA31E57DD37F96B2E2BEDB0D572529B4B8CFE7C5F4C3A7C22360CC8177E637630A5F72DADA8352A8F + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = C56B95753B5330618DB971E64A9771965E2A6F9043CDEC91225BFE24524CA893D4882F315203ECA00B4D13 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 57D40599AC6B62B733EB663549AE4EEF77DBA54B562B92001F94208A85578DEDCC5BA4DA0FBA866AF3D078 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = AA0784DBAB183DC362E71C4E2985E0F7A79B174D8417F4992713E1FEA14931BE13DF241DE6DDB3CD71FE24 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 036E2F3345F00E2006372CA14CA9AE85D6B0A68E61AB8C0A6C4D5732E7B4B7E2F99D613213EFAE650BA5A3 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 2DF9C04BF8B92D460D008640E853DDBD02C6625EDB87BBB1CF3F4B2E745EE952AE4A31C8B478B8EED3825A + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5B68D45A360B031F3A4776B15F8BBBFA0F7842EA42EB72DB96DECA86D99784A5818776BE74C272FC2869D0 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1FA9ED62732A13E5A21729D1C73D9C0294DB391244AF96769E6C1E461641DB206E542F89F8369C534F47BD + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 3AA837FDCC874C6A48B2101BF228719E016F66A1F88234CDAF049EE82320EDF87ED778813BEE3F152A99DA + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 82F69A3BB0BE9C8D0B12F5A6D66396D18C90924D8C47BADA36CF83351C3E292C24C528BF55A2F1BF71EEF6 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = EB5ADF186B11376BA8DF5FC57032614498FE0D639C13C7CC3D2B24FD39359AF906FECCE8E892AE4A8C66EA + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 946587D814348D837198C511561F0AC212958AD792C00F85C2F5CBE08F0514463C4E59FC05D9BAA6C7D6D9 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 25B9EE523352D3BE0B895F0F08CFAB3DDAA8AB3180E2A30D8280C15C9C3CB9BCD491164201A53933F88984 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 9F24633A6B57170CE4E7F1D12DE6D81F156840D19C710AAAC2B83B7495166FA534F948CB518DEE0236008612 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 5E7C0EA984621A56443F5D130708D72D4C1ECD4A110EE4EB716C1ACEAD946EFB3F832FB9DCCD0C4BC0758F02 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 5E58C3744AF2EFD8DD891EF24DCA1494AB9E9A43B28D5BB2E805EAAEE7F273971C0C83D6CF8750D156897A43 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 35713C2B900293CC13A2CC27DDB5975D65C0CE80F024D74BD7ADD98FC1E2CCBFC2157E9C8EFDA3C0960DD962 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 2A57B69B6A059CBF173D6E4E967287E8999AA0FDC5C3AFB5695DD4FC7F55153FB2EF2C9050A50D47DA15EFCD + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 9F55684890ADFC25E05FBF98C5DE461AC1C8B233485E9732D36AB81CBA7C66CA3644DB31C6BB01C9F9907CA3 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 7E3F1FF507587BC53B35E23A6347D9D6B43A74B5A6DF5AD9C9C28B5EA8E83C754E5F588C6CCFCDB572ED83BF + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 38B71D00A3459A896160E1BF24969A0CAE0BE844CB11B72D7336154A996F390FF7F0B1ECBC9DDE2BE35CD5EA + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = D96A6D1524E88CABC88674F7D58AB4F00F511DF1E9F3F1D49FE2EE899B853259FC33201AF8CD6A606C05AF09 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = B9E02DBBDA5FEEEB586312AD5B19D21D05A860A16F9207C156AACEFD29F4766E1416D26125BBEBD384E0451A + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 803C304D1B20F01D0068B3A4048FF8385E6FDA343F275EA6B713588AB98B7293361C4403164F033A312658A8 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 98DE6DE76EFE6B88642C4C383640D2E7289F44A3B7A7BDF3E332627AC53E1F80D8A3B7C213DA0895FC84D2DF + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 7548E51BB5E27050E37E7F240BF269186AB6640853647BE2B756C92F79E5467F0B8F0A3949364491AB1E734E + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 8321C875595C92763A4A0A3E24A3625A00821C3002EEEE094D6E1F6768C4D3156C35175259F821FF6D0EA5DD + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = DBB59BB6AA85B8B79D565F13D553C7B71B5B283E2D3010F477B3AAFEB36F296267C81566E1EE0A7B32B5A4B0 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = C6B7B22399F2ABBB77C9BC45BC8209EAEE01009BF2544B3DBB17EA04C2375E17732B5B4A89F122FA381F21EF + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 4CE27458062E0185F4F8805192DB9D6FEE10DD99F04ADA05CB2D2BB388F3924ED757FFE6699085807A458888 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = C61EDF8CDEDBB5F62E7B5A0CB4A1B0AC36DB739C22248E8E9A2A17BB71868ADF8C13228F836EAAC7B6FF5C33 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = DD802ECEFC2FB87534E5F37F4B7DD5E2BC1A05E7BBED3435BC9DFA631BC9879043F3BED443AE7941301FC5F6 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9972DE9F98A58B1DCCE9E5D2AFB07C8FA8629DE9102AF4A29C1CA95EEC6ED285F9CFDAA8FAEE0A43415144AA + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 1BC07508167C7A98B949EC57E5007FACECACFD4D644D88922E2ACA55608A67C3ED676EB44EF2C6EB8F18D561 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 20E4C704BBC9EFBDD9DC63C6EAD154756D95A0CB859502D13E11056AD9F663025D913041F7C22141A0BFF017 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = FE273C22BB03E0E258172A2BCCCA851926B466AA1DE27038CA4C51B563BC5DC64A2D02BF8D398B67FBE8F7CE + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = FF315002E3CE5B7985C7131977F94D5C1CF1CD0712366C831D3C0B4921BA475C8669F750AD62197136FCA5AA + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 525B4A62BEEE0370FDCBA1C79CEE38BA85C21F452C99236441AB922611D2ECB5CD8F812F1874F115DDB9DB28 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = B46DAE126141E2438E49D4D7A9A32B6A6D94443D4FF40BFF5DDB7CC4415D470ECC0DC44D0DF8B7E4493E0F9A + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 9CE4BF645F4C6B3CC4AA3506FCB7092CE35D3CC3FB870E98F9F065B847597BF706E00130A07BE707D9CEC8AE + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 1107272EF633A035CD6B27919C37E756EC016F3F2FBD872557C7C25CA79D9DB71E7CF0028AACBF83BCF40DE8 + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = AD47454DD0AD3558883CD0B9F1DC6BA555170F953D78BDB820074B69C7F0FA51C11CC23A7F4D393B655B6ED8 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = EBE24999270ABB93844E71D7674447B7739AABE17D8D57BB2E858B559579148933F4B3EE580324DE1336647C + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E63DAFC8BB435F7A0E0CADD690DFA43B90D65D2155A1EC44758F82FE8DD084FC41B11DDA31DFFD650F8D8B7E + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = D2BE4B871914452FAB405080469A7ACCA4D32A187B78D112D31C0B9616066762392248EBBFD7CABFFDB0AFC7 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 5E423936CCD0C5B4FC33A122316C0EAD5591D7D979C34D9927F84BE52D5FBAB06B6989E3B1E2A7602B9425E5 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 2486FDABFE7B400BAD4C5C414AE51C5EC8663BCDF5D6B974AAE8D78F794FCF1026E945EC2E9F0CE1438B2E56A3 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 7A36F725F26BF96C72E6DCB4CB63F71F7585B04DF270F3ADFAEE18A9924286C5E0718B7818BCBAF73241B2EB57 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = E687FEA7DAC794E37961443319AB39B6D9CADFA0F1B4B8A5AD989F061601A1E4DEA50047EEC1AF7A7098B3A700 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = EF6BE16CBAB58F6E9DDC3FF8316CF10D73F45550BC3E44F98320F772F464DE966FBA8B61F71F7C0C86129066DC + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 687707D2AE137D3D99B1011EAC0F754D3655326CE826BEA0377A18E30AE0EA14CF4632317AA530E63D8554E3B8 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 8AE597FD0D0586138DB88154E2FA8AC6A8638A5495D98257EFE2D2B481D9F24C5218910C424F5C2D6B472D6F75 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = A96E4AB029F2FFB09AEFDCDFCCD985192C925A413985D9C691C3B683C5274B2627BC3B33E8AC94C620FCF28681 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = A537B8566ADA1A8537A2810ED8D08C9D39577DF7CEBBEA904A8273366753C8B71A519FFA4F735A9C6C4A129FE2 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 75AFF8AD11DC4AC83DAC52FEE4D140641EE4799FA758A4261B09B2CFBFDFF11E2E17AE5EBAA9B7CE2ACD648970 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 190C91B5B1B4E619957000A6350AE2F5C2664E4C1B835ECFD381E3C6B50F7564C8AEC9B14A5F6FA1326B7E18DF + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = F3DABAE2F04E2E0F2E226C37C9F76A090BBCA8A439E0FC80E07603EBA7B5EDA0499FABCC1791D6BE675282951E + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = EED92D0E4E20F3869310475FBD0D2BC50EA143B7A663A36D00613775B986E60547A29A29C852A375C235ACBEF2 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 96B224A6F05C7A3F07CBBDFBF6BC8AFE6C44738BF6C2E3923DF8852D19B989A4DFE6B234C77B6A06087DDC6F1F + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 6D56634E5E8C1BF496E58F1C949E7E5B93424FD836E4B4EFDCB77369936BD3A0E1585F60159DDCF0F8D0C8D196 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 5493E493C7910D5D5BB6F5D6B5EBDDC526EC9A1C4B93F640547FA91876BCAB522C56D7A5FBC1099D668150CBBB + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = F82CF60D0751D3CB711544FA90D261018CA8EBFFF52B70AD6B9F65877AD1570295C1C85A446DCED23E85C9B8E8 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 7E20E355C600AB52EC11D6084FAFB5EC59AB743A87DC30030E108A9B7ED53F1EBBD4882EEF6CCD522D5317E427 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 8759CA4745E2669DC195140A63AFDEF2CDA65C692606A83BD12509B98278CFEEA4AF7D1DD705C16CAF5A15E11C + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = EFFB0E22C1A97D130112E378805050E108F2EAE79A882196C3049521055B67108C87FF20215E293EC12A8F1569 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6D2D760329D7C7ABA99828B3BD2959CD0B1E4D9C99D6F77DD068EFBD0FF1C71F0ADBA8A5BB5D52834252CE8302 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 3344CD2A1CB48DA3A222BD7702E968D228F5793273AC4EB81FDE9031C8A3D51B5BD97EF9090E212B728CE7EDDC + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 4EFA8EA478532758C8BA47C88E16500A1843F2B020A873B69F0722C15171810FD0AC102D2E91E2937015B60C4F + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EDFB6286D8DFE075FEACC8916BF640F7C5BFE4AEFC6FE1994D8B907A82EB8FD4186CF789BD6229B1E3C6AEDC02 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 66B78879BEFE902186F3A428654D76F442C5ECA2418973E9EE2A4725E2887A9599B1AB6353CD5A6C2452E005BD + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FC31CD8AE37AFCF64C59AC2F51BBBA9BE51E24C2572376DDBD7897E405FE79AFF0031435454CCD7D03EEB06701 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 50DC17A31197B051ECA4A0DE6BBC066D3524F6D1E1264E3EFED053BB110F29AE0767BDDCCEC0E8F1BC75A6FC81 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5E2E5D456FCC9CDC2CFEC467F380FFA373DC2829D25A911F9D2A4AEA5E0CD9C1F1F9A3C80F33E1270CC134FA46 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 523BEBA8E8320E98F50CDE402C651C672340F7E01A6435CB1845565E82AE7844D494D5B1452B875C5B6073C2E8 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 95FB55A007311EF7FBF3F6B29374E5D7E31A39955CD8572A20F855B5D2CA30717B6C87B4DAF5E82CB5C34CA196 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 48F8D6458E1AC9921CEA8C49412267001F0BF29E352D6BE7A6B4F819022A5036051465DB3A675538A3CC8F5C34 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 99D9544A4ADB2C4397DAFA40237878149A8B0C29F39B73038ABAF41B39080B66805ED421987C50FD427A1C656E + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 242547FF0714192EBF91F15B3D75273E3967F867196A2C1651541602DB392B963B2F01C11C7958FA9425E1E53B + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = C6D7E32BE22CF1A624D1D6F3088F7A7B04059403C8C787F30042DC1D7BDDAEDCA32A3B61712535FF921ECE82E7 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = E4ADB000D77D823B2EC395491AF63C30D01C012D59E1BBAE9D4B50240E014FCC67ABA8FCAE23CEBE96E69B66D985 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 0EFE89AA64920BC1E09702790301B0E1CC1EED4CB5E7A104570C9928D7F3198EE24D1E677B2699704F7E0B7EBF6A + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 1A060CF96B980A9D041A9B4745F16A36AD8B24405B7116882911FC12205EDBF28B13E87D10E860D443130E9DB255 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = A48822320C9DADD7CC2871AE049ADF19C7A9C8D5BF6C9AF3E8CD83621F571B4E1BAA9689C5CF5EF456FACD3D06BC + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = A573B83B6AB5AB75833FF19BAC4FDFC9B620671454896543516720F3500631D2126AFCB6D4808E79BE3EAE610D1A + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 3C84C22EE46B607D3D4B3CC728698AC01F407E5C69EB2B28D2C9EBADB9202D2A8A1C8DBEA1C8EAF9CCECD7D88A60 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = CEA9CC7C944E721750A1BC1143C610A8A289969A9885C40EA089B723CBBED5BC219FD4D8109E45E22BCBD2D7492A + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 6D16CD84D3AEECE0EB0B124EC03BF547DD4BB7D36EABEC41925090E8516D8029DF15FC0A8F7AFAB5A6BB41B7FBCA + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 2A3543B8C7604CA113A8D31E17CAFCBBB2843D38A3A5113C4B4D2E84A834FC168CE46DDB0A1E42B31AFE5366C465 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 07A19BB9223316A1E207C52E79AB8EFD14457416C2DD0E5AFE609472B846AC8FB95DCB23FEFCC4ACE038BBE4FFC3 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 4F3FB3B74E484C7BD6CC7A13FCBBF364FDD31387C15690E85D056F3A3616AD8E7AF3656DCAC6AC8CD0F21FD825BE + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = C3990661C17D7C1F66C70E6F9980A0FC96C23F0235D9B7508EC611BF763076572F12D1373B5D1AE4FA23ED784952 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = A3FC5BBC457A5C138143F0B41F5486921A8D5AF1238CCE61081C6FC1FB013DD555B47AA90CC1F87325DEF3F4DB0A + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 992D7190D8FDFD0FCEB3E6FCB67E876289559D46D89DFB1B58E8F25AD5F9D320CBDAC7B364A37A675A55A86E01BA + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 613D9ED9CEA3BF3841A469E671FAE43C4E093B8C595986116A03B38FA2AA9AC5AAEA7D00CD838896B57D7BA34351 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = 82009068777F098DF837691D7A8B4A52DAAFFB545674B6A71291EEDB20E5E49E828E8BB16B6B42162B97214ECDB9 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 082DC66E7BAE9FA948E6630327EF93568CBF9C55E4CA5EF12AAFE995463DC64D0BCD5A46DDD4C9B728CFF02A5D55 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = FAA0B3A7F49E169FAD255C07E70E7F8B35BF90A28F245A944F35BFBBFB4C5DC90839F0C14AD211E1781D14F5C785 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 0C58E0D295C526973651603028F35483D1740B4FAB084E54433947C2C881CA2C269905E61F9A3AA201D644EC5F08 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A4570A3FCB168B22DC50B35A92B7CDB73E0BFA86F331904643103BCCF2B5500BA91F91C6BD6FBE25B77B65019B2A + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = BA5D69C404EC0EDD26E618933AD805185CE6DE628A9240D731D83FBE941121CBB981E396CAB697B6DDAF6427D6D6 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 8500E038B4EEB39701DB4B6EEB0119F9A1AF6815AB7395DE9F3AE618658CBB7AAAFA16E9ED454FCC87698EBC7C89 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 53FDD10A49BFF42B6C4236665DFD46DEFB1F060FCFCA6437500A6975D855AA1C85CD4276A26CF2D5B9868369DB31 + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = B2400087E387BCCD2975BC46C542BE97AEB11607ED5460C3A4AC07B0E3611053671F0C017190BDCE3BA505357529 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 0B3A186888E14C5EAEA401A1F825808C0287723B36E2FF40A78FFEB7C2CDE56F971BE186EDAB6C774476504C68B8 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A328682A4A93B278985A4CD8954D4E7C8CF3B58D78F5CA1614C5235410296A389E4C31C3621A7A50D461DB61CAD2 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 20C23798768D20CB869EBAEEF35A3F0508ABC80F7501DE318ADC949C122448A916093C4B1D42FCB704FF43CC2E46 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = AF3D2170EFF0D9BBF99490792725B9A3019B7EBEDB4A3C94B70ED2A33315363179EC70912AEAC8DAF72019A478D9 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = C5400730AB373145141A113E6A55E6D74DC27DA4C99E5EBC8FE09E4FF85E8D6100B92EA0E08450EE3F8C3C8325EA + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 92822E47F36294D89650D7415E7377C317138341A61167F4837201A9149D4AA0EAB86F737C63348952325E2839AD + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = B1848F2E2A65B35E987E2EB4A347470A88E785F604A2CFF8A13C6D7F38AC3B281F7A2D9A836CCCC58140A20C147F + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = FD7CCA6C1F5897F318CAF5CC8AA83ED133B0F633E49B043995389D46FF314BED81F04B9A36CD6404D0088C4E795B + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = B925AD0C316E1839C088F6089579A8C1E75253371AABFF11FE7918D4ADCD79E40BBA3D4EFEE4D22F1DDCD9564239 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 790193BB1C25437DEEE6FD1BB7E2B620F24F3BE210552D29B164613F0D007ACF17EBFAF69C7931CF76731234D084F6 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 83E65CB6C4DCC2C0055EE5B46A9926B33CA1453FBEC334FD012AFDA4C54A0FE903BAA821C1D0B124C44942AA6F1A5F + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 80AAEDA17DA227CF8B02A936A232CD4E9BC2504D6E782BD1D96C04FDE3ADD9054C3ED022074305BC4EF6FD2CAE9D2B + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 2AF074E517322F2722A09412E1CD67FFB02B7AF0590DDF8DF22B3F97B8A6EF9E58E19A37450569A94296F7A71510B9 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 718390EBA9C83938F19170093C8DB99D9C842E3F636DBE258AB88ECACD4BE8BF40131DD3262E9A325F11379C049AF1 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = AEBA7F198399E899585CC00BDC44E9855701CA8F116B8D6DAAEB19904CE0307BBB4549A3B4D2A999D7F4885BEA9BD9 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 6BE7DF3299585C843F57F628EEAF8329A9666921BC067CB527E5491E6CF3B31960D95CAD57C918EFBC4DFF3FE71C6C + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 2060B5D0CB2BBBBE9DB15558E8E67615D6D093AA535552E9672F98445E127E1B1D845FD0FE362B23B42C1C6A46DDC9 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = A2D997122FC5AFB4C0D13FA8E072CC3A362E2170E4D664C01972D563431AB39E961D4C6E01927E87EB4C65C6287AD1 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 9F16D744D0419A7259A5F28F68DCD64767CA45C04322C072EC45B751333AEDA9F8551E7A9BA6BB415F28B5777510A6 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 353BAE23BFCA3DB7EFB90939E6BD62B4B136F301A5BA2CB9F634C32F9CC9D3420B9EDFE6A0570541880F96676FB633 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 7763680F84EA1ACBBA63E4E30C91F8E4453EBD6A3A6AC2A52701AC16134CB76C12C561FBE73D287D7002BCF0BFB837 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 3D8801CA6055C29CAFBE886C6EEF1F51B46F7A54A5D6737D61751E875463C2211BB9C1E970EAB2077D995927748B5F + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 5DC2B24CA84F938740375B57858DDB62A098AFA58FC61BBC6E88A521A1C250FF6E068552786E4E139CD8EF21F6502F + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = F011652DB1DF1FE18A5CF42426DE3893B8D922538936674E4F6923FBCD07C3FDA605291CA42AFDC8BE621CFD1DE435 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 471FA2C8A04D8271B7D861C42CEDF1A87A628BDECBBE069BD949A2B61F496949C9D63B51525CD92E688A5784BF480E + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = AC33C89A97E953D90DC05B55102ABBEE98743F32A2EB14DA98BA55D79515601EAFE94F6BFF320DE6E6BF66810FF4E6 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5479C0525F7547AC6FA232E155E272D716F7FD9AD3AF2278196EDE4293747E86283ADC771B4F3BF0EFFE06576F0712 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 372F5BCCA5E04E7C0C22AF3E9ABE780FF4E0B9020081BF5F30C210447668AF6BBB15742828C503FE0E06C97A7D6B86 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 9066FD3299F983A0A51AA38BCD70109C90DFAFBB097B7056E653589837B1FA6BAC706E4C47BEA5FB96549F65A67598 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 108622616C3D3E8C42C6107D6E630BC4D8B793792345DE0C5C91C09FC009D06AF3CD275C0A6C564F58420ACD25F1F2 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = F51AE8741BB82C5EECDB494B1C625145CBB72EFFD7200E99B89BE333284CE24F10DE5BB8668A00CD630C9FBA24D41D + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = EE69E89B8C0FCBD0C98D72130FCA6D6275D6F6D3D0F4FA88839C75B358489C13A92FB3FD4E7E504B28A169CDC7D018 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = CB46D03CF2B6537EB2A0E1453D966CDF325A9373C46BD783C9FBE2FFB7C398A5BC000A5B2A7B7F1B57D08A3DE6D8B7 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2AB2F326BE0426B7388BD2C7C451F0522ACACFEA3A4DC337B900F49C4EF5823E84B576D85084997A9BE7BC6FC0854C + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = D8EDBD01F920A7B988A561DF77F5B5A6BAB460F4707FFA234C24F51F24CE8AC6C503C528CC4F2B7381FCA10E68C688 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4D8FC988C8BF8D8D5F5DE5158083E6566F73CD33CF0C59F0D8804D46B695BC83FB11C5D8EE651604D0EFEEF5FE3E08 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = FD24E11765C1556D542E0CEF5BF95DB75CE1F20D6BF48850C4F80BA49F6CEAE76B6720FD7E31FC24A85AA8B39A0E39 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 1CE7219F7380046D6F1BE5CAB1AC1A4B58799E2113567C9C11A962DE52AB177BA9E22B1F536B954730FCA62656AC1D + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 498D94D46A1F4544F58511298EDBE09A81E10B0071BBF92630797AD46FF08E2F1327A6ED3C033A1E773817929A6357 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 3500972B78420A5ADE37BEAEB1959A1D5F89E1C5684454B415685B02B12EA5A521FBE10FE33CE9DE19FBCA4F6D776C + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = AA65DEB55D343669E12B2A8230CAA6C5ED528772E6AD3D441DA423BF5805DF4BEC8807FF9FF58C762BA3A3B6793AEC + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = D44647BF011AF3C7A39F0590EB84252C816C479EF804966FB3DC0C36BA6EF097A5983A3110090D09685185834EEBB1 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 7F65332D7B839D96DC14FB7B7B5F58E615502352023A44DE62C04216A8EB13C5451F5734F7F858A5CE1EAEB6D11119D8 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = BE15504A0104660E39537D0CAB08EDDACA6D5192A3029D2885BDE0A313AF7280F605A4E08497BE72295F4196E6C33BEB + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = A5A02C1CE3016EB8332F01CE89ECDDDC9552EFE89CAC38E60314B0322E2238DFA05AC353B82D4D51FF0316EFD7FD38B1 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 3664068029067BF058B31AAFFFBA64FFAB0FE55D27A86706E95CA8A74C3AD91BE939F5FA2D0DD954505A84BF5B06EEED + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = A5EE864EAF074F21D031BE145A7B18239A209C35FF78E5CF420583EE4CD1CE12F389119E91970964DA4BB5123ECCFBAD + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 39F6472BF1026464DB27FF18DAC8F430EFCC41E6F3E7D27761BF095A645BAABA18C6FBEAD8EA045AB80558B074A4CCB4 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = C58C0F0E6D0B8A9CE15DF052E4633859B176CCD4F665BFF2031F9EF9E1C0D088F179C4E99E6433CFFDE9A0300DC02048 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 4A1197B82435CF774A946E00F5627014E409150A2DF1EF2EEFB25BA95F188292FFAFC43B70BBF1E3791547D2BE409989 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = A6E1A157F63791E4BF77A3F4A46C11C2315820D7C216FF374C15E337FDDAEDE9BEF06D1B5CF9A9D278FCA018C4C017B1 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 183D7ABD1F7C7AF1FBFC6A886F05E4669DD5F268B2ED6E99A99ADBAE00FBDBF864641F96276475C1882FD137697F5907 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = CD0C0994EC351CBD90F45F2DC1991D3F654ACADC7D85528FC1307293658D2312F1A82D57A02FC05A058B9A938FA0C7FF + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = A95E819DDBCBE32DBC3A2E20F2AFCFC9F40AD0CAEFEDBF97DED9EC6FF9F7EDBB2954AE40BBCF57F3115006C26AA45DAE + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 1840A4C446E52ADE3AA2F24694FA71247AC6F3CFF6E1077B6EE758683CBEECE2118131DC605AA805010C0ACB00365865 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 981DB0BD0A8C231D03BC321F6EDE52536BB77A5C484718E5B497604E5B70B5CCEB3573FFA6DC6499AD949C682BCE6398 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 144C7DE3905DC3E8F338DB432380184D62DE08752AFB82FDFC730BD986E6A6E9BA9D8E5A005D9C73CF47F19E9543B941 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 60DC5F04EC92272D36B900304385EEB35CE9C776B0F8136262F07D7F68736C77148CD3C52B39A21477D3F6D8FBF4B9FD + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 4BF522D015DCA85035D9DEB608FF3CE97D2AEA4383748DA312D8BA480B481FE0D16EA3B4BCA440049CD1195EFBC3E8E3 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = DD59A156D4509B1A79B75AFDD1518405B1664350F2821E3F35962033EF44798AF85AD51C055482F028DF64B92E14EC4F + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D77B73377E39CE033CBAB9DD29050D744D5ED225418EA82DA1047A3581C28C77BB860DF61EBA2C173F7C44D7B57184DF + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = BE29580C6F7BCC9D232F268F6328668BEB97E21CF1CDE68FE8DF609AC8E1201FEA535E4425C354BE6575164CBDF4207A + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 406513CE38A3A135495C4CB17C112960FB04AB01B6B6BCF631090E9F6E22AEFDD5444E5310754D595856767A3070EE8C + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 153D5A126557F57030D6AC4BC5F18F0F7578224421D0CA612D3951DA288A6D0F9E1B2510735EDE9CB1208B7772D8E13D + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E73BFBF8BD3650B2A26D24F70DF0A13DE718B775C600AACB503F69EDB1658DF53645F3548590CC65FAFF0CB6B7B285AB + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = C76AEEDBEED3992046A598DC0978FB8AB47C731322F5E759E47430AC3A8CED8F6D38FC5363DE43AC7F0A27D908317266 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 2C0AAF580F52F3EE90548911CFBBC030BF119A491B753302296799DFA1910D454C47E4FFB613D74DA746D367C086615B + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = A528D37B2F774355F4872D9E4000AEDA1FB2448FB0DE6E3A7DC57A350E6AB6CEA2FC0572B8012DC29E46BAB0D9874E4E + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 4D4104ECB4E656BB41351EF294B88E385C14D949EC5C5C757BE3AADF40841082F763B61117950FBB8210836D241C3480 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 4D1C23EAF6626EA67B51EF4E1A4735981D3428E87E5388308D1DBBDA8830C9930926439AB1DD92E99E3AD82CBAFDA84E + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = F196E21EF9D0D19D9F1A4429B49CC04A0ECA31674F9D99BEF71B48353A2452C5D5EB0EB5D85DF8E41534F3A5DBA23290 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 8C962B03F6B0211076E7E09D0FAA2DA78440CF2BFC8295ECF093FD0B59F13D752C2CA9E312EBF38160EDCD6DB2BD7416 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 35BF8ECC498172FA86E73131E2188DF55756035242CC26D30EB293D47914F2F3D4E38C43E6807AF5B52F572B610C77B9 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 3188823982684B8819B4D6308EB6585B5208672979FF678D910324C16A4DD9014F63721F7A25D47C8196216F8D46DAF9 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 7D8154A8A2C9D4476C479FDB99D85FFAAE0C666C6CCA97F0AB05323B7635C8520D3F3E695B54ABB4321812B8D7FC32C8 + diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.c b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/api.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/api.h new file mode 100644 index 0000000..c3c0a27 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/encrypt.c b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..a358142 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "sundae-gift.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_96_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return sundae_gift_96_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128-config.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128-config.h new file mode 100644 index 0000000..62131ba --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128-config.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_CONFIG_H +#define LW_INTERNAL_GIFT128_CONFIG_H + +/** + * \file internal-gift128-config.h + * \brief Configures the variant of GIFT-128 to use. + */ + +/** + * \brief Select the full variant of GIFT-128. + * + * The full variant requires 320 bytes for the key schedule and uses the + * fixslicing method to implement encryption and decryption. + */ +#define GIFT128_VARIANT_FULL 0 + +/** + * \brief Select the small variant of GIFT-128. + * + * The small variant requires 80 bytes for the key schedule. The rest + * of the key schedule is expanded on the fly during encryption. + * + * The fixslicing method is used to implement encryption and the slower + * bitslicing method is used to implement decryption. The small variant + * is suitable when memory is at a premium, decryption is not needed, + * but encryption performance is still important. + */ +#define GIFT128_VARIANT_SMALL 1 + +/** + * \brief Select the tiny variant of GIFT-128. + * + * The tiny variant requires 16 bytes for the key schedule and uses the + * bitslicing method to implement encryption and decryption. It is suitable + * for use when memory is very tight and performance is not critical. + */ +#define GIFT128_VARIANT_TINY 2 + +/** + * \def GIFT128_VARIANT + * \brief Selects the default variant of GIFT-128 to use on this platform. + */ +/** + * \def GIFT128_VARIANT_ASM + * \brief Defined to 1 if the GIFT-128 implementation has been replaced + * with an assembly code version. + */ +#if defined(__AVR__) && !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 1 +#endif +#if !defined(GIFT128_VARIANT) +#define GIFT128_VARIANT GIFT128_VARIANT_FULL +#endif +#if !defined(GIFT128_VARIANT_ASM) +#define GIFT128_VARIANT_ASM 0 +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.c b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.c new file mode 100644 index 0000000..c6ac5ec --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.c @@ -0,0 +1,1498 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-gift128.h" +#include "internal-util.h" + +#if !GIFT128_VARIANT_ASM + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/* Round constants for GIFT-128 in the fixsliced representation */ +static uint32_t const GIFT128_RC_fixsliced[40] = { + 0x10000008, 0x80018000, 0x54000002, 0x01010181, 0x8000001f, 0x10888880, + 0x6001e000, 0x51500002, 0x03030180, 0x8000002f, 0x10088880, 0x60016000, + 0x41500002, 0x03030080, 0x80000027, 0x10008880, 0x4001e000, 0x11500002, + 0x03020180, 0x8000002b, 0x10080880, 0x60014000, 0x01400002, 0x02020080, + 0x80000021, 0x10000080, 0x0001c000, 0x51000002, 0x03010180, 0x8000002e, + 0x10088800, 0x60012000, 0x40500002, 0x01030080, 0x80000006, 0x10008808, + 0xc001a000, 0x14500002, 0x01020181, 0x8000001a +}; + +#endif + +#if GIFT128_VARIANT != GIFT128_VARIANT_FULL + +/* Round constants for GIFT-128 in the bitsliced representation */ +static uint8_t const GIFT128_RC[40] = { + 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3E, 0x3D, 0x3B, + 0x37, 0x2F, 0x1E, 0x3C, 0x39, 0x33, 0x27, 0x0E, + 0x1D, 0x3A, 0x35, 0x2B, 0x16, 0x2C, 0x18, 0x30, + 0x21, 0x02, 0x05, 0x0B, 0x17, 0x2E, 0x1C, 0x38, + 0x31, 0x23, 0x06, 0x0D, 0x1B, 0x36, 0x2D, 0x1A +}; + +#endif + +/* http://programming.sirrida.de/perm_fn.html#bit_permute_step */ +#define bit_permute_step(_y, mask, shift) \ + do { \ + uint32_t y = (_y); \ + uint32_t t = ((y >> (shift)) ^ y) & (mask); \ + (_y) = (y ^ t) ^ (t << (shift)); \ + } while (0) + +/* + * The permutation below was generated by the online permuation generator at + * "http://programming.sirrida.de/calcperm.php". + * + * All of the permutuations are essentially the same, except that each is + * rotated by 8 bits with respect to the next: + * + * P0: 0 24 16 8 1 25 17 9 2 26 18 10 3 27 19 11 4 28 20 12 5 29 21 13 6 30 22 14 7 31 23 15 + * P1: 8 0 24 16 9 1 25 17 10 2 26 18 11 3 27 19 12 4 28 20 13 5 29 21 14 6 30 22 15 7 31 23 + * P2: 16 8 0 24 17 9 1 25 18 10 2 26 19 11 3 27 20 12 4 28 21 13 5 29 22 14 6 30 23 15 7 31 + * P3: 24 16 8 0 25 17 9 1 26 18 10 2 27 19 11 3 28 20 12 4 29 21 13 5 30 22 14 6 31 23 15 7 + * + * The most efficient permutation from the online generator was P3, so we + * perform it as the core of the others, and then perform a final rotation. + * + * It is possible to do slightly better than "P3 then rotate" on desktop and + * server architectures for the other permutations. But the advantage isn't + * as evident on embedded platforms so we keep things simple. + */ +#define PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define PERM0(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate8(_x); \ + } while (0) +#define PERM1(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate16(_x); \ + } while (0) +#define PERM2(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = leftRotate24(_x); \ + } while (0) +#define PERM3(x) \ + do { \ + uint32_t _x = (x); \ + PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +#define INV_PERM3_INNER(x) \ + do { \ + bit_permute_step(x, 0x00550055, 9); \ + bit_permute_step(x, 0x00003333, 18); \ + bit_permute_step(x, 0x000f000f, 12); \ + bit_permute_step(x, 0x000000ff, 24); \ + } while (0) +#define INV_PERM0(x) \ + do { \ + uint32_t _x = rightRotate8(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM1(x) \ + do { \ + uint32_t _x = rightRotate16(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM2(x) \ + do { \ + uint32_t _x = rightRotate24(x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) +#define INV_PERM3(x) \ + do { \ + uint32_t _x = (x); \ + INV_PERM3_INNER(_x); \ + (x) = _x; \ + } while (0) + +/** + * \brief Converts the GIFT-128 nibble-based representation into word-based. + * + * \param output Output buffer to write the word-based version to. + * \param input Input buffer to read the nibble-based version from. + * + * The \a input and \a output buffers can be the same buffer. + */ +static void gift128n_to_words + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input buffer into 32-bit words. We use the nibble order + * from the HYENA submission to NIST which is byte-reversed with respect + * to the nibble order of the original GIFT-128 paper. Nibble zero is in + * the first byte instead of the last, which means little-endian order. */ + s0 = le_load_word32(input + 12); + s1 = le_load_word32(input + 8); + s2 = le_load_word32(input + 4); + s3 = le_load_word32(input); + + /* Rearrange the bits so that bits 0..3 of each nibble are + * scattered to bytes 0..3 of each word. The permutation is: + * + * 0 8 16 24 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 + * + * Generated with "http://programming.sirrida.de/calcperm.php". + */ + #define PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x0a0a0a0a, 3); \ + bit_permute_step(x, 0x00cc00cc, 6); \ + bit_permute_step(x, 0x0000f0f0, 12); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + PERM_WORDS(s0); + PERM_WORDS(s1); + PERM_WORDS(s2); + PERM_WORDS(s3); + + /* Rearrange the bytes and write them to the output buffer */ + output[0] = (uint8_t)s0; + output[1] = (uint8_t)s1; + output[2] = (uint8_t)s2; + output[3] = (uint8_t)s3; + output[4] = (uint8_t)(s0 >> 8); + output[5] = (uint8_t)(s1 >> 8); + output[6] = (uint8_t)(s2 >> 8); + output[7] = (uint8_t)(s3 >> 8); + output[8] = (uint8_t)(s0 >> 16); + output[9] = (uint8_t)(s1 >> 16); + output[10] = (uint8_t)(s2 >> 16); + output[11] = (uint8_t)(s3 >> 16); + output[12] = (uint8_t)(s0 >> 24); + output[13] = (uint8_t)(s1 >> 24); + output[14] = (uint8_t)(s2 >> 24); + output[15] = (uint8_t)(s3 >> 24); +} + +/** + * \brief Converts the GIFT-128 word-based representation into nibble-based. + * + * \param output Output buffer to write the nibble-based version to. + * \param input Input buffer to read the word-based version from. + */ +static void gift128n_to_nibbles + (unsigned char *output, const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Load the input bytes and rearrange them so that s0 contains the + * most significant nibbles and s3 contains the least significant */ + s0 = (((uint32_t)(input[12])) << 24) | + (((uint32_t)(input[8])) << 16) | + (((uint32_t)(input[4])) << 8) | + ((uint32_t)(input[0])); + s1 = (((uint32_t)(input[13])) << 24) | + (((uint32_t)(input[9])) << 16) | + (((uint32_t)(input[5])) << 8) | + ((uint32_t)(input[1])); + s2 = (((uint32_t)(input[14])) << 24) | + (((uint32_t)(input[10])) << 16) | + (((uint32_t)(input[6])) << 8) | + ((uint32_t)(input[2])); + s3 = (((uint32_t)(input[15])) << 24) | + (((uint32_t)(input[11])) << 16) | + (((uint32_t)(input[7])) << 8) | + ((uint32_t)(input[3])); + + /* Apply the inverse of PERM_WORDS() from the function above */ + #define INV_PERM_WORDS(_x) \ + do { \ + uint32_t x = (_x); \ + bit_permute_step(x, 0x00aa00aa, 7); \ + bit_permute_step(x, 0x0000cccc, 14); \ + bit_permute_step(x, 0x00f000f0, 4); \ + bit_permute_step(x, 0x0000ff00, 8); \ + (_x) = x; \ + } while (0) + INV_PERM_WORDS(s0); + INV_PERM_WORDS(s1); + INV_PERM_WORDS(s2); + INV_PERM_WORDS(s3); + + /* Store the result into the output buffer as 32-bit words */ + le_store_word32(output + 12, s0); + le_store_word32(output + 8, s1); + le_store_word32(output + 4, s2); + le_store_word32(output, s3); +} + +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_encrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + gift128n_to_words(output, input); + gift128b_decrypt(ks, output, output); + gift128n_to_nibbles(output, output); +} + +#if GIFT128_VARIANT != GIFT128_VARIANT_TINY + +/** + * \brief Swaps bits within two words. + * + * \param a The first word. + * \param b The second word. + * \param mask Mask for the bits to shift. + * \param shift Shift amount in bits. + */ +#define gift128b_swap_move(a, b, mask, shift) \ + do { \ + uint32_t tmp = ((b) ^ ((a) >> (shift))) & (mask); \ + (b) ^= tmp; \ + (a) ^= tmp << (shift); \ + } while (0) + +/** + * \brief Derives the next 10 fixsliced keys in the key schedule. + * + * \param next Points to the buffer to receive the next 10 keys. + * \param prev Points to the buffer holding the previous 10 keys. + * + * The \a next and \a prev buffers are allowed to be the same. + */ +#define gift128b_derive_keys(next, prev) \ + do { \ + /* Key 0 */ \ + uint32_t s = (prev)[0]; \ + uint32_t t = (prev)[1]; \ + gift128b_swap_move(t, t, 0x00003333U, 16); \ + gift128b_swap_move(t, t, 0x55554444U, 1); \ + (next)[0] = t; \ + /* Key 1 */ \ + s = leftRotate8(s & 0x33333333U) | leftRotate16(s & 0xCCCCCCCCU); \ + gift128b_swap_move(s, s, 0x55551100U, 1); \ + (next)[1] = s; \ + /* Key 2 */ \ + s = (prev)[2]; \ + t = (prev)[3]; \ + (next)[2] = ((t >> 4) & 0x0F000F00U) | ((t & 0x0F000F00U) << 4) | \ + ((t >> 6) & 0x00030003U) | ((t & 0x003F003FU) << 2); \ + /* Key 3 */ \ + (next)[3] = ((s >> 6) & 0x03000300U) | ((s & 0x3F003F00U) << 2) | \ + ((s >> 5) & 0x00070007U) | ((s & 0x001F001FU) << 3); \ + /* Key 4 */ \ + s = (prev)[4]; \ + t = (prev)[5]; \ + (next)[4] = leftRotate8(t & 0xAAAAAAAAU) | \ + leftRotate16(t & 0x55555555U); \ + /* Key 5 */ \ + (next)[5] = leftRotate8(s & 0x55555555U) | \ + leftRotate12(s & 0xAAAAAAAAU); \ + /* Key 6 */ \ + s = (prev)[6]; \ + t = (prev)[7]; \ + (next)[6] = ((t >> 2) & 0x03030303U) | ((t & 0x03030303U) << 2) | \ + ((t >> 1) & 0x70707070U) | ((t & 0x10101010U) << 3); \ + /* Key 7 */ \ + (next)[7] = ((s >> 18) & 0x00003030U) | ((s & 0x01010101U) << 3) | \ + ((s >> 14) & 0x0000C0C0U) | ((s & 0x0000E0E0U) << 15) | \ + ((s >> 1) & 0x07070707U) | ((s & 0x00001010U) << 19); \ + /* Key 8 */ \ + s = (prev)[8]; \ + t = (prev)[9]; \ + (next)[8] = ((t >> 4) & 0x0FFF0000U) | ((t & 0x000F0000U) << 12) | \ + ((t >> 8) & 0x000000FFU) | ((t & 0x000000FFU) << 8); \ + /* Key 9 */ \ + (next)[9] = ((s >> 6) & 0x03FF0000U) | ((s & 0x003F0000U) << 10) | \ + ((s >> 4) & 0x00000FFFU) | ((s & 0x0000000FU) << 12); \ + } while (0) + +/** + * \brief Compute the round keys for GIFT-128 in the fixsliced representation. + * + * \param ks Points to the key schedule to initialize. + * \param k0 First key word. + * \param k1 Second key word. + * \param k2 Third key word. + * \param k3 Fourth key word. + */ +static void gift128b_compute_round_keys + (gift128b_key_schedule_t *ks, + uint32_t k0, uint32_t k1, uint32_t k2, uint32_t k3) +{ + unsigned index; + uint32_t temp; + + /* Set the regular key with k0 and k3 pre-swapped for the round function */ + ks->k[0] = k3; + ks->k[1] = k1; + ks->k[2] = k2; + ks->k[3] = k0; + + /* Pre-compute the keys for rounds 3..10 and permute into fixsliced form */ + for (index = 4; index < 20; index += 2) { + ks->k[index] = ks->k[index - 3]; + temp = ks->k[index - 4]; + temp = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + ks->k[index + 1] = temp; + } + for (index = 0; index < 20; index += 10) { + /* Keys 0 and 10 */ + temp = ks->k[index]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index] = temp; + + /* Keys 1 and 11 */ + temp = ks->k[index + 1]; + gift128b_swap_move(temp, temp, 0x00550055U, 9); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 1] = temp; + + /* Keys 2 and 12 */ + temp = ks->k[index + 2]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 2] = temp; + + /* Keys 3 and 13 */ + temp = ks->k[index + 3]; + gift128b_swap_move(temp, temp, 0x11111111U, 3); + gift128b_swap_move(temp, temp, 0x03030303U, 6); + gift128b_swap_move(temp, temp, 0x000F000FU, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 3] = temp; + + /* Keys 4 and 14 */ + temp = ks->k[index + 4]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 4] = temp; + + /* Keys 5 and 15 */ + temp = ks->k[index + 5]; + gift128b_swap_move(temp, temp, 0x0000AAAAU, 15); + gift128b_swap_move(temp, temp, 0x00003333U, 18); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 5] = temp; + + /* Keys 6 and 16 */ + temp = ks->k[index + 6]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 6] = temp; + + /* Keys 7 and 17 */ + temp = ks->k[index + 7]; + gift128b_swap_move(temp, temp, 0x0A0A0A0AU, 3); + gift128b_swap_move(temp, temp, 0x00CC00CCU, 6); + gift128b_swap_move(temp, temp, 0x0000F0F0U, 12); + gift128b_swap_move(temp, temp, 0x000000FFU, 24); + ks->k[index + 7] = temp; + + /* Keys 8, 9, 18, and 19 do not need any adjustment */ + } + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + /* Derive the fixsliced keys for the remaining rounds 11..40 */ + for (index = 20; index < 80; index += 10) { + gift128b_derive_keys(ks->k + index, ks->k + index - 20); + } +#endif +} + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + gift128b_compute_round_keys + (ks, be_load_word32(key), be_load_word32(key + 4), + be_load_word32(key + 8), be_load_word32(key + 12)); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission */ + gift128b_compute_round_keys + (ks, le_load_word32(key + 12), le_load_word32(key + 8), + le_load_word32(key + 4), le_load_word32(key)); +} + +/** + * \brief Performs the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_sbox(s0, s1, s2, s3) \ + do { \ + s1 ^= s0 & s2; \ + s0 ^= s1 & s3; \ + s2 ^= s0 | s1; \ + s3 ^= s2; \ + s1 ^= s3; \ + s3 ^= 0xFFFFFFFFU; \ + s2 ^= s0 & s1; \ + } while (0) + +/** + * \brief Performs the inverse of the GIFT-128 S-box on the bit-sliced state. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_sbox(s0, s1, s2, s3) \ + do { \ + s2 ^= s3 & s1; \ + s0 ^= 0xFFFFFFFFU; \ + s1 ^= s0; \ + s0 ^= s2; \ + s2 ^= s3 | s1; \ + s3 ^= s1 & s0; \ + s1 ^= s3 & s2; \ + } while (0) + +/** + * \brief Permutes the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 3) & 0x11111111U) | ((s2 & 0x77777777U) << 1); \ + s3 = ((s3 >> 1) & 0x77777777U) | ((s3 & 0x11111111U) << 3); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 4) & 0x0FFF0FFFU) | ((s0 & 0x000F000FU) << 12); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 12) & 0x000F000FU) | ((s2 & 0x0FFF0FFFU) << 4); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s3 = leftRotate16(s3); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 6) & 0x03030303U) | ((s0 & 0x3F3F3F3FU) << 2); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 2) & 0x3F3F3F3FU) | ((s2 & 0x03030303U) << 6); \ + } while (0); + +/** + * \brief Permutes the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = rightRotate8(s2); \ + s3 = leftRotate8(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 1st and 2nd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_1(s0, s1, s2, s3) \ + do { \ + s1 = ((s1 >> 2) & 0x33333333U) | ((s1 & 0x33333333U) << 2); \ + s2 = ((s2 >> 1) & 0x77777777U) | ((s2 & 0x11111111U) << 3); \ + s3 = ((s3 >> 3) & 0x11111111U) | ((s3 & 0x77777777U) << 1); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 2nd and 3rd mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_2(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 12) & 0x000F000FU) | ((s0 & 0x0FFF0FFFU) << 4); \ + s1 = ((s1 >> 8) & 0x00FF00FFU) | ((s1 & 0x00FF00FFU) << 8); \ + s2 = ((s2 >> 4) & 0x0FFF0FFFU) | ((s2 & 0x000F000FU) << 12); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 3rd and 4th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_3(s0, s1, s2, s3) \ + do { \ + gift128b_swap_move(s1, s1, 0x55555555U, 1); \ + gift128b_swap_move(s2, s2, 0x00005555U, 1); \ + s2 = leftRotate16(s2); \ + gift128b_swap_move(s3, s3, 0x55550000U, 1); \ + s3 = leftRotate16(s3); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 4th and 5th mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_4(s0, s1, s2, s3) \ + do { \ + s0 = ((s0 >> 2) & 0x3F3F3F3FU) | ((s0 & 0x03030303U) << 6); \ + s1 = ((s1 >> 4) & 0x0F0F0F0FU) | ((s1 & 0x0F0F0F0FU) << 4); \ + s2 = ((s2 >> 6) & 0x03030303U) | ((s2 & 0x3F3F3F3FU) << 2); \ + } while (0); + +/** + * \brief Inverts the GIFT-128 state between the 5th and 1st mini-rounds. + * + * \param s0 First word of the bit-sliced state. + * \param s1 Second word of the bit-sliced state. + * \param s2 Third word of the bit-sliced state. + * \param s3 Fourth word of the bit-sliced state. + */ +#define gift128b_inv_permute_state_5(s0, s1, s2, s3) \ + do { \ + s1 = leftRotate16(s1); \ + s2 = leftRotate8(s2); \ + s3 = rightRotate8(s3); \ + } while (0); + +/** + * \brief Performs five fixsliced encryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + * + * The permutation is restructured so that one of the words each round + * does not need to be permuted, with the others rotating left, up, right, + * and down to keep the bits in line with their non-moving counterparts. + * This reduces the number of shifts required significantly. + * + * At the end of five rounds, the bit ordering will return to the + * original position. We then repeat the process for the next 5 rounds. + */ +#define gift128b_encrypt_5_rounds(rk, rc) \ + do { \ + /* 1st round - S-box, rotate left, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_1(s0, s1, s2, s3); \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + \ + /* 2nd round - S-box, rotate up, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_2(s0, s1, s2, s3); \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_3(s0, s1, s2, s3); \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + \ + /* 4th round - S-box, rotate left and swap rows, add round key */ \ + gift128b_sbox(s3, s1, s2, s0); \ + gift128b_permute_state_4(s0, s1, s2, s3); \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + \ + /* 5th round - S-box, rotate up, add round key */ \ + gift128b_sbox(s0, s1, s2, s3); \ + gift128b_permute_state_5(s0, s1, s2, s3); \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + \ + /* Swap s0 and s3 in preparation for the next 1st round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + } while (0) + +/** + * \brief Performs five fixsliced decryption rounds for GIFT-128. + * + * \param rk Points to the 10 round keys for these rounds. + * \param rc Points to the round constants for these rounds. + * + * We perform all 40 rounds of the fixsliced GIFT-128 five at a time. + */ +#define gift128b_decrypt_5_rounds(rk, rc) \ + do { \ + /* Swap s0 and s3 in preparation for the next 5th round */ \ + s0 ^= s3; \ + s3 ^= s0; \ + s0 ^= s3; \ + \ + /* 5th round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[8]; \ + s2 ^= (rk)[9]; \ + s0 ^= (rc)[4]; \ + gift128b_inv_permute_state_5(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 4th round - S-box, rotate right and swap rows, add round key */ \ + s1 ^= (rk)[6]; \ + s2 ^= (rk)[7]; \ + s3 ^= (rc)[3]; \ + gift128b_inv_permute_state_4(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 3rd round - S-box, swap columns, add round key */ \ + s1 ^= (rk)[4]; \ + s2 ^= (rk)[5]; \ + s0 ^= (rc)[2]; \ + gift128b_inv_permute_state_3(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + \ + /* 2nd round - S-box, rotate down, add round key */ \ + s1 ^= (rk)[2]; \ + s2 ^= (rk)[3]; \ + s3 ^= (rc)[1]; \ + gift128b_inv_permute_state_2(s0, s1, s2, s3); \ + gift128b_inv_sbox(s0, s1, s2, s3); \ + \ + /* 1st round - S-box, rotate right, add round key */ \ + s1 ^= (rk)[0]; \ + s2 ^= (rk)[1]; \ + s0 ^= (rc)[0]; \ + gift128b_inv_permute_state_1(s0, s1, s2, s3); \ + gift128b_inv_sbox(s3, s1, s2, s0); \ + } while (0) + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key) +{ + /* Mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = be_load_word32(key + 12); + ks->k[1] = be_load_word32(key + 4); + ks->k[2] = be_load_word32(key + 8); + ks->k[3] = be_load_word32(key); +} + +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key) +{ + /* Use the little-endian key byte order from the HYENA submission + * and mirror the fixslicing word order of 3, 1, 2, 0 */ + ks->k[0] = le_load_word32(key); + ks->k[1] = le_load_word32(key + 8); + ks->k[2] = le_load_word32(key + 4); + ks->k[3] = le_load_word32(key + 12); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t k[20]; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_derive_keys(k, ks->k); + gift128b_derive_keys(k + 10, ks->k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_derive_keys(k, k); + gift128b_derive_keys(k + 10, k + 10); + gift128b_encrypt_5_rounds(k, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(k + 10, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#elif GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into local variables */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the last we add the tweak value to the state */ + gift128b_encrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_encrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_TINY */ + +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer */ + s0 = input[0]; + s1 = input[1]; + s2 = input[2]; + s3 = input[3]; + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer */ + output[0] = s0; + output[1] = s1; + output[2] = s2; + output[3] = s3; +} + +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* The key schedule is initialized with the key itself */ + w0 = ks->k[3]; + w1 = ks->k[1]; + w2 = ks->k[2]; + w3 = ks->k[0]; + + /* Perform all 40 rounds */ + for (round = 0; round < 40; ++round) { + /* SubCells - apply the S-box */ + s1 ^= s0 & s2; + s0 ^= s1 & s3; + s2 ^= s0 | s1; + s3 ^= s2; + s1 ^= s3; + s3 ^= 0xFFFFFFFFU; + s2 ^= s0 & s1; + temp = s0; + s0 = s3; + s3 = temp; + + /* PermBits - apply the 128-bit permutation */ + PERM0(s0); + PERM1(s1); + PERM2(s2); + PERM3(s3); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round]; + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if (((round + 1) % 5) == 0 && round < 39) + s0 ^= tweak; + + /* Rotate the key schedule */ + temp = w3; + w3 = w2; + w2 = w1; + w1 = w0; + w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + } + + /* Pack the state into the ciphertext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_TINY */ + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the plaintext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the ciphertext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + + /* Copy the ciphertext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Perform all 40 rounds five at a time using the fixsliced method. + * Every 5 rounds except the first we add the tweak value to the state */ + gift128b_decrypt_5_rounds(ks->k + 70, GIFT128_RC_fixsliced + 35); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 60, GIFT128_RC_fixsliced + 30); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 50, GIFT128_RC_fixsliced + 25); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 40, GIFT128_RC_fixsliced + 20); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 30, GIFT128_RC_fixsliced + 15); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 20, GIFT128_RC_fixsliced + 10); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k + 10, GIFT128_RC_fixsliced + 5); + s0 ^= tweak; + gift128b_decrypt_5_rounds(ks->k, GIFT128_RC_fixsliced); + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#else /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +/* The small variant uses fixslicing for encryption, but we need to change + * to bitslicing for decryption because of the difficulty of fast-forwarding + * the fixsliced key schedule to the end. So the tiny variant is used for + * decryption when the small variant is selected. Since the NIST AEAD modes + * for GIFT-128 only use the block encrypt operation, the inefficiencies + * in decryption don't matter all that much */ + +/** + * \def gift128b_load_and_forward_schedule() + * \brief Generate the decryption key at the end of the last round. + * + * To do that, we run the block operation forward to determine the + * final state of the key schedule after the last round: + * + * w0 = ks->k[0]; + * w1 = ks->k[1]; + * w2 = ks->k[2]; + * w3 = ks->k[3]; + * for (round = 0; round < 40; ++round) { + * temp = w3; + * w3 = w2; + * w2 = w1; + * w1 = w0; + * w0 = ((temp & 0xFFFC0000U) >> 2) | ((temp & 0x00030000U) << 14) | + * ((temp & 0x00000FFFU) << 4) | ((temp & 0x0000F000U) >> 12); + * } + * + * We can short-cut all of the above by noticing that we don't need + * to do the word rotations. Every 4 rounds, the rotation alignment + * returns to the original position and each word has been rotated + * by applying the "2 right and 4 left" bit-rotation step to it. + * We then repeat that 10 times for the full 40 rounds. The overall + * effect is to apply a "20 right and 40 left" bit-rotation to every + * word in the key schedule. That is equivalent to "4 right and 8 left" + * on the 16-bit sub-words. + */ +#if GIFT128_VARIANT != GIFT128_VARIANT_SMALL +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#else +/* The small variant needs to also undo some of the rotations that were + * done to generate the fixsliced version of the key schedule */ +#define gift128b_load_and_forward_schedule() \ + do { \ + w0 = ks->k[3]; \ + w1 = ks->k[1]; \ + w2 = ks->k[2]; \ + w3 = ks->k[0]; \ + gift128b_swap_move(w3, w3, 0x000000FFU, 24); \ + gift128b_swap_move(w3, w3, 0x00003333U, 18); \ + gift128b_swap_move(w3, w3, 0x000F000FU, 12); \ + gift128b_swap_move(w3, w3, 0x00550055U, 9); \ + gift128b_swap_move(w1, w1, 0x000000FFU, 24); \ + gift128b_swap_move(w1, w1, 0x00003333U, 18); \ + gift128b_swap_move(w1, w1, 0x000F000FU, 12); \ + gift128b_swap_move(w1, w1, 0x00550055U, 9); \ + gift128b_swap_move(w2, w2, 0x000000FFU, 24); \ + gift128b_swap_move(w2, w2, 0x000F000FU, 12); \ + gift128b_swap_move(w2, w2, 0x03030303U, 6); \ + gift128b_swap_move(w2, w2, 0x11111111U, 3); \ + gift128b_swap_move(w0, w0, 0x000000FFU, 24); \ + gift128b_swap_move(w0, w0, 0x000F000FU, 12); \ + gift128b_swap_move(w0, w0, 0x03030303U, 6); \ + gift128b_swap_move(w0, w0, 0x11111111U, 3); \ + w0 = ((w0 & 0xFFF00000U) >> 4) | ((w0 & 0x000F0000U) << 12) | \ + ((w0 & 0x000000FFU) << 8) | ((w0 & 0x0000FF00U) >> 8); \ + w1 = ((w1 & 0xFFF00000U) >> 4) | ((w1 & 0x000F0000U) << 12) | \ + ((w1 & 0x000000FFU) << 8) | ((w1 & 0x0000FF00U) >> 8); \ + w2 = ((w2 & 0xFFF00000U) >> 4) | ((w2 & 0x000F0000U) << 12) | \ + ((w2 & 0x000000FFU) << 8) | ((w2 & 0x0000FF00U) >> 8); \ + w3 = ((w3 & 0xFFF00000U) >> 4) | ((w3 & 0x000F0000U) << 12) | \ + ((w3 & 0x000000FFU) << 8) | ((w3 & 0x0000FF00U) >> 8); \ + } while (0) +#endif + +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the ciphertext into the state buffer and convert from big endian */ + s0 = be_load_word32(input); + s1 = be_load_word32(input + 4); + s2 = be_load_word32(input + 8); + s3 = be_load_word32(input + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in big endian */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); +} + +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak) +{ + uint32_t s0, s1, s2, s3; + uint32_t w0, w1, w2, w3; + uint32_t temp; + uint8_t round; + + /* Copy the plaintext into the state buffer and convert from nibbles */ + gift128n_to_words(output, input); + s0 = be_load_word32(output); + s1 = be_load_word32(output + 4); + s2 = be_load_word32(output + 8); + s3 = be_load_word32(output + 12); + + /* Generate the decryption key at the end of the last round */ + gift128b_load_and_forward_schedule(); + + /* Perform all 40 rounds */ + for (round = 40; round > 0; --round) { + /* Rotate the key schedule backwards */ + temp = w0; + w0 = w1; + w1 = w2; + w2 = w3; + w3 = ((temp & 0x3FFF0000U) << 2) | ((temp & 0xC0000000U) >> 14) | + ((temp & 0x0000FFF0U) >> 4) | ((temp & 0x0000000FU) << 12); + + /* AddTweak - XOR in the tweak every 5 rounds except the last */ + if ((round % 5) == 0 && round < 40) + s0 ^= tweak; + + /* AddRoundKey - XOR in the key schedule and the round constant */ + s2 ^= w1; + s1 ^= w3; + s3 ^= 0x80000000U ^ GIFT128_RC[round - 1]; + + /* InvPermBits - apply the inverse of the 128-bit permutation */ + INV_PERM0(s0); + INV_PERM1(s1); + INV_PERM2(s2); + INV_PERM3(s3); + + /* InvSubCells - apply the inverse of the S-box */ + temp = s0; + s0 = s3; + s3 = temp; + s2 ^= s0 & s1; + s3 ^= 0xFFFFFFFFU; + s1 ^= s3; + s3 ^= s2; + s2 ^= s0 | s1; + s0 ^= s1 & s3; + s1 ^= s0 & s2; + } + + /* Pack the state into the plaintext buffer in nibble form */ + be_store_word32(output, s0); + be_store_word32(output + 4, s1); + be_store_word32(output + 8, s2); + be_store_word32(output + 12, s3); + gift128n_to_nibbles(output, output); +} + +#endif /* GIFT128_VARIANT_SMALL || GIFT128_VARIANT_TINY */ + +#endif /* !GIFT128_VARIANT_ASM */ diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.h new file mode 100644 index 0000000..f57d143 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128.h @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_GIFT128_H +#define LW_INTERNAL_GIFT128_H + +/** + * \file internal-gift128.h + * \brief GIFT-128 block cipher. + * + * There are three versions of GIFT-128 in use within the second round + * submissions to the NIST lightweight cryptography competition. + * + * The most efficient version for 32-bit software implementation is the + * GIFT-128-b bit-sliced version from GIFT-COFB and SUNDAE-GIFT. + * + * The second is the nibble-based version from HYENA. We implement the + * HYENA version as a wrapper around the bit-sliced version. + * + * The third version is a variant on the HYENA nibble-based version that + * includes a 4-bit tweak value for domain separation. It is used by + * the ESTATE submission to NIST. + * + * Technically there is a fourth version of GIFT-128 which is the one that + * appeared in the original GIFT-128 paper. It is almost the same as the + * HYENA version except that the byte ordering is big-endian instead of + * HYENA's little-endian. The original version of GIFT-128 doesn't appear + * in any of the NIST submissions so we don't bother with it in this library. + * + * References: https://eprint.iacr.org/2017/622.pdf, + * https://eprint.iacr.org/2020/412.pdf, + * https://giftcipher.github.io/gift/ + */ + +#include +#include +#include "internal-gift128-config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of a GIFT-128 block in bytes. + */ +#define GIFT128_BLOCK_SIZE 16 + +/** + * \var GIFT128_ROUND_KEYS + * \brief Number of round keys for the GIFT-128 key schedule. + */ +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY +#define GIFT128_ROUND_KEYS 4 +#elif GIFT128_VARIANT == GIFT128_VARIANT_SMALL +#define GIFT128_ROUND_KEYS 20 +#else +#define GIFT128_ROUND_KEYS 80 +#endif + +/** + * \brief Structure of the key schedule for GIFT-128 (bit-sliced). + */ +typedef struct +{ + /** Pre-computed round keys for bit-sliced GIFT-128 */ + uint32_t k[GIFT128_ROUND_KEYS]; + +} gift128b_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (bit-sliced). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128b_init(gift128b_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128b_encrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (bit-sliced and pre-loaded). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This version assumes that the input has already been pre-loaded from + * big-endian into host byte order in the supplied word array. The output + * is delivered in the same way. + */ +void gift128b_encrypt_preloaded + (const gift128b_key_schedule_t *ks, uint32_t output[4], + const uint32_t input[4]); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (bit-sliced). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128b_decrypt + (const gift128b_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Structure of the key schedule for GIFT-128 (nibble-based). + */ +typedef gift128b_key_schedule_t gift128n_key_schedule_t; + +/** + * \brief Initializes the key schedule for GIFT-128 (nibble-based). + * + * \param ks Points to the key schedule to initialize. + * \param key Points to the 16 bytes of the key data. + */ +void gift128n_init(gift128n_key_schedule_t *ks, const unsigned char *key); + +/** + * \brief Encrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + */ +void gift128n_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/** + * \brief Decrypts a 128-bit block with GIFT-128 (nibble-based). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * + * The \a input and \a output buffers can be the same buffer for + * in-place decryption. + */ +void gift128n_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input); + +/* 4-bit tweak values expanded to 32-bit for TweGIFT-128 */ +#define GIFT128T_TWEAK_0 0x00000000 /**< TweGIFT-128 tweak value 0 */ +#define GIFT128T_TWEAK_1 0xe1e1e1e1 /**< TweGIFT-128 tweak value 1 */ +#define GIFT128T_TWEAK_2 0xd2d2d2d2 /**< TweGIFT-128 tweak value 2 */ +#define GIFT128T_TWEAK_3 0x33333333 /**< TweGIFT-128 tweak value 3 */ +#define GIFT128T_TWEAK_4 0xb4b4b4b4 /**< TweGIFT-128 tweak value 4 */ +#define GIFT128T_TWEAK_5 0x55555555 /**< TweGIFT-128 tweak value 5 */ +#define GIFT128T_TWEAK_6 0x66666666 /**< TweGIFT-128 tweak value 6 */ +#define GIFT128T_TWEAK_7 0x87878787 /**< TweGIFT-128 tweak value 7 */ +#define GIFT128T_TWEAK_8 0x78787878 /**< TweGIFT-128 tweak value 8 */ +#define GIFT128T_TWEAK_9 0x99999999 /**< TweGIFT-128 tweak value 9 */ +#define GIFT128T_TWEAK_10 0xaaaaaaaa /**< TweGIFT-128 tweak value 10 */ +#define GIFT128T_TWEAK_11 0x4b4b4b4b /**< TweGIFT-128 tweak value 11 */ +#define GIFT128T_TWEAK_12 0xcccccccc /**< TweGIFT-128 tweak value 12 */ +#define GIFT128T_TWEAK_13 0x2d2d2d2d /**< TweGIFT-128 tweak value 13 */ +#define GIFT128T_TWEAK_14 0x1e1e1e1e /**< TweGIFT-128 tweak value 14 */ +#define GIFT128T_TWEAK_15 0xffffffff /**< TweGIFT-128 tweak value 15 */ + +/** + * \brief Encrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_encrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +/** + * \brief Decrypts a 128-bit block with TweGIFT-128 (tweakable variant). + * + * \param ks Points to the GIFT-128 key schedule. + * \param output Output buffer which must be at least 16 bytes in length. + * \param input Input buffer which must be at least 16 bytes in length. + * \param tweak 4-bit tweak value expanded to 32-bit. + * + * The \a input and \a output buffers can be the same buffer for + * in-place encryption. + * + * This variant of GIFT-128 is used by the ESTATE submission to the + * NIST Lightweight Cryptography Competition. A 4-bit tweak is added to + * some of the rounds to provide domain separation. If the tweak is + * zero, then this function is identical to gift128n_encrypt(). + */ +void gift128t_decrypt + (const gift128n_key_schedule_t *ks, unsigned char *output, + const unsigned char *input, uint32_t tweak); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-avr.S new file mode 100644 index 0000000..641613a --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-avr.S @@ -0,0 +1,2104 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 40 +table_0: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + movw r30,r24 + movw r26,r22 +.L__stack_usage = 2 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + st Z,r18 + std Z+1,r19 + std Z+2,r20 + std Z+3,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+4,r18 + std Z+5,r19 + std Z+6,r20 + std Z+7,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+8,r18 + std Z+9,r19 + std Z+10,r20 + std Z+11,r21 + ld r21,X+ + ld r20,X+ + ld r19,X+ + ld r18,X+ + std Z+12,r18 + std Z+13,r19 + std Z+14,r20 + std Z+15,r21 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 36 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + mov r16,r1 +46: + rcall 199f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + rcall 199f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + rcall 199f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + rcall 199f + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + lsl r26 + rol r27 + adc r26,r1 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + ldi r17,40 + cpse r16,r17 + rjmp 46b + rjmp 548f +199: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + movw r18,r22 + movw r20,r2 + mov r0,r4 + and r0,r18 + eor r8,r0 + mov r0,r5 + and r0,r19 + eor r9,r0 + mov r0,r6 + and r0,r20 + eor r10,r0 + mov r0,r7 + and r0,r21 + eor r11,r0 + movw r22,r12 + movw r2,r14 + movw r12,r18 + movw r14,r20 + bst r22,1 + bld r0,0 + bst r22,4 + bld r22,1 + bst r2,0 + bld r22,4 + bst r22,2 + bld r2,0 + bst r23,0 + bld r22,2 + bst r22,3 + bld r23,0 + bst r23,4 + bld r22,3 + bst r2,3 + bld r23,4 + bst r23,6 + bld r2,3 + bst r3,3 + bld r23,6 + bst r23,5 + bld r3,3 + bst r2,7 + bld r23,5 + bst r3,6 + bld r2,7 + bst r3,1 + bld r3,6 + bst r22,5 + bld r3,1 + bst r2,4 + bld r22,5 + bst r2,2 + bld r2,4 + bst r23,2 + bld r2,2 + bst r23,3 + bld r23,2 + bst r23,7 + bld r23,3 + bst r3,7 + bld r23,7 + bst r3,5 + bld r3,7 + bst r2,5 + bld r3,5 + bst r2,6 + bld r2,5 + bst r3,2 + bld r2,6 + bst r23,1 + bld r3,2 + bst r22,7 + bld r23,1 + bst r3,4 + bld r22,7 + bst r2,1 + bld r3,4 + bst r22,6 + bld r2,1 + bst r3,0 + bld r22,6 + bst r0,0 + bld r3,0 + bst r4,0 + bld r0,0 + bst r4,1 + bld r4,0 + bst r4,5 + bld r4,1 + bst r6,5 + bld r4,5 + bst r6,7 + bld r6,5 + bst r7,7 + bld r6,7 + bst r7,6 + bld r7,7 + bst r7,2 + bld r7,6 + bst r5,2 + bld r7,2 + bst r5,0 + bld r5,2 + bst r0,0 + bld r5,0 + bst r4,2 + bld r0,0 + bst r5,1 + bld r4,2 + bst r4,4 + bld r5,1 + bst r6,1 + bld r4,4 + bst r4,7 + bld r6,1 + bst r7,5 + bld r4,7 + bst r6,6 + bld r7,5 + bst r7,3 + bld r6,6 + bst r5,6 + bld r7,3 + bst r7,0 + bld r5,6 + bst r0,0 + bld r7,0 + bst r4,3 + bld r0,0 + bst r5,5 + bld r4,3 + bst r6,4 + bld r5,5 + bst r6,3 + bld r6,4 + bst r5,7 + bld r6,3 + bst r7,4 + bld r5,7 + bst r6,2 + bld r7,4 + bst r5,3 + bld r6,2 + bst r5,4 + bld r5,3 + bst r6,0 + bld r5,4 + bst r0,0 + bld r6,0 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r8,2 + bld r8,0 + bst r9,2 + bld r8,2 + bst r9,1 + bld r9,2 + bst r8,5 + bld r9,1 + bst r10,6 + bld r8,5 + bst r11,0 + bld r10,6 + bst r8,3 + bld r11,0 + bst r9,6 + bld r8,3 + bst r11,1 + bld r9,6 + bst r8,7 + bld r11,1 + bst r11,6 + bld r8,7 + bst r11,3 + bld r11,6 + bst r9,7 + bld r11,3 + bst r11,5 + bld r9,7 + bst r10,7 + bld r11,5 + bst r11,4 + bld r10,7 + bst r10,3 + bld r11,4 + bst r9,4 + bld r10,3 + bst r10,1 + bld r9,4 + bst r8,4 + bld r10,1 + bst r10,2 + bld r8,4 + bst r9,0 + bld r10,2 + bst r8,1 + bld r9,0 + bst r8,6 + bld r8,1 + bst r11,2 + bld r8,6 + bst r9,3 + bld r11,2 + bst r9,5 + bld r9,3 + bst r10,5 + bld r9,5 + bst r10,4 + bld r10,5 + bst r10,0 + bld r10,4 + bst r0,0 + bld r10,0 + bst r12,0 + bld r0,0 + bst r12,3 + bld r12,0 + bst r13,7 + bld r12,3 + bst r15,6 + bld r13,7 + bst r15,0 + bld r15,6 + bst r0,0 + bld r15,0 + bst r12,1 + bld r0,0 + bst r12,7 + bld r12,1 + bst r15,7 + bld r12,7 + bst r15,4 + bld r15,7 + bst r14,0 + bld r15,4 + bst r0,0 + bld r14,0 + bst r12,2 + bld r0,0 + bst r13,3 + bld r12,2 + bst r13,6 + bld r13,3 + bst r15,2 + bld r13,6 + bst r13,0 + bld r15,2 + bst r0,0 + bld r13,0 + bst r12,4 + bld r0,0 + bst r14,3 + bld r12,4 + bst r13,5 + bld r14,3 + bst r14,6 + bld r13,5 + bst r15,1 + bld r14,6 + bst r0,0 + bld r15,1 + bst r12,5 + bld r0,0 + bst r14,7 + bld r12,5 + bst r15,5 + bld r14,7 + bst r14,4 + bld r15,5 + bst r14,1 + bld r14,4 + bst r0,0 + bld r14,1 + bst r12,6 + bld r0,0 + bst r15,3 + bld r12,6 + bst r13,4 + bld r15,3 + bst r14,2 + bld r13,4 + bst r13,1 + bld r14,2 + bst r0,0 + bld r13,1 + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + inc r16 + ret +548: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r17,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-full-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-full-avr.S new file mode 100644 index 0000000..ff11875 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-full-avr.S @@ -0,0 +1,5037 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_FULL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 18 + ld r13,X+ + ld r12,X+ + ld r11,X+ + ld r10,X+ + ld r5,X+ + ld r4,X+ + ld r3,X+ + ld r2,X+ + ld r9,X+ + ld r8,X+ + ld r7,X+ + ld r6,X+ + ld r29,X+ + ld r28,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + ldi r24,4 +33: + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r29 + ror r28 + ror r0 + lsr r29 + ror r28 + ror r0 + or r29,r0 + st Z+,r22 + st Z+,r23 + st Z+,r28 + st Z+,r29 + mov r0,r22 + mov r22,r2 + mov r2,r0 + mov r0,r23 + mov r23,r3 + mov r3,r0 + mov r0,r28 + mov r28,r4 + mov r4,r0 + mov r0,r29 + mov r29,r5 + mov r5,r0 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + lsl r6 + rol r7 + adc r6,r1 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + mov r0,r6 + mov r6,r10 + mov r10,r0 + mov r0,r7 + mov r7,r11 + mov r11,r0 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r28,Z+2 + ldd r29,Z+3 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + st Z,r29 + std Z+1,r23 + std Z+2,r28 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r28,Z+6 + ldd r29,Z+7 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+4,r29 + std Z+5,r23 + std Z+6,r28 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r28,Z+10 + ldd r29,Z+11 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+8,r29 + std Z+9,r23 + std Z+10,r28 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r28,Z+14 + ldd r29,Z+15 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+12,r29 + std Z+13,r23 + std Z+14,r28 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+16,r29 + std Z+17,r23 + std Z+18,r28 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+20,r29 + std Z+21,r23 + std Z+22,r28 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+24,r29 + std Z+25,r23 + std Z+26,r28 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r28 + eor r21,r29 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + movw r18,r22 + movw r20,r28 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r28,r20 + eor r29,r21 + std Z+28,r29 + std Z+29,r23 + std Z+30,r28 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + adiw r30,40 + movw r26,r30 + subi r26,80 + sbc r27,r1 + ldi r24,6 +1274: + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r2 + eor r19,r3 + andi r18,51 + andi r19,51 + eor r2,r18 + eor r3,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + st Z,r2 + std Z+1,r3 + std Z+2,r4 + std Z+3,r5 + movw r18,r22 + movw r20,r28 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + andi r28,204 + andi r29,204 + or r28,r21 + or r29,r18 + or r22,r19 + or r23,r20 + movw r18,r28 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r28 + eor r19,r29 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r28,r18 + eor r29,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r28 + std Z+5,r29 + std Z+6,r22 + std Z+7,r23 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + swap r3 + lsl r4 + adc r4,r1 + lsl r4 + adc r4,r1 + swap r5 + std Z+8,r2 + std Z+9,r3 + std Z+10,r4 + std Z+11,r5 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r28 + adc r28,r1 + lsl r29 + adc r29,r1 + lsl r29 + adc r29,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r28 + std Z+15,r29 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + ldi r25,85 + and r2,r25 + and r3,r25 + and r4,r25 + and r5,r25 + or r2,r19 + or r3,r20 + or r4,r21 + or r5,r18 + std Z+16,r4 + std Z+17,r5 + std Z+18,r2 + std Z+19,r3 + movw r18,r22 + movw r20,r28 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + andi r28,170 + andi r29,170 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + lsl r22 + rol r23 + rol r28 + rol r29 + adc r22,r1 + or r22,r18 + or r23,r19 + or r28,r20 + or r29,r21 + std Z+20,r29 + std Z+21,r22 + std Z+22,r23 + std Z+23,r28 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r4 + eor r21,r5 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r4,r20 + eor r5,r21 + movw r18,r2 + movw r20,r4 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r14,r18 + movw r16,r20 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + lsr r17 + ror r16 + ror r15 + ror r14 + eor r14,r18 + eor r15,r19 + eor r16,r20 + eor r17,r21 + ldi r25,8 + and r14,r25 + and r15,r25 + andi r16,8 + andi r17,8 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + lsl r14 + rol r15 + rol r16 + rol r17 + eor r18,r14 + eor r19,r15 + eor r20,r16 + eor r21,r17 + ldi r17,15 + and r2,r17 + and r3,r17 + and r4,r17 + and r5,r17 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + std Z+24,r2 + std Z+25,r3 + std Z+26,r4 + std Z+27,r5 + movw r18,r28 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r2,r22 + movw r4,r28 + ldi r16,1 + and r2,r16 + and r3,r16 + and r4,r16 + and r5,r16 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + lsl r2 + rol r3 + rol r4 + rol r5 + or r2,r18 + or r3,r19 + movw r18,r28 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r2,r18 + or r3,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r4,r18 + or r5,r19 + movw r18,r22 + movw r20,r28 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r2,r18 + or r3,r19 + or r4,r20 + or r5,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r4,r22 + or r5,r23 + std Z+28,r2 + std Z+29,r3 + std Z+30,r4 + std Z+31,r5 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + mov r0,r1 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + lsr r5 + ror r4 + ror r0 + or r5,r0 + std Z+32,r3 + std Z+33,r2 + std Z+34,r4 + std Z+35,r5 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r28 + mov r28,r29 + mov r29,r0 + lsl r28 + rol r29 + adc r28,r1 + lsl r28 + rol r29 + adc r28,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r28 + std Z+39,r29 + dec r24 + breq 1733f + adiw r30,40 + rjmp 1274b +1733: + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r30 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rcall 27f + rjmp 765f +27: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +765: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e +.L__stack_usage = 19 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r30 + subi r26,192 + sbci r27,254 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,160 + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rcall 30f + rjmp 768f +30: + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r11 + mov r11,r10 + mov r10,r9 + mov r9,r8 + mov r8,r0 + mov r0,r12 + mov r12,r13 + mov r13,r14 + mov r14,r15 + mov r15,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r1 + lsr r22 + ror r0 + lsr r22 + ror r0 + or r22,r0 + mov r0,r1 + lsr r23 + ror r0 + lsr r23 + ror r0 + or r23,r0 + mov r0,r1 + lsr r2 + ror r0 + lsr r2 + ror r0 + or r2,r0 + mov r0,r1 + lsr r3 + ror r0 + lsr r3 + ror r0 + or r3,r0 + swap r4 + swap r5 + swap r6 + swap r7 + lsl r8 + adc r8,r1 + lsl r8 + adc r8,r1 + lsl r9 + adc r9,r1 + lsl r9 + adc r9,r1 + lsl r10 + adc r10,r1 + lsl r10 + adc r10,r1 + lsl r11 + adc r11,r1 + lsl r11 + adc r11,r1 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + mov r0,r1 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + lsr r9 + ror r8 + ror r0 + or r9,r0 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + com r22 + com r23 + com r2 + com r3 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + dec r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + dec r30 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + ld r21,-X + ld r20,-X + ld r19,-X + ld r18,-X + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,119 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,17 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +768: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+1 + ldd r27,Y+2 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + pop r0 + pop r0 + pop r17 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-small-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-small-avr.S new file mode 100644 index 0000000..77ef9fd --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-small-avr.S @@ -0,0 +1,6053 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_SMALL + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +33: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5115f + rjmp 33b +5115: + subi r30,80 + sbc r31,r1 + ldi r24,2 +119: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1268f + adiw r30,40 + rjmp 119b +1268: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ldi r24,20 +1: + ld r22,Z+ + ld r23,Z+ + ld r2,Z+ + ld r3,Z+ + std Y+1,r22 + std Y+2,r23 + std Y+3,r2 + std Y+4,r3 + adiw r28,4 + dec r24 + brne 1b + subi r28,80 + sbc r29,r1 + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 73f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 811f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 73f + rcall 73f + rjmp 1285f +73: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +811: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +1285: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r25 + mov r25,r26 + mov r26,r0 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +678: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 830f + cpse r16,r1 + rjmp 678b + rjmp 1175f +830: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +1175: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-tiny-avr.S b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-tiny-avr.S new file mode 100644 index 0000000..e7a03f1 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-gift128b-tiny-avr.S @@ -0,0 +1,6766 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + +#include "internal-gift128-config.h" + +#if GIFT128_VARIANT == GIFT128_VARIANT_TINY + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_0, @object + .size table_0, 160 +table_0: + .byte 8 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 128 + .byte 1 + .byte 128 + .byte 2 + .byte 0 + .byte 0 + .byte 84 + .byte 129 + .byte 1 + .byte 1 + .byte 1 + .byte 31 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 136 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 81 + .byte 128 + .byte 1 + .byte 3 + .byte 3 + .byte 47 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 96 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 65 + .byte 128 + .byte 0 + .byte 3 + .byte 3 + .byte 39 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 224 + .byte 1 + .byte 64 + .byte 2 + .byte 0 + .byte 80 + .byte 17 + .byte 128 + .byte 1 + .byte 2 + .byte 3 + .byte 43 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 8 + .byte 8 + .byte 16 + .byte 0 + .byte 64 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 64 + .byte 1 + .byte 128 + .byte 0 + .byte 2 + .byte 2 + .byte 33 + .byte 0 + .byte 0 + .byte 128 + .byte 128 + .byte 0 + .byte 0 + .byte 16 + .byte 0 + .byte 192 + .byte 1 + .byte 0 + .byte 2 + .byte 0 + .byte 0 + .byte 81 + .byte 128 + .byte 1 + .byte 1 + .byte 3 + .byte 46 + .byte 0 + .byte 0 + .byte 128 + .byte 0 + .byte 136 + .byte 8 + .byte 16 + .byte 0 + .byte 32 + .byte 1 + .byte 96 + .byte 2 + .byte 0 + .byte 80 + .byte 64 + .byte 128 + .byte 0 + .byte 3 + .byte 1 + .byte 6 + .byte 0 + .byte 0 + .byte 128 + .byte 8 + .byte 136 + .byte 0 + .byte 16 + .byte 0 + .byte 160 + .byte 1 + .byte 192 + .byte 2 + .byte 0 + .byte 80 + .byte 20 + .byte 129 + .byte 1 + .byte 2 + .byte 1 + .byte 26 + .byte 0 + .byte 0 + .byte 128 + + .text +.global gift128b_init + .type gift128b_init, @function +gift128b_init: + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 + movw r26,r22 +.L__stack_usage = 16 + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + st Z,r22 + std Z+1,r23 + std Z+2,r2 + std Z+3,r3 + std Z+4,r4 + std Z+5,r5 + std Z+6,r6 + std Z+7,r7 + std Z+8,r8 + std Z+9,r9 + std Z+10,r10 + std Z+11,r11 + std Z+12,r12 + std Z+13,r13 + std Z+14,r14 + std Z+15,r15 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + ret + .size gift128b_init, .-gift128b_init + + .text +.global gift128b_encrypt + .type gift128b_encrypt, @function +gift128b_encrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt, .-gift128b_encrypt + + .text +.global gift128b_encrypt_preloaded + .type gift128b_encrypt_preloaded, @function +gift128b_encrypt_preloaded: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + subi r28,80 + sbci r29,0 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 100 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r4,Z+4 + ldd r5,Z+5 + ldd r6,Z+6 + ldd r7,Z+7 + ldd r8,Z+8 + ldd r9,Z+9 + ldd r10,Z+10 + ldd r11,Z+11 + ldd r12,Z+12 + ldd r13,Z+13 + ldd r14,Z+14 + ldd r15,Z+15 + movw r30,r28 + adiw r30,1 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + ldi r24,4 +35: + st Z+,r4 + st Z+,r5 + st Z+,r6 + st Z+,r7 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + lsl r22 + rol r23 + adc r22,r1 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + st Z+,r22 + st Z+,r23 + st Z+,r2 + st Z+,r3 + mov r0,r22 + mov r22,r4 + mov r4,r0 + mov r0,r23 + mov r23,r5 + mov r5,r0 + mov r0,r2 + mov r2,r6 + mov r6,r0 + mov r0,r3 + mov r3,r7 + mov r7,r0 + st Z+,r12 + st Z+,r13 + st Z+,r14 + st Z+,r15 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + mov r0,r1 + lsr r11 + ror r10 + ror r0 + lsr r11 + ror r10 + ror r0 + or r11,r0 + st Z+,r8 + st Z+,r9 + st Z+,r10 + st Z+,r11 + mov r0,r8 + mov r8,r12 + mov r12,r0 + mov r0,r9 + mov r9,r13 + mov r13,r0 + mov r0,r10 + mov r10,r14 + mov r14,r0 + mov r0,r11 + mov r11,r15 + mov r15,r0 + dec r24 + breq 5117f + rjmp 35b +5117: + subi r30,80 + sbc r31,r1 + ldi r24,2 +121: + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + st Z,r3 + std Z+1,r23 + std Z+2,r2 + std Z+3,r22 + ldd r22,Z+4 + ldd r23,Z+5 + ldd r2,Z+6 + ldd r3,Z+7 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,85 + mov r19,r1 + andi r20,85 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+4,r3 + std Z+5,r23 + std Z+6,r2 + std Z+7,r22 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+8,r3 + std Z+9,r23 + std Z+10,r2 + std Z+11,r22 + ldd r22,Z+12 + ldd r23,Z+13 + ldd r2,Z+14 + ldd r3,Z+15 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,17 + andi r19,17 + andi r20,17 + andi r21,17 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,15 + mov r19,r1 + andi r20,15 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+12,r3 + std Z+13,r23 + std Z+14,r2 + std Z+15,r22 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+16,r3 + std Z+17,r23 + std Z+18,r2 + std Z+19,r22 + ldd r22,Z+20 + ldd r23,Z+21 + ldd r2,Z+22 + ldd r3,Z+23 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r19 + rol r20 + rol r21 + rol r0 + movw r18,r20 + mov r20,r0 + mov r21,r1 + eor r18,r22 + eor r19,r23 + andi r18,170 + andi r19,170 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r0,r1 + lsr r20 + ror r19 + ror r18 + ror r0 + movw r20,r18 + mov r19,r0 + mov r18,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + movw r18,r20 + mov r20,r1 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,51 + andi r19,51 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+20,r3 + std Z+21,r23 + std Z+22,r2 + std Z+23,r22 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+24,r3 + std Z+25,r23 + std Z+26,r2 + std Z+27,r22 + ldd r22,Z+28 + ldd r23,Z+29 + ldd r2,Z+30 + ldd r3,Z+31 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,10 + andi r19,10 + andi r20,10 + andi r21,10 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r0,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + lsl r18 + rol r19 + rol r20 + rol r21 + rol r0 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r0 + eor r18,r22 + eor r19,r23 + eor r20,r2 + eor r21,r3 + andi r18,204 + mov r19,r1 + andi r20,204 + mov r21,r1 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + lsr r21 + ror r20 + ror r19 + ror r18 + ror r0 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r0 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + movw r18,r22 + movw r20,r2 + mov r18,r19 + mov r19,r20 + mov r20,r21 + mov r21,r1 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r22 + eor r19,r23 + andi r18,240 + andi r19,240 + eor r22,r18 + eor r23,r19 + mov r20,r1 + mov r21,r1 + mov r21,r20 + mov r20,r19 + mov r19,r18 + mov r18,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + std Z+28,r3 + std Z+29,r23 + std Z+30,r2 + std Z+31,r22 + dec r24 + breq 1270f + adiw r30,40 + rjmp 121b +1270: + ld r22,X+ + ld r23,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + ld r14,X+ + ld r15,X+ + movw r26,r28 + adiw r26,1 + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,20 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,40 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,60 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,80 + sbiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,100 + adiw r26,40 + rcall 1329f +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + rcall 2067f + ldi r30,lo8(table_0) + ldi r31,hi8(table_0) +#if defined(RAMPZ) + ldi r24,hh8(table_0) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r24 +#endif + ldi r30,120 + sbiw r26,40 + rcall 1329f + rcall 1329f + rjmp 2541f +1329: + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,204 + andi r19,204 + andi r20,204 + andi r21,204 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + ldi r25,51 + and r4,r25 + and r5,r25 + and r6,r25 + and r7,r25 + or r4,r18 + or r5,r19 + or r6,r20 + or r7,r21 + movw r18,r8 + movw r20,r10 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,238 + andi r19,238 + andi r20,238 + andi r21,238 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + lsr r11 + ror r10 + ror r9 + ror r8 + ldi r24,17 + and r8,r24 + and r9,r24 + and r10,r24 + and r11,r24 + or r8,r18 + or r9,r19 + or r10,r20 + or r11,r21 + movw r18,r12 + movw r20,r14 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + andi r18,136 + andi r19,136 + andi r20,136 + andi r21,136 + lsr r15 + ror r14 + ror r13 + ror r12 + ldi r17,119 + and r12,r17 + and r13,r17 + and r14,r17 + and r15,r17 + or r12,r18 + or r13,r19 + or r14,r20 + or r15,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r1 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + lsr r3 + ror r2 + ror r0 + or r3,r0 + mov r0,r5 + mov r5,r4 + mov r4,r0 + mov r0,r7 + mov r7,r6 + mov r6,r0 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r8 + rol r9 + adc r8,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + lsl r10 + rol r11 + adc r10,r1 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + movw r18,r4 + movw r20,r6 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + mov r0,r10 + mov r10,r8 + mov r8,r0 + mov r0,r11 + mov r11,r9 + mov r9,r0 + movw r18,r8 + movw r20,r10 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r8 + eor r19,r9 + andi r18,85 + andi r19,85 + eor r8,r18 + eor r9,r19 + mov r20,r1 + mov r21,r1 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + mov r0,r14 + mov r14,r12 + mov r12,r0 + mov r0,r15 + mov r15,r13 + mov r13,r0 + movw r18,r14 + lsr r19 + ror r18 + eor r18,r14 + eor r19,r15 + andi r18,85 + andi r19,85 + eor r14,r18 + eor r15,r19 + lsl r18 + rol r19 + eor r14,r18 + eor r15,r19 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + mov r0,r12 + and r0,r8 + eor r4,r0 + mov r0,r13 + and r0,r9 + eor r5,r0 + mov r0,r14 + and r0,r10 + eor r6,r0 + mov r0,r15 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r22 + eor r12,r0 + mov r0,r5 + and r0,r23 + eor r13,r0 + mov r0,r6 + and r0,r2 + eor r14,r0 + mov r0,r7 + and r0,r3 + eor r15,r0 + mov r0,r12 + or r0,r4 + eor r8,r0 + mov r0,r13 + or r0,r5 + eor r9,r0 + mov r0,r14 + or r0,r6 + eor r10,r0 + mov r0,r15 + or r0,r7 + eor r11,r0 + eor r22,r8 + eor r23,r9 + eor r2,r10 + eor r3,r11 + eor r4,r22 + eor r5,r23 + eor r6,r2 + eor r7,r3 + com r22 + com r23 + com r2 + com r3 + mov r0,r12 + and r0,r4 + eor r8,r0 + mov r0,r13 + and r0,r5 + eor r9,r0 + mov r0,r14 + and r0,r6 + eor r10,r0 + mov r0,r15 + and r0,r7 + eor r11,r0 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + swap r4 + swap r5 + swap r6 + swap r7 + mov r0,r1 + lsr r8 + ror r0 + lsr r8 + ror r0 + or r8,r0 + mov r0,r1 + lsr r9 + ror r0 + lsr r9 + ror r0 + or r9,r0 + mov r0,r1 + lsr r10 + ror r0 + lsr r10 + ror r0 + or r10,r0 + mov r0,r1 + lsr r11 + ror r0 + lsr r11 + ror r0 + or r11,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r12,r18 + eor r13,r19 + eor r14,r20 + eor r15,r21 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + com r12 + com r13 + com r14 + com r15 + mov r0,r22 + and r0,r4 + eor r8,r0 + mov r0,r23 + and r0,r5 + eor r9,r0 + mov r0,r2 + and r0,r6 + eor r10,r0 + mov r0,r3 + and r0,r7 + eor r11,r0 + mov r0,r6 + mov r6,r4 + mov r4,r0 + mov r0,r7 + mov r7,r5 + mov r5,r0 + mov r0,r8 + mov r8,r9 + mov r9,r10 + mov r10,r11 + mov r11,r0 + mov r0,r15 + mov r15,r14 + mov r14,r13 + mov r13,r12 + mov r12,r0 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ld r18,X+ + ld r19,X+ + ld r20,X+ + ld r21,X+ + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r19,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r19,Z +#elif defined(__AVR_TINY__) + ld r19,Z +#else + lpm + mov r19,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r20,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r20,Z +#elif defined(__AVR_TINY__) + ld r20,Z +#else + lpm + mov r20,r0 +#endif + inc r30 +#if defined(RAMPZ) + elpm r21,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r21,Z +#elif defined(__AVR_TINY__) + ld r21,Z +#else + lpm + mov r21,r0 +#endif + inc r30 + eor r22,r18 + eor r23,r19 + eor r2,r20 + eor r3,r21 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + eor r12,r22 + eor r13,r23 + eor r14,r2 + eor r15,r3 + eor r22,r12 + eor r23,r13 + eor r2,r14 + eor r3,r15 + ret +2067: + movw r30,r26 + sbiw r30,40 + push r3 + push r2 + push r23 + push r22 + push r7 + push r6 + push r5 + push r4 + ld r22,Z + ldd r23,Z+1 + ldd r2,Z+2 + ldd r3,Z+3 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + movw r18,r26 + movw r20,r24 + movw r18,r20 + mov r20,r1 + mov r21,r1 + eor r18,r26 + eor r19,r27 + andi r18,51 + andi r19,51 + eor r26,r18 + eor r27,r19 + mov r20,r1 + mov r21,r1 + movw r20,r18 + mov r18,r1 + mov r19,r1 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,68 + andi r19,68 + andi r20,85 + andi r21,85 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + st Z,r26 + std Z+1,r27 + std Z+2,r24 + std Z+3,r25 + movw r18,r22 + movw r20,r2 + andi r18,51 + andi r19,51 + andi r20,51 + andi r21,51 + andi r22,204 + andi r23,204 + ldi r17,204 + and r2,r17 + and r3,r17 + or r2,r21 + or r3,r18 + or r22,r19 + or r23,r20 + movw r18,r2 + movw r20,r22 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r2 + eor r19,r3 + eor r20,r22 + eor r21,r23 + mov r18,r1 + andi r19,17 + andi r20,85 + andi r21,85 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r2,r18 + eor r3,r19 + eor r22,r20 + eor r23,r21 + std Z+4,r2 + std Z+5,r3 + std Z+6,r22 + std Z+7,r23 + ldd r22,Z+8 + ldd r23,Z+9 + ldd r2,Z+10 + ldd r3,Z+11 + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + lsl r26 + adc r26,r1 + lsl r26 + adc r26,r1 + swap r27 + lsl r24 + adc r24,r1 + lsl r24 + adc r24,r1 + swap r25 + std Z+8,r26 + std Z+9,r27 + std Z+10,r24 + std Z+11,r25 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r22 + adc r22,r1 + lsl r23 + adc r23,r1 + lsl r23 + adc r23,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r2 + adc r2,r1 + lsl r3 + adc r3,r1 + lsl r3 + adc r3,r1 + std Z+12,r22 + std Z+13,r23 + std Z+14,r2 + std Z+15,r3 + ldd r22,Z+16 + ldd r23,Z+17 + ldd r2,Z+18 + ldd r3,Z+19 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r24,Z+22 + ldd r25,Z+23 + movw r18,r26 + movw r20,r24 + andi r18,170 + andi r19,170 + andi r20,170 + andi r21,170 + andi r26,85 + andi r27,85 + andi r24,85 + andi r25,85 + or r26,r19 + or r27,r20 + or r24,r21 + or r25,r18 + std Z+16,r24 + std Z+17,r25 + std Z+18,r26 + std Z+19,r27 + movw r18,r22 + movw r20,r2 + andi r18,85 + andi r19,85 + andi r20,85 + andi r21,85 + andi r22,170 + andi r23,170 + ldi r16,170 + and r2,r16 + and r3,r16 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + lsl r22 + rol r23 + rol r2 + rol r3 + adc r22,r1 + or r22,r18 + or r23,r19 + or r2,r20 + or r3,r21 + std Z+20,r3 + std Z+21,r22 + std Z+22,r23 + std Z+23,r2 + ldd r22,Z+24 + ldd r23,Z+25 + ldd r2,Z+26 + ldd r3,Z+27 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r24,Z+30 + ldd r25,Z+31 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + lsr r21 + ror r20 + ror r19 + ror r18 + eor r18,r26 + eor r19,r27 + eor r20,r24 + eor r21,r25 + andi r18,3 + andi r19,3 + andi r20,3 + andi r21,3 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + lsl r18 + rol r19 + rol r20 + rol r21 + lsl r18 + rol r19 + rol r20 + rol r21 + eor r26,r18 + eor r27,r19 + eor r24,r20 + eor r25,r21 + movw r18,r26 + movw r20,r24 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,120 + andi r19,120 + andi r20,120 + andi r21,120 + movw r4,r18 + movw r6,r20 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + lsr r7 + ror r6 + ror r5 + ror r4 + eor r4,r18 + eor r5,r19 + eor r6,r20 + eor r7,r21 + ldi r16,8 + and r4,r16 + and r5,r16 + and r6,r16 + and r7,r16 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + lsl r4 + rol r5 + rol r6 + rol r7 + eor r18,r4 + eor r19,r5 + eor r20,r6 + eor r21,r7 + andi r26,15 + andi r27,15 + andi r24,15 + andi r25,15 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + std Z+24,r26 + std Z+25,r27 + std Z+26,r24 + std Z+27,r25 + movw r18,r2 + lsr r19 + ror r18 + lsr r19 + ror r18 + andi r18,48 + andi r19,48 + movw r26,r22 + movw r24,r2 + andi r26,1 + andi r27,1 + andi r24,1 + andi r25,1 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + lsl r26 + rol r27 + rol r24 + rol r25 + or r26,r18 + or r27,r19 + movw r18,r2 + lsl r18 + rol r19 + lsl r18 + rol r19 + andi r18,192 + andi r19,192 + or r26,r18 + or r27,r19 + movw r18,r22 + andi r18,224 + andi r19,224 + lsr r19 + ror r18 + or r24,r18 + or r25,r19 + movw r18,r22 + movw r20,r2 + lsr r21 + ror r20 + ror r19 + ror r18 + andi r18,7 + andi r19,7 + andi r20,7 + andi r21,7 + or r26,r18 + or r27,r19 + or r24,r20 + or r25,r21 + andi r22,16 + andi r23,16 + lsl r22 + rol r23 + lsl r22 + rol r23 + lsl r22 + rol r23 + or r24,r22 + or r25,r23 + std Z+28,r26 + std Z+29,r27 + std Z+30,r24 + std Z+31,r25 + ldd r22,Z+32 + ldd r23,Z+33 + ldd r2,Z+34 + ldd r3,Z+35 + ldd r26,Z+36 + ldd r27,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Z+32,r27 + std Z+33,r26 + std Z+34,r24 + std Z+35,r25 + mov r0,r1 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + lsr r23 + ror r22 + ror r0 + or r23,r0 + mov r0,r2 + mov r2,r3 + mov r3,r0 + lsl r2 + rol r3 + adc r2,r1 + lsl r2 + rol r3 + adc r2,r1 + std Z+36,r22 + std Z+37,r23 + std Z+38,r2 + std Z+39,r3 + pop r4 + pop r5 + pop r6 + pop r7 + pop r22 + pop r23 + pop r2 + pop r3 + movw r26,r30 + ret +2541: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + subi r28,175 + sbci r29,255 + ld r26,Y+ + ld r27,Y + subi r28,82 + sbc r29,r1 + st X+,r22 + st X+,r23 + st X+,r2 + st X+,r3 + st X+,r4 + st X+,r5 + st X+,r6 + st X+,r7 + st X+,r8 + st X+,r9 + st X+,r10 + st X+,r11 + st X+,r12 + st X+,r13 + st X+,r14 + st X+,r15 + subi r28,174 + sbci r29,255 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_encrypt_preloaded, .-gift128b_encrypt_preloaded + + .section .progmem.data,"a",@progbits + .p2align 8 + .type table_1, @object + .size table_1, 40 +table_1: + .byte 1 + .byte 3 + .byte 7 + .byte 15 + .byte 31 + .byte 62 + .byte 61 + .byte 59 + .byte 55 + .byte 47 + .byte 30 + .byte 60 + .byte 57 + .byte 51 + .byte 39 + .byte 14 + .byte 29 + .byte 58 + .byte 53 + .byte 43 + .byte 22 + .byte 44 + .byte 24 + .byte 48 + .byte 33 + .byte 2 + .byte 5 + .byte 11 + .byte 23 + .byte 46 + .byte 28 + .byte 56 + .byte 49 + .byte 35 + .byte 6 + .byte 13 + .byte 27 + .byte 54 + .byte 45 + .byte 26 + + .text +.global gift128b_decrypt + .type gift128b_decrypt, @function +gift128b_decrypt: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r23 + push r22 + movw r30,r24 + movw r26,r20 + in r28,0x3d + in r29,0x3e + sbiw r28,16 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 +.L__stack_usage = 35 + ld r3,X+ + ld r2,X+ + ld r23,X+ + ld r22,X+ + ld r7,X+ + ld r6,X+ + ld r5,X+ + ld r4,X+ + ld r11,X+ + ld r10,X+ + ld r9,X+ + ld r8,X+ + ld r15,X+ + ld r14,X+ + ld r13,X+ + ld r12,X+ + ldd r26,Z+12 + ldd r27,Z+13 + ldd r24,Z+14 + ldd r25,Z+15 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Z+4 + ldd r27,Z+5 + ldd r24,Z+6 + ldd r25,Z+7 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Z+8 + ldd r27,Z+9 + ldd r24,Z+10 + ldd r25,Z+11 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ld r26,Z + ldd r27,Z+1 + ldd r24,Z+2 + ldd r25,Z+3 + mov r0,r27 + mov r27,r26 + mov r26,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + lsr r25 + ror r24 + ror r0 + or r25,r0 + ldi r30,lo8(table_1) + ldi r31,hi8(table_1) +#if defined(RAMPZ) + ldi r17,hh8(table_1) + in r0,_SFR_IO_ADDR(RAMPZ) + push r0 + out _SFR_IO_ADDR(RAMPZ),r17 +#endif + ldi r16,40 +114: + ldd r0,Y+9 + eor r8,r0 + ldd r0,Y+10 + eor r9,r0 + ldd r0,Y+11 + eor r10,r0 + ldd r0,Y+12 + eor r11,r0 + std Y+13,r26 + std Y+14,r27 + std Y+15,r24 + std Y+16,r25 + ldd r26,Y+1 + ldd r27,Y+2 + ldd r24,Y+3 + ldd r25,Y+4 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+13 + eor r8,r0 + ldd r0,Y+14 + eor r9,r0 + ldd r0,Y+15 + eor r10,r0 + ldd r0,Y+16 + eor r11,r0 + std Y+1,r26 + std Y+2,r27 + std Y+3,r24 + std Y+4,r25 + ldd r26,Y+5 + ldd r27,Y+6 + ldd r24,Y+7 + ldd r25,Y+8 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+1 + eor r8,r0 + ldd r0,Y+2 + eor r9,r0 + ldd r0,Y+3 + eor r10,r0 + ldd r0,Y+4 + eor r11,r0 + std Y+5,r26 + std Y+6,r27 + std Y+7,r24 + std Y+8,r25 + ldd r26,Y+9 + ldd r27,Y+10 + ldd r24,Y+11 + ldd r25,Y+12 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + ldd r0,Y+5 + eor r8,r0 + ldd r0,Y+6 + eor r9,r0 + ldd r0,Y+7 + eor r10,r0 + ldd r0,Y+8 + eor r11,r0 + std Y+9,r26 + std Y+10,r27 + std Y+11,r24 + std Y+12,r25 + ldd r26,Y+13 + ldd r27,Y+14 + ldd r24,Y+15 + ldd r25,Y+16 + mov r0,r1 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + lsr r27 + ror r26 + ror r0 + or r27,r0 + lsl r24 + rol r25 + adc r24,r1 + lsl r24 + rol r25 + adc r24,r1 + rcall 266f + cpse r16,r1 + rjmp 114b + rjmp 611f +266: + eor r4,r26 + eor r5,r27 + eor r6,r24 + eor r7,r25 + ldi r18,128 + eor r15,r18 + dec r16 + mov r30,r16 +#if defined(RAMPZ) + elpm r18,Z +#elif defined(__AVR_HAVE_LPMX__) + lpm r18,Z +#elif defined(__AVR_TINY__) + ld r18,Z +#else + lpm + mov r18,r0 +#endif + eor r12,r18 + bst r22,1 + bld r0,0 + bst r3,0 + bld r22,1 + bst r22,6 + bld r3,0 + bst r2,1 + bld r22,6 + bst r3,4 + bld r2,1 + bst r22,7 + bld r3,4 + bst r23,1 + bld r22,7 + bst r3,2 + bld r23,1 + bst r2,6 + bld r3,2 + bst r2,5 + bld r2,6 + bst r3,5 + bld r2,5 + bst r3,7 + bld r3,5 + bst r23,7 + bld r3,7 + bst r23,3 + bld r23,7 + bst r23,2 + bld r23,3 + bst r2,2 + bld r23,2 + bst r2,4 + bld r2,2 + bst r22,5 + bld r2,4 + bst r3,1 + bld r22,5 + bst r3,6 + bld r3,1 + bst r2,7 + bld r3,6 + bst r23,5 + bld r2,7 + bst r3,3 + bld r23,5 + bst r23,6 + bld r3,3 + bst r2,3 + bld r23,6 + bst r23,4 + bld r2,3 + bst r22,3 + bld r23,4 + bst r23,0 + bld r22,3 + bst r22,2 + bld r23,0 + bst r2,0 + bld r22,2 + bst r22,4 + bld r2,0 + bst r0,0 + bld r22,4 + bst r4,0 + bld r0,0 + bst r5,0 + bld r4,0 + bst r5,2 + bld r5,0 + bst r7,2 + bld r5,2 + bst r7,6 + bld r7,2 + bst r7,7 + bld r7,6 + bst r6,7 + bld r7,7 + bst r6,5 + bld r6,7 + bst r4,5 + bld r6,5 + bst r4,1 + bld r4,5 + bst r0,0 + bld r4,1 + bst r4,2 + bld r0,0 + bst r7,0 + bld r4,2 + bst r5,6 + bld r7,0 + bst r7,3 + bld r5,6 + bst r6,6 + bld r7,3 + bst r7,5 + bld r6,6 + bst r4,7 + bld r7,5 + bst r6,1 + bld r4,7 + bst r4,4 + bld r6,1 + bst r5,1 + bld r4,4 + bst r0,0 + bld r5,1 + bst r4,3 + bld r0,0 + bst r6,0 + bld r4,3 + bst r5,4 + bld r6,0 + bst r5,3 + bld r5,4 + bst r6,2 + bld r5,3 + bst r7,4 + bld r6,2 + bst r5,7 + bld r7,4 + bst r6,3 + bld r5,7 + bst r6,4 + bld r6,3 + bst r5,5 + bld r6,4 + bst r0,0 + bld r5,5 + bst r4,6 + bld r0,0 + bst r7,1 + bld r4,6 + bst r0,0 + bld r7,1 + bst r8,0 + bld r0,0 + bst r10,0 + bld r8,0 + bst r10,4 + bld r10,0 + bst r10,5 + bld r10,4 + bst r9,5 + bld r10,5 + bst r9,3 + bld r9,5 + bst r11,2 + bld r9,3 + bst r8,6 + bld r11,2 + bst r8,1 + bld r8,6 + bst r9,0 + bld r8,1 + bst r10,2 + bld r9,0 + bst r8,4 + bld r10,2 + bst r10,1 + bld r8,4 + bst r9,4 + bld r10,1 + bst r10,3 + bld r9,4 + bst r11,4 + bld r10,3 + bst r10,7 + bld r11,4 + bst r11,5 + bld r10,7 + bst r9,7 + bld r11,5 + bst r11,3 + bld r9,7 + bst r11,6 + bld r11,3 + bst r8,7 + bld r11,6 + bst r11,1 + bld r8,7 + bst r9,6 + bld r11,1 + bst r8,3 + bld r9,6 + bst r11,0 + bld r8,3 + bst r10,6 + bld r11,0 + bst r8,5 + bld r10,6 + bst r9,1 + bld r8,5 + bst r9,2 + bld r9,1 + bst r8,2 + bld r9,2 + bst r0,0 + bld r8,2 + bst r12,0 + bld r0,0 + bst r15,0 + bld r12,0 + bst r15,6 + bld r15,0 + bst r13,7 + bld r15,6 + bst r12,3 + bld r13,7 + bst r0,0 + bld r12,3 + bst r12,1 + bld r0,0 + bst r14,0 + bld r12,1 + bst r15,4 + bld r14,0 + bst r15,7 + bld r15,4 + bst r12,7 + bld r15,7 + bst r0,0 + bld r12,7 + bst r12,2 + bld r0,0 + bst r13,0 + bld r12,2 + bst r15,2 + bld r13,0 + bst r13,6 + bld r15,2 + bst r13,3 + bld r13,6 + bst r0,0 + bld r13,3 + bst r12,4 + bld r0,0 + bst r15,1 + bld r12,4 + bst r14,6 + bld r15,1 + bst r13,5 + bld r14,6 + bst r14,3 + bld r13,5 + bst r0,0 + bld r14,3 + bst r12,5 + bld r0,0 + bst r14,1 + bld r12,5 + bst r14,4 + bld r14,1 + bst r15,5 + bld r14,4 + bst r14,7 + bld r15,5 + bst r0,0 + bld r14,7 + bst r12,6 + bld r0,0 + bst r13,1 + bld r12,6 + bst r14,2 + bld r13,1 + bst r13,4 + bld r14,2 + bst r15,3 + bld r13,4 + bst r0,0 + bld r15,3 + movw r18,r12 + movw r20,r14 + movw r12,r22 + movw r14,r2 + movw r22,r18 + movw r2,r20 + and r18,r4 + and r19,r5 + and r20,r6 + and r21,r7 + eor r8,r18 + eor r9,r19 + eor r10,r20 + eor r11,r21 + com r12 + com r13 + com r14 + com r15 + eor r4,r12 + eor r5,r13 + eor r6,r14 + eor r7,r15 + eor r12,r8 + eor r13,r9 + eor r14,r10 + eor r15,r11 + mov r0,r22 + or r0,r4 + eor r8,r0 + mov r0,r23 + or r0,r5 + eor r9,r0 + mov r0,r2 + or r0,r6 + eor r10,r0 + mov r0,r3 + or r0,r7 + eor r11,r0 + mov r0,r4 + and r0,r12 + eor r22,r0 + mov r0,r5 + and r0,r13 + eor r23,r0 + mov r0,r6 + and r0,r14 + eor r2,r0 + mov r0,r7 + and r0,r15 + eor r3,r0 + mov r0,r22 + and r0,r8 + eor r4,r0 + mov r0,r23 + and r0,r9 + eor r5,r0 + mov r0,r2 + and r0,r10 + eor r6,r0 + mov r0,r3 + and r0,r11 + eor r7,r0 + ret +611: +#if defined(RAMPZ) + pop r0 + out _SFR_IO_ADDR(RAMPZ),r0 +#endif + ldd r26,Y+17 + ldd r27,Y+18 + st X+,r3 + st X+,r2 + st X+,r23 + st X+,r22 + st X+,r7 + st X+,r6 + st X+,r5 + st X+,r4 + st X+,r11 + st X+,r10 + st X+,r9 + st X+,r8 + st X+,r15 + st X+,r14 + st X+,r13 + st X+,r12 + adiw r28,18 + in r0,0x3f + cli + out 0x3e,r29 + out 0x3f,r0 + out 0x3d,r28 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size gift128b_decrypt, .-gift128b_decrypt + +#endif + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-util.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.c b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.c new file mode 100644 index 0000000..d192b8e --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.c @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "sundae-gift.h" +#include "internal-gift128.h" +#include "internal-util.h" +#include + +aead_cipher_t const sundae_gift_0_cipher = { + "SUNDAE-GIFT-0", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_0_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_0_aead_encrypt, + sundae_gift_0_aead_decrypt +}; + +aead_cipher_t const sundae_gift_64_cipher = { + "SUNDAE-GIFT-64", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_64_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_64_aead_encrypt, + sundae_gift_64_aead_decrypt +}; + +aead_cipher_t const sundae_gift_96_cipher = { + "SUNDAE-GIFT-96", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_96_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_96_aead_encrypt, + sundae_gift_96_aead_decrypt +}; + +aead_cipher_t const sundae_gift_128_cipher = { + "SUNDAE-GIFT-128", + SUNDAE_GIFT_KEY_SIZE, + SUNDAE_GIFT_128_NONCE_SIZE, + SUNDAE_GIFT_TAG_SIZE, + AEAD_FLAG_NONE, + sundae_gift_128_aead_encrypt, + sundae_gift_128_aead_decrypt +}; + +/* Multiply a block value by 2 in the special byte field */ +STATIC_INLINE void sundae_gift_multiply(unsigned char B[16]) +{ + unsigned char B0 = B[0]; + unsigned index; + for (index = 0; index < 15; ++index) + B[index] = B[index + 1]; + B[15] = B0; + B[10] ^= B0; + B[12] ^= B0; + B[14] ^= B0; +} + +/* Compute a MAC over the concatenation of two data buffers */ +static void sundae_gift_aead_mac + (const gift128b_key_schedule_t *ks, unsigned char V[16], + const unsigned char *data1, unsigned data1len, + const unsigned char *data2, unsigned long data2len) +{ + unsigned len; + + /* Nothing to do if the input is empty */ + if (!data1len && !data2len) + return; + + /* Format the first block. We assume that data1len <= 16 + * as it is will be the nonce if it is non-zero in length */ + lw_xor_block(V, data1, data1len); + len = 16 - data1len; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V + data1len, data2, len); + data2 += len; + data2len -= len; + len += data1len; + + /* Process as many full blocks as we can, except the last */ + while (data2len > 0) { + gift128b_encrypt(ks, V, V); + len = 16; + if (len > data2len) + len = (unsigned)data2len; + lw_xor_block(V, data2, len); + data2 += len; + data2len -= len; + } + + /* Pad and process the last block */ + if (len < 16) { + V[len] ^= 0x80; + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } else { + sundae_gift_multiply(V); + sundae_gift_multiply(V); + gift128b_encrypt(ks, V, V); + } +} + +static int sundae_gift_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char P[16]; + + /* Compute the length of the output ciphertext */ + *clen = mlen + SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (mlen > 0) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, T, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, T, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, T, 0, 0, m, mlen); + + /* Encrypt the plaintext to produce the ciphertext. We need to be + * careful how we manage the data because we could be doing in-place + * encryption. In SUNDAE-GIFT, the first 16 bytes of the ciphertext + * is the tag rather than the last 16 bytes in other algorithms. + * We need to swap the plaintext for the current block with the + * ciphertext or tag from the previous block */ + memcpy(V, T, 16); + while (mlen >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(P, V, m, 16); + memcpy(c, T, 16); + memcpy(T, P, 16); + c += 16; + m += 16; + mlen -= 16; + } + if (mlen > 0) { + unsigned leftover = (unsigned)mlen; + gift128b_encrypt(&ks, V, V); + lw_xor_block(V, m, leftover); + memcpy(c, T, 16); + memcpy(c + 16, V, leftover); + } else { + memcpy(c, T, 16); + } + return 0; +} + +static int sundae_gift_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, unsigned npublen, + const unsigned char *k, unsigned char domainsep) +{ + gift128b_key_schedule_t ks; + unsigned char V[16]; + unsigned char T[16]; + unsigned char *mtemp; + unsigned long len; + + /* Bail out if the ciphertext is too short */ + if (clen < SUNDAE_GIFT_TAG_SIZE) + return -1; + len = *mlen = clen - SUNDAE_GIFT_TAG_SIZE; + + /* Set the key schedule */ + gift128b_init(&ks, k); + + /* Decrypt the ciphertext to produce the plaintext, using the + * tag as the initialization vector for the decryption process */ + memcpy(T, c, SUNDAE_GIFT_TAG_SIZE); + c += SUNDAE_GIFT_TAG_SIZE; + mtemp = m; + memcpy(V, T, 16); + while (len >= 16) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, 16); + c += 16; + mtemp += 16; + len -= 16; + } + if (len > 0) { + gift128b_encrypt(&ks, V, V); + lw_xor_block_2_src(mtemp, c, V, (unsigned)len); + } + + /* Format and encrypt the initial domain separation block */ + if (adlen > 0) + domainsep |= 0x80; + if (clen > SUNDAE_GIFT_TAG_SIZE) + domainsep |= 0x40; + V[0] = domainsep; + memset(V + 1, 0, sizeof(V) - 1); + gift128b_encrypt(&ks, V, V); + + /* Authenticate the nonce and the associated data */ + sundae_gift_aead_mac(&ks, V, npub, npublen, ad, adlen); + + /* Authenticate the plaintext */ + sundae_gift_aead_mac(&ks, V, 0, 0, m, *mlen); + + /* Check the authentication tag */ + return aead_check_tag(m, *mlen, T, V, 16); +} + +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + (void)npub; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, 0, 0, k, 0x00); +} + +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_64_NONCE_SIZE, k, 0x90); +} + +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_96_NONCE_SIZE, k, 0xA0); +} + +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_encrypt + (c, clen, m, mlen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} + +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + (void)nsec; + return sundae_gift_aead_decrypt + (m, mlen, c, clen, ad, adlen, + npub, SUNDAE_GIFT_128_NONCE_SIZE, k, 0xB0); +} diff --git a/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.h b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.h new file mode 100644 index 0000000..9040dd5 --- /dev/null +++ b/sundae-gift/Implementations/crypto_aead/sundaegift96v1/rhys-avr/sundae-gift.h @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_SUNDAE_GIFT_H +#define LWCRYPTO_SUNDAE_GIFT_H + +#include "aead-common.h" + +/** + * \file sundae-gift.h + * \brief SUNDAE-GIFT encryption algorithm family. + * + * The SUNDAE-GIFT family consists of several related algorithms: + * + * \li SUNDAE-GIFT-0 with a 128-bit key, a 0-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-64 with a 128-bit key, a 64-bit nonce, and 128-bit tag. + * \li SUNDAE-GIFT-96 with a 128-bit key, a 96-bit nonce, and 128-bit tag. + * This is the primary member of the family. + * \li SUNDAE-GIFT-128 with a 128-bit key, a 128-bit nonce, and 128-bit tag. + * + * SUNDAE-GIFT is resistant against nonce reuse as long as the combination + * of the associated data and plaintext is unique. + * + * If a nonce is reused (or there is no nonce in the case of SUNDAE-GIFT-0), + * then two packets with the same associated data and plaintext will encrypt + * to the same ciphertext. This will leak that the same plaintext has been + * sent for a second time but will not reveal the plaintext itself. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for all SUNDAE-GIFT family members. + */ +#define SUNDAE_GIFT_TAG_SIZE 16 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-0. + */ +#define SUNDAE_GIFT_0_NONCE_SIZE 0 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-64. + */ +#define SUNDAE_GIFT_64_NONCE_SIZE 8 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-96. + */ +#define SUNDAE_GIFT_96_NONCE_SIZE 12 + +/** + * \brief Size of the nonce for SUNDAE-GIFT-128. + */ +#define SUNDAE_GIFT_128_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the SUNDAE-GIFT-0 cipher. + */ +extern aead_cipher_t const sundae_gift_0_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-64 cipher. + */ +extern aead_cipher_t const sundae_gift_64_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-96 cipher. + */ +extern aead_cipher_t const sundae_gift_96_cipher; + +/** + * \brief Meta-information block for the SUNDAE-GIFT-128 cipher. + */ +extern aead_cipher_t const sundae_gift_128_cipher; + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_0_aead_decrypt() + */ +int sundae_gift_0_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-0. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce - not used by this algorithm. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_0_aead_encrypt() + */ +int sundae_gift_0_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_64_aead_decrypt() + */ +int sundae_gift_64_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-64. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 8 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_64_aead_encrypt() + */ +int sundae_gift_64_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_96_aead_decrypt() + */ +int sundae_gift_96_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-96. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_96_aead_encrypt() + */ +int sundae_gift_96_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with SUNDAE-GIFT-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa sundae_gift_128_aead_decrypt() + */ +int sundae_gift_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with SUNDAE-GIFT-12896. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa sundae_gift_128_aead_encrypt() + */ +int sundae_gift_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/LWC_AEAD_KAT_128_96.txt b/tinyjambu/Implementations/crypto_aead/tinyjambu128/LWC_AEAD_KAT_128_96.txt index cc8e53d..5e6b8a8 100644 --- a/tinyjambu/Implementations/crypto_aead/tinyjambu128/LWC_AEAD_KAT_128_96.txt +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/LWC_AEAD_KAT_128_96.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = -CT = 7C5456E109B55A3A - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00 -CT = 607DFB91AE92D187 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001 -CT = 9B119B25015A10BF - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102 -CT = DC2FDD39A71EEA24 - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203 -CT = F7A293DB3FB16464 - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304 -CT = 5A32867CAF5725A8 - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405 -CT = 488B8125410A22A4 - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506 -CT = 6A2C5DEA3A47A4A0 - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304050607 -CT = F21877ED823971BB - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708 -CT = 35AFFB9367A10ABE - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506070809 -CT = EF310BAA2F1FEC55 - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A -CT = 54CE951891F27907 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B -CT = 077CF101A9FEBBF5 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C -CT = 0FD117CBBF0A60C9 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D -CT = 48C0AF48E0408413 - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E -CT = 839EC1640602502A - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = B9F64CDDE010C4C8 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 18BC13244F6D44EB - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = FFDBCE2FFA64F940 - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 834B45AF9C686BC3 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 8277B41EEF294662 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2F41CE259D23DA26 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = E29883A71451EB06 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = D9EAA06B841297CA - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = EBB717A0B34C70EA - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8CDA71D430ABA120 - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 5431C9E4ECA9F4FE - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 0A69C6911CB813A2 - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = A2F46F12CC7F09D5 - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = C4B4B0A00395A768 - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 53229D0770697D3D - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = F0B7DEB4FBE0C650 - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A440CA849CF90CA2 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = -CT = 02A5B193AD5739203E - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00 -CT = CAB4391F64177F8C2B - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001 -CT = F71DE294A1AE8666EF - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102 -CT = FE397BE6A452C3A584 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203 -CT = 36328DF1178A866B3B - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304 -CT = 509261726D33708BC1 - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405 -CT = 65E7B8CDC726BAEEEB - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506 -CT = DDA938DF15396DEFD5 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304050607 -CT = C71FF1C27C219B52B2 - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708 -CT = 0DE7630F7D7002BB0D - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506070809 -CT = C1EE912CF780B887B0 - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A -CT = 0405DED097F06CDFB3 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B -CT = F7E9C884C8358F2716 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C -CT = 1774E9F0B3AFEA523A - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 709C84A935361B3D09 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = A4890916292BF9FB9F - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 829A0DD7A844ED0107 - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94ACAADBA7997EA491 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A5AE8187F1ACA840 - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2842FCD0F7C84F1D53 - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 668A60120197B71031 - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DCDC519DC109A2A - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBAC1DB9FAACED7664 - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9FA5C7E325B5287D0A - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D182F9B35D56D90DBA - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F9228A462F64EBC84 - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C174CCA4A60F7DC3B - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C96383BA8A04F39454 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B35B36E87D5B91FD6 - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A94F666402EB2F18B - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E53BBBCEC84E468D48 - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4A28B02231EF7E460D - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 2136B2A2168B0E67E8 - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = -CT = 02856AEEA273E46FF98E - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00 -CT = CAE4E9049F35320CB728 - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001 -CT = F7C8EEBE9F76E7F7EB7F - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102 -CT = FEB06FEA8A1E73C7AC32 - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203 -CT = 362B53E59C249C2F98A7 - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304 -CT = 50B3104A4BAF7D7FBDC4 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405 -CT = 65740FA64669788D11F3 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506 -CT = DDAC92291FE08DDBF9F1 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304050607 -CT = C7D64D97A0295BFEBA61 - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708 -CT = 0DF60C965687C8D0BD7A - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506070809 -CT = C1EC784E2204CE557785 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A -CT = 047C87F6667341E2AD56 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B -CT = F770509BD977B11B72BD - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 1718657A701DE2E2126A - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = 70D4CB21C1F16CABFC8B - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = A4795865042C591FB0BA - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = 82384E6752A624EA16AB - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ED26585DDFECDCD1E - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A7415E9A4260A5122C - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 2821DABFFCFBE775E279 - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 663024EE8ACDD0319201 - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DE31BD61F858493C3 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF0FCF0738C876E6C6D - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F113CCFF16873620B75 - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D1A9DC814D8029F915 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85B941AC4A455E39E8 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9D2E2721900B58B294 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942D7B5EB952B3C78B4 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A627B47B0553FB8C8 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11E32F726B6FE09DD5 - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E595EA50FC8AFAF2B879 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB7AD7E1E1DDCD4D787 - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B08C23DD2BB751FD3 - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = -CT = 02858D9952AA1D69A0B13F - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00 -CT = CAE4E8A104D9001D6E7D59 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001 -CT = F7C8C92234441A3DB2BB48 - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102 -CT = FEB02F37A4AF000BF45B4F - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203 -CT = 362BC3B43CE2332FC786C3 - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304 -CT = 50B38C2284BB427E4EEC89 - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405 -CT = 657453C2264C682D644FC5 - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506 -CT = DDAC917A918827FF7C9665 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304050607 -CT = C7D6A405643AA9A50CBB39 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708 -CT = 0DF63E9D6A117D9C972FC9 - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506070809 -CT = C1EC7D2B854861ECB78704 - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A -CT = 047C05B4EC36FDEDAE9EE2 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B -CT = F770962A85F9CF9904BC09 - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C -CT = 171856CD75A330EED6CA32 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 70D4210F04C0C886506401 - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = A479D48B9FB9C5989CEA81 - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 82386571FBEA7757723A4E - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC4CAE82306317245A - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B6DB98A0692F76C7D - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178A81D7386EB548F15 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309E300091B7DBD62B8C - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F88A75B1899F42A5 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00BB17452DA78F30E26 - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C0EFB03782023A739C - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D7EA9F653C27D1806 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C96DBFDA90FDC0AC - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC02DAA0E5AB6E82CDC - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C63841EC617616A7E6 - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A47E17415B63D3796E5 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB3E94DC6C43DD820B - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952461CB873A39553FD5 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74AA67D797ACD69D76D - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B39DD0F8857A4398695 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = -CT = 02858D8340A74FE0ACFEFF9E - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00 -CT = CAE4E8F43E58E750B75CC2A1 - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001 -CT = F7C8C9508A0384337A7DCC2D - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102 -CT = FEB02FC985729A5C6DDCA2C6 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203 -CT = 362BC344C45C165CECA7FD82 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304 -CT = 50B38C216056A8700BB8ACD9 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405 -CT = 6574532B08A722FD2236DE48 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506 -CT = DDAC91464B046D53976998BC - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304050607 -CT = C7D6A4D8EF2E1C5EB34CFF7E - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708 -CT = 0DF63EF6CA003BB12BEE5C5E - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506070809 -CT = C1EC7DBD36A2965EBAA7BA30 - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A -CT = 047C0593296D3B2876BE134F - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B -CT = F77096F05FDC178C6FF85637 - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 171856537451BBD723A25098 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 70D42136939CB686517B5C11 - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4233587EED794C551EA - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 82386521FDDEF8F5A84C3FE0 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC0449397E0823A307D9 - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1F554D52E8D58E9150 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FA920817A94D38DC9D - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2406EE2BEEA172E5B - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F499E50CDF42B4C092 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B992D2C452B5CC5D0BD - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03CCA0FFD6A370D7DBE - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2A636E0971476CA2B8 - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C86C178A2A7B0FCFD6 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CE2BFA4AE50D115AFE - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D960AF7A69EFCE96D7 - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A4759C8F6A43E4E228BE8 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB964546484E5A82E691 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E595242483082B2B2D320589 - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A54E383E0CB88B713DD - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926CC6693E197989071 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = -CT = 02858D83AC4A4101AF5AF312B3 - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00 -CT = CAE4E8F43A816522AB3EBE6A5B - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001 -CT = F7C8C950E8FE2521A6346E807B - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102 -CT = FEB02FC901B6FBDE1E858737BF - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203 -CT = 362BC3441F13BC42461BF866D5 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304 -CT = 50B38C216879D1A4C4027F4129 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405 -CT = 6574532B5E99EB20D38C2CA48B - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506 -CT = DDAC91462A8E33640C769986ED - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304050607 -CT = C7D6A4D824E0C050BD7C2346CB - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708 -CT = 0DF63EF6A100A433C2CEA2EDFC - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506070809 -CT = C1EC7DBDC1A73513E2519C8B93 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A -CT = 047C0593AE5BACFF4CD66EB1DF - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B -CT = F77096F0C58C3B89C7271A7030 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = 1718565377F4C85F9C92EC25A9 - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = 70D42136490B6A32D4CE9342F3 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236710C8BFF36AD172B6 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 82386521951DB3001F5A10FDF2 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D92831316A1BADF724 - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC64EBB4306099D377B - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB68698448644CB9EC - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C6D3DB3D964B84AD94 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41D93E165E85A7E0E8D - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3E3DB239133ABBCC0 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C785A3385AF22354E84 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC4FE7D227FA6E33EFE - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CFA577C03D44BE4AC - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED0126885C6BE7E2C33 - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BED63F6573E575F33B - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A4759897E802AF86FADF01C - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB9625DF8D64C5C167CFCA - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424520325FCF2DE843AA6 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B3D148E0DCD09BC5F - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A56A3162A00E74D4F0 - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = -CT = 02858D83ACAB1A3CF61972F4D4E6 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00 -CT = CAE4E8F43A2484E0B7F8EDA2E5DD - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001 -CT = F7C8C950E82B6E6BA6C7732F93CA - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102 -CT = FEB02FC90197DFF542744DF99B6B - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203 -CT = 362BC3441F0A1CC130F77E47C090 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304 -CT = 50B38C2168367C708E8B03B69232 - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405 -CT = 6574532B5E058EF1A4AF1ECD4E2B - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506 -CT = DDAC91462A870A71FD074036B44E - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304050607 -CT = C7D6A4D8244A5AFFCA3B7BB1180F - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708 -CT = 0DF63EF6A1754B39F4D872EBE389 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5290A318370E49E92 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A -CT = 047C0593AEB876B5263BDD21194D - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B -CT = F77096F0C5C95F38B23C7C8A7B89 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = 1718565377631E4A02973E3177A5 - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FE02C0BDD4D9571EBE - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = A479D423673030ED0334A98E2778 - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A4AD4A3C82F96581 - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95622001954DE5F8B58 - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F15879A690B765420 - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9B12AD4BB84178F3FC - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA423E0FB765851B9 - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB27C5BEE97CB5A28B7 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B503C407602DF2FF7A - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C786637D729066C11D2A9 - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC4692A44BFF8761F759C - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF3244562985B7E0087 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED010D64B2C44906FBDB9 - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDA0F83493CC49BB025 - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A04DDCE946839173EC - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526391B16061625A331 - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E59524245291350EBA9A74C80B19 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44F739C0F4004ED76A - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EADE706553CF2BE8CA - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = -CT = 02858D83ACAB98C5A819A257E7FFA8 - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00 -CT = CAE4E8F43A24B23FAACD042C0AF306 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001 -CT = F7C8C950E82BFF38099B441FAD89B9 - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102 -CT = FEB02FC90197B5A724B3471B9645BC - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203 -CT = 362BC3441F0AB00DE70B3CEA2A9557 - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304 -CT = 50B38C216836EEBBD95940F667A701 - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405 -CT = 6574532B5E059DF7B62E291F2A1059 - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506 -CT = DDAC91462A87A4950E7C2E31CDFEA4 - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304050607 -CT = C7D6A4D8244A549BD3B38443C875BB - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708 -CT = 0DF63EF6A175EC62631AE111788615 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A916EBED876AEFD429 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A -CT = 047C0593AEB8439BB74BC5C70B0BF5 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A8D5785690B44608 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 171856537763FEEE73557ADA143B00 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE74E26FBF59DE9B4F9 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C98A23A91A050C2EC1 - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5948955120E913DA6 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D956840CD8F6461CE0FCF5 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F09F13DDEC263919E7A - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF682111CF7725BAFBC - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5473DA4F17438B779 - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F3EF92BCEA3AD330F - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51DD62BB5D6108195C9 - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAB1E5FB73E26233F - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC4692725377E9F8CE3935A - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35DD24309888909E4C7 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED0107024FDD57726FFFFF3 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC078D3C7E09E4837E - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BBE30D213A615422D5 - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB96252626060E193862E0FE55 - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100FDE86A67CFB1CE3D - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B4454D19103610975E77C - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A8F56E2120C959595 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = -CT = 02858D83ACAB9898A20D942E508C2D28 - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00 -CT = CAE4E8F43A24B29456794D144E6588AC - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001 -CT = F7C8C950E82BFF8FC64E0E559B9AF0D6 - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102 -CT = FEB02FC90197B541D6B839E07B61FCBB - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203 -CT = 362BC3441F0AB01FD8B81A3ED2FFF3B3 - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304 -CT = 50B38C216836EE00E1CD54FF0418317F - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405 -CT = 6574532B5E059D8D121570EA122F20DF - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506 -CT = DDAC91462A87A4B5DA538BE601D940D2 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304050607 -CT = C7D6A4D8244A54636022D9E7AB0A0673 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708 -CT = 0DF63EF6A175EC92FE95077EBF53F2EC - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D34D6B4518F76EA080 - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A -CT = 047C0593AEB843CD6CF329912D7786E9 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A24AE70C67BAF6860C - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = 171856537763FEEDABE7ABAE72691FF8 - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E052CEB76B954C594C - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C972B100D22253F0B5C3 - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EACCBF68686A86E5BB - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C309CE703B9A6347F9 - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092CBF37FFDFA9137521 - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF612BD3F9BFF1F54FEF8 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DE9138DCFA3F1A0FBC - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C18113A6597B404AC - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E2FB4AB9CF82D5350 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAF6B20BDCA71B2F10C - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D4CECBAE25A2A1350 - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EA0203858663D2B2D - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED010706694E26C81E71CCA25 - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC86DBDC782259C9360D - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9148668740C6E58003 - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269D8FA92580E11DC99D - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E595242452910019549E81C20BDD5512 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C6F366DFA9E658710 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A623A64B21C6E9EA225 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = -CT = 02858D83ACAB989804A562EECCDAEE545E - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00 -CT = CAE4E8F43A24B294730EF61981E76B2986 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001 -CT = F7C8C950E82BFF8F562A8D98785E7B8AF5 - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102 -CT = FEB02FC90197B541D7B1A8234CF452C111 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203 -CT = 362BC3441F0AB01F6FF50017A6CE9111B7 - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304 -CT = 50B38C216836EE0011487E05F646DAB6CA - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405 -CT = 6574532B5E059D8DB2B1460BE4491A93A3 - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506 -CT = DDAC91462A87A4B58CDDB9B9B4FC25066E - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB6DAC15E471AC77A5 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708 -CT = 0DF63EF6A175EC9256B88347383C0BC433 - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D336A28D479BEF12A6EB - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD808946B96718193FB - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2974C191BD0052B7743 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2DB87F24A71AD3E301 - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01ECBB038031844862D - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263DA9DB49DAAE2DDDC - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA37F7106224EC48AED0 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351A0F4E7537B2F1BD7 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C825BA4ED7E8E39C61F - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280AC11868FDD7E2954 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBEB374D6CCA88FD417 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A0DE477738E371B84 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C7712A33602725D89 - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE1E410114404811E1 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D2D8A2D90902F5518 - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB7CD520668F7899925 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B2F28B2584AF6818A - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865D58035BB630B85D29 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB919470E1D0610B340AA6 - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE5B1DBF7BD84BE0CF - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194F4968AFAFC49DB390 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E4FFE41DB63977D23 - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD56AD6E9DDB99809C - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = -CT = 02858D83ACAB98980422F06CC4BE723B830F - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00 -CT = CAE4E8F43A24B294735FC421F2764636CA73 - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001 -CT = F7C8C950E82BFF8F56DEC35E656E41FD8623 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102 -CT = FEB02FC90197B541D7309EE72E3587559056 - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203 -CT = 362BC3441F0AB01F6FDF8C3455290466385F - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304 -CT = 50B38C216836EE0011124D3B1A146B527152 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405 -CT = 6574532B5E059D8DB294A39F51B5DFE5BB09 - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506 -CT = DDAC91462A87A4B58C19B2E15DDC60399C2B - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F5BDABC4179DEC372 - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708 -CT = 0DF63EF6A175EC92560948C039C9B63522D4 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624D128CD78D36EA4D9 - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD899D144121619C26A69 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976AA63EB44336550E18 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3BCEAE3A0D2E12CB6E - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E4107E7A83A19E6FA9E - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5F2B861BA8DB1D682 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA37131C21FD43B8F61378 - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C3519465F127CAD5B1AE3A - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F7DD029453D84BE3A8 - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED5DCB08FC73730658 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED8A2C456A0BA27F2E2 - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B3029A0456DF0DC08 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46306DD22513D77B89 - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AC2D5AB11C2508FCD - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8ED961F74E64CF74C6 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BE2F224E38BB4ADD7 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98D83A634BC89E0AF2 - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF367996A6D0BE572BB - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB91948468C954197F9491E6 - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93687BBEEA523F0850 - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFF1E5B69FDC0CC382 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E901302D94536002D21 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD5002D3A342E0DFA62F - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = -CT = 02858D83ACAB98980422AAED70B3CA1ED9159E - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00 -CT = CAE4E8F43A24B294735FBE454A693E7603544A - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001 -CT = F7C8C950E82BFF8F56DE85378CFA2530905288 - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102 -CT = FEB02FC90197B541D730A6B483C4F91D6883D3 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3BEA5FE135C4AC0C5 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304 -CT = 50B38C216836EE0011120CA85DB482A91DC60A - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405 -CT = 6574532B5E059D8DB2949AF5C1A03D268914F3 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906C352CF4D55DB3AB2 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F7B63BF32C4E2331D - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FCEFD7B8CD906D9305 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDABE932D023D3D0F0 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997CDD627CDA91C00DE6 - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A999E5C8EDB8580E417 - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7253A0ACEA86DAB51A - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A11C1D32C02C568EAB - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CAB17596F7E8FE0FF9 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FA3DC73D7FA60F402B - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942CADFD2059E405D46E - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F702E9525D579DB03E4A - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2D475545321F08504E - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80FD110DF75E14469E3 - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7B32161DEEFB1B1DF7 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A4B7DC2C89D970BAD1 - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF6AD71B82E0B7EF99C - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EADBB5B6AECEEE61235 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD920F5B9BEB73ECB5C - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1C3E74AFC7319F00B - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBB2736E1A80351CCE - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846DDBBD28762FC811F1 - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE9307666A157866F048C9 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFABBFFAD7683B4D7455 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FA377DA76A58332618 - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DA9F89A3A7D918F280 - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = -CT = 02858D83ACAB98980422AA699F5D4D1A79F13ACF - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00 -CT = CAE4E8F43A24B294735FBE279D484461F947285F - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BCBBDA55E9A9279040 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102 -CT = FEB02FC90197B541D730A66AA911A147D6F4AC7A - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3998FFA3F45D2A9BF3F - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304 -CT = 50B38C216836EE0011120CAE6CEB1AD3718B6330 - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A5EC9D1157747607 - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B73E3E9CF101E126FE - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F20D4F3025F84EDB9FA - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC749DFCB466E2F306B0 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE108D2672AF3DB020E - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C323DE5BD8D8F280771 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CA9F16B00805232EE - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200E1E0E753B941F70D - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A1298CB0A19660AA9238 - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACA1A42CA60F8E8A8A3 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA2DBFB0B5D02F4B060 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BFDA0B17F65169890 - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259DAAEDB4CEEB256D9 - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF837E1D2EFE93E219D - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2E149E85ADA19F5883 - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF33176903CDE661CAA - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A4154FEE0F6B61DC7F02 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65AB48081412E0DE82C - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD389FBFAD806770FEBA - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD9295FC00EAFEF97B715 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1AC71754E2D6E02467C - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4B78A556482B950B8 - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3B148F1FC6A52191FB - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BF22DBC0F85F40607 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F4B8C50F25B410F50 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAAB23B3742A90769278 - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6421AA7ABBAA0AAA7 - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = -CT = 02858D83ACAB98980422AA6932386E39F34A495D7A - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00 -CT = CAE4E8F43A24B294735FBE270D40FFAB2B064B570B - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC910853CC06E180832B - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102 -CT = FEB02FC90197B541D730A66A0846711859155D224B - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BD91CC2BB4DC7B367 - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58FDF5A161233580C1 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A6B087D53B08682BE5 - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E273670B46823CFF60 - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F20541E3932EAF0E3B704 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A866FA335B4DA500CD - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F919C507C204E80C98 - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE4979A9872959CEAE - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF1BB9C8C577CC11318 - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A1F88AD1A9478D9BB4 - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FCC0B2E77CCEECF769 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADABE26ACEFDE0BE078 - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BF3869AAD885BF622 - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA739235DB2C5581315 - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F702598094E56B3CF32ED2DB - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A7C8A15A541F2B0A28 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE6D545B929BD3917F - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32D11AC9EBAE7F6A045 - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D30234CA1871BE6D8A - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A055F746F2561A56AE3 - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B41941CCE3C810C4FC - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366BBD6B695B77659B - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE1388824B5E288B5F8 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4995F5E588D499AFE73 - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD5E560DCE91476D004 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2ABA047D1B0FD33D - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86D4F404C9D7616C96 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5A52301385319C2A2 - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C805C9749B9AD2FEFA - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = -CT = 02858D83ACAB98980422AA6932D228AD3666B9F08A3B - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = CAE4E8F43A24B294735FBE270D327B56FEC7F7F2830E - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC910147AD67EA065F704A - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = FEB02FC90197B541D730A66A08DB1C64D01253D89FC8 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC160AC5FE684E92859 - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CF62A044135354766B - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A6502446CB3A0DF18A35 - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216B1D873AA801E38F4 - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAA9855421D15D1D77 - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A85124445D8E2B1E29D8 - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9ADFAE0B53240C7BEC4 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE45FCB96EEC583F54BE - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF1503C948B34CB3A769D - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A1446A501E2E88490757 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944D0EAF68E2583350 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC113A2A4DA33173EC3 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEEB9228A563A03675E - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736CF3E3AE34119DCEB - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A1CDAE92790EC2971 - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A74330F2A793FF15863F - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4BBE5D50B007638F30 - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE223E90C32F11067F8 - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333AB76D4D9FB7B422F - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FF969AF448693FB5AE - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B4247810718D83F8D73D - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD9293663A5CA8BD679CB1D67 - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17AE6A828DEF69698ED - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C217392BB51057C98 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD592B1A47D4864D3B445 - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A52E989C85695C399 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86726DFA893B7523C5EA - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B32FE3A8B1CF60B7F3 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF52C53FB1868EC00 - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 02858D83ACAB98980422AA6932D22CF6F55C96AE79AF9A - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6A678D5A263F8E89B - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E62045BCBFC0042573 - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2A5529285CA5A4806 - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC1760928BB08D74279E3 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB34519B12975E78E8 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650098B98878D259E5EFF - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E21615BF4848F3FE52031A - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE7C1718850EBCC84E0 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A8513859BEB9C2D86094D6 - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD27647B2D67E5C96FA1 - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458AF832FA08270FC7AE - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E07BFCAA8B824AD929 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C36C2C0125D46524DD - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A57D5F2B42468CE8E - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC19453146F9C608F6CA7 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE970F682449C741CE78 - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEAEBB28459173AF75 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A32745BE9345E3994D6 - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A74334268703029E62192A - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EF3A0CF17116CA2AC - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE22254449F13556C9DBB - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB467EB7ECE188FF0A - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBE2336FECDB02F41F - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B424752FBF765F685FF24F - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379F020727A508BBD15 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A454AD4F9C168D0DE56 - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6920B25111B3E8EF22 - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275E122822854F6E736 - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A0962223FE42DAF912D - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A8191EC8382F877EA - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B357E0CD6276C1595681 - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FE1CA5CD7B743D16 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 02858D83ACAB98980422AA6932D22C112D8AC339CCF8284D - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C678E86C2CFD2E8F08E3 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B14B30D403B506883D - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA284C5C2E43495BFE288 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644CAD8A0EEE2FA2DF8 - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1B25128CF60D51DEAF - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AE2E12053338B50CF - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C1B1EEC631DBCEC4A - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE76986E3DD60BE9E364A - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384D065DCF608E63FF08 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276DEE629125ADFB43EA - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4A16B98FB3F753025E - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E01229559A4D065058D9 - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C36642B219CF130EEEC0 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A60820F118EC2E2A381 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C5F479DFC6F6CE5CF - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770A8422C8B40E06D4D - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFDBBCE9B8E74D8B290 - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326AE59179B34F1BA60C - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340AEF9ED47AAF13CF7E - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE95FDE16696439821F - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227BED4E5FC3790E463D - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E7710B0925F543BB4 - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5A5234E434BAE1AFE - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0AE044E7DD733D3E6 - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EA8316589C61A48329 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456CC23C7338723804F3 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C69159F40293F4433907B - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275752EDD904489A5F2AF - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A095209AE86F44F68DB80 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71AAC517C086A0B042 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B357299FEEBC8B9C31690A - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FE311A082F63333E5E - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F890E332754F69A4CE - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781BBBE95BEAE2926C49 - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E597B4759467B05077 - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D55728E878D53D9E3 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA05F84038944E34C4 - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD5E679A3975D2925B5 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA5F63B01FE6FBA2FD - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D9326AEBF85A88E8F - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E09ECD7CBC4444339B - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DEDDB55A4C5152257FF - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D8062F053C754BE711A - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACBE7CC016A0398D3A2 - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CBD12063165541130 - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B6EC6978722F2833D5 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A742D2F855066E3D1 - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4D84ABD63B5A983D60 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B09D704F62E69F8213 - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5A1AA549DF53BDCD38 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77ED31D31B501B58E1 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E2C51F8B55F29A642 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF17DEB3EB56B5C589 - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B56C38B9FA1903A135B - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E734743CC611CE5D9DB - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BE1C7E1A3D1FC06E33 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F2EF02C10E353BADA6 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA8831796A650570D98 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C534AC29F5EF3EEBD8F - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D7A9101852DA036DA9 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EB1639B43E7E85FA7 - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EB8C7575964E5445E - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FEC9991FA543BB5CA7 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B35729035417242E3C888579 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA8870D7556FA2E1E4C - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83EA333A93AA5A6B5EA - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40008B4417C63B86F0 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C93A444B43790F5E48 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7C2FA59E0C886B9923 - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07D9679A8CF92F429E - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507A861CA7032D9DD48 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C25F9CEBB4D0E802F - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D814F50A2D6895EF24A - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0464E3DC33781F46E9B - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED31122ADD74FE554759 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A121F5137A536A5EC0 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB9781A4B43357316969 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB1AB4690D17276E9AF - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B68232DE8190CB5D3A65 - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8F977F495F6227D090 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC71C6C56E0CE6735E6 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAC73717D1632AC5AA - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA140F4EB371DC6239 - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A7790285AB79072264FE6 - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4B745200B456C5C0CC - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7EDFC756A58276CF56 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9E2ABD0A66A394BC - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732DEC0243B324DA6355 - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA86E0DB4F4683CB66C - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F2699770DC8699E2A316 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823A8A5564CF2FE453B - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C537267D3EFEA3F8EDA02 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D7629CEE7690B74C11B3 - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE60A44E84D2157A9F9 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF9790EBC420EAAAD8 - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE458F3E86960F0748B9 - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D683DAC92982D2EF13 - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA869BC3ECB139D4E9A8C - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BDF016D5F45D8054D - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AFF9123A36A94258B1 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90EA139BB42B108AC17 - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC5D5C7486A0349482E - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA0799D09FAFC0C86CDA07 - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF2254015598D70EB2 - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EF0FB8781C0652C5E - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D8142DAEC692D48FECB52 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466BBF3B2D114B2FE352 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CDEC1D33BF6FB0262 - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A136053381354F46FBEA - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FA84BEEA2BBF7FF053 - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB13851F629752FAB1704 - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B78210FB2F14AC43CF - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF029A5E6746DC514BB - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC762DA341BA794187BF1 - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEB614BE70D12AA6400 - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D6439EF77EF1D8FBB - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D4E95AB595D49B525 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB26A75D6C243DF2D6D - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C0B520708F10FB9DF - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9DD8D144F40BDA970F - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D7413FEEEBA8440492F - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B0858871378EB721F - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F2694739C6BD0A07BEC275 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CD42706811E8A36A19 - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EB14CF1C22BF3C78B8 - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA4E359E217DCF4158 - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D759B74A97F03A003 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1AEF884AEB4C3B1AD8 - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE4550678A59E60D55302D - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D37AB271E9672B458 - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964060DE69ABF1D7973 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF16696919FC888F2A9 - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF763445E87F0BA56D44 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED5996F5814B5AD8189 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51236436CD03ABF4EAC - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D989B994624A19475 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF62710B148215449DCE - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA22F750C7B687841FB - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E65D0A61E1B13984C - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2BCF9CD9F8C9B08ED2 - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA10450CD9DDD99BFA4 - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627506DB3C891A9DA84 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC4898878BDCB189CF7 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AED428C6758ADC8D19 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708FF22F069AA30FEF7 - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D34D05D28AA4F1CA8 - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209DB0F59C7DEDEA69C - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA2B1C80EAE4FC77D1C - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D17BBD4FE033CA04157 - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41A376918D26C38071 - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB2063D37FE43D5F986CD - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11EB41BCE79F64A7F7 - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7EDFB135D6C25965AE - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BE0278E3FE945E5D69 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12B2F17C15A9EE814A - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B446F7C768D0AD78AA - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD6E20DA80D14E4CE88 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE05913DDF7EE4A7DF3 - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D822949DE69060173 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A1ECBB3700DA8BE18 - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8CD639B48F3C1EC64C - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016839654F72DB2E329 - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D3711146B0AC30F20 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B81F005DC82F33B0D4 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF1630A27C01CB1B9D505 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF760416D5D9D37101436E - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595C01B6CED49331594 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215DC7C967D5E2FEBF8 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D973289330B25A4B95B - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E121DC8FC4B393DF5 - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210C76A04162092767D - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6262191E3185DAFB6C - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10D38D842FC353E2E1 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AFF5F775CF16CB5DE5 - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A0484842ACFB1049FD - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40CC12D270715BB0540 - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE785F1DC7CBCADC2E4 - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708679BCFC52D90F1E1D4 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71BBAC9B19B0F00DE9 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209769AF42BE94F2C81DE - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA2025441EDACB4D73A97 - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175C1CCF9BB00D90FB73 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AA10144C00C041F9C1 - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9EC1BA6BCA216E67C - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BF6B61E39A95654FB3 - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45B7812E3580C863A3 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA64FC0EDE60D7AEBF - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CF2314CA1D3A8E5B2C - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B4171774B03AECBD3D8F - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD67924B17EEC72039F64 - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7AB9C5C8E96AAC1AA - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6139F620F6760FC860 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A45A0EC21734680E433 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C50465F03E96761FDC5 - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8CC5EB4C0E5DB72B4 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9D59618EE31CC9DBF2 - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86A1A49E57D6B381923 - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D4739BF65FAAD0F443 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C3F5F84931F89416F - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED59530ED50CFD854FADD02 - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC448D3B6E27A1D1E7 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE26D4A5FCDC991337 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E734335718C87E05F87 - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A7AB9D40A04761E20B - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E62403C0FFF9B6943715A - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E716AE8DFC786C385B - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF2929F3BF1D0AFD0CD1 - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C36146C651407694C - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C849DBAC112B1E3C058 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BAB8ECF655C0B96998 - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670BE0D347501D3E14DA - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91B667F87E8024B9E - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F888A733EFC8FBB23 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA20208D9EEFFECD85F9B7A - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB3691D52D87E58BC8 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1922EC84A7EB15386 - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9656D6BB1DE3B20B078 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFFEA16092F5B97B45 - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D626987C42A8E1AB79 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216DB8B7AC34CCF558 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCAD68B8F42F74AB1CE - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A3E7FFC90F4ECFAF24 - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F1404449A235B8523A - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B21AA1C68C663A0D7C - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D610349610531A1C8C8BE - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BB601E1CCF3852CBF - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C5091472DB99E88F5AB1F - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EF8488501493A6C0FC - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFD491C1CEAA2F0E53 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF78CB7FC19C03BCB42 - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44FB141A0D651179CC3 - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1CF15CA9B1CA6BDD2D - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED5953023A08E8457ABCD272C - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53EBA82A03396B9AAB - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51E53C9C785373DD87 - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732812E85D6D86EBDDDA - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B5C5CA8F9E390062C - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E89F09E1FEFF95C57E - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E0AD8567C124D9272 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D563743DC4FA40A29E - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95A9C2F45C783105DE - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C8427DD276A82B8BFB211 - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA6147BD40417D63536B - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B54D98B839F5BD4185A - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C6F42FE6DDD0DE59A - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F06E6AC0A398CC83500 - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CCB133442A5A0CDCD - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB5248EF10E2AD34C7C9 - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6888FB73CBAA3313 - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EC48935BB98BB80B0 - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1E2F5A2DEC4F95AC6 - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D686A853F52E6943DF4F - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216FB1007E0B85936D7E - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05C1085C403A6A692B - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37B6EB0C1537AC7236B - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9F02242222BE007A - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B3C9BA99776F2A5071 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C401AF39B3EDFF87AA - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFAE9EC462F1EAA9CB1 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189C5FC615BD58AC0D8 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA266A7CA2BDC8A97BF - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFACE1EAC36E99F5CF0 - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CAAA8CE307DF70BFBD - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F60644AD3DD031FD772 - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C739ABE982F22C5C800 - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391674EC7D8F1013222 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53293F86D7AF05F529B2 - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D404843E28708D7524 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892E7036EDCCC9CB800 - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0EA90598EC01515604 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E29723D1E79C7B8004 - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E439529293130AEB339 - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FB14580F72D5CB40FF - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3E5650F3A4D30BECF - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C8427849CCF8B318FF16F69 - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AEB5927E9621728B5B - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428CB649FC720FE6D1B - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F2288132D247B5F6B - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F06874C170F0E4B6701D3 - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8AF61BF9005F61B27 - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E98C1F69FB5230DBF - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CB99FAB726A9C5397 - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE5281697BE8C350FDF - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B840F8F852A097488D - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863A29151192A5B82DB7 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B127F2AFC83E712B1 - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA054422BD1AC7F70FC7AF - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB39B43ED07C48527EA - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B933E61B09440BAE121 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30F13E153CB183B30EB - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A5A9D1AED2E0D57D72 - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA70AAD07236810D36F7 - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C50918907E7FCAE09D40B2420 - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E62A60885730CE2A17 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC899D55CA1E5AB111A - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D4222304F3EC12D54 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F60823B72877C20533992 - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C732891BF6388179682E6 - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DA5A7444DFFE3AD341 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292F72011CE99C8B046A - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43A03EBB3A6676A94B1 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E73289219E7C19DD253EDE86E - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E358F65C463E996650C - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A465B814A8E8E9FA4B - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA8F7C26A6AF223AC9 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA5F510DCCDF06DFDB - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA2D4E10F5F04FA163 - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F3F916D1FA2126D86A - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE502EE14DF16A761251 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE220F0606C17C0D80 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4DAB17B3AFAD28A4D7 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687629A5CAA190F70CAF7 - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8215D5B7387B465CF99 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E117348C8F02AB7C75F - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CAB1BD840A8AF90FD2B - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584F61CE5FF97C75DF4 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8367EB5F85D03924B - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEB47218B3FD218BA61 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B9375C5235BB2B86534 - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA054474EABC06787B93DD69 - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3415E99960C71A82874 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341EF1E42FE402351BB - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBACFCF74B62320185B - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580F970142152452336 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA70051404C7299ED9A851 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B0CD2802C77B2ED - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F56A27AB7C2CA105 - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86C6955F0961F1A8108 - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C5F6736510FFDF045 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA55627B9C3C703858 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D82B948AA5F63849BD - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDB5CD158A91F3585F - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB77154B723A0E017D5 - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE6DE44099A305E711 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C095293322C531FE9 - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357B68DE4192EEC53870 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0973FA4628847375D - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30B85CE987A0152549 - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA253B01B317859DCB89 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA981DBCD9809F4A26D7 - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F3203E2DC4B5691588FE - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E335B22AB65E0C91E6 - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE706559C5014932B5DA - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07877A766501C4DB0F - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627AC831B56ED0D4F731 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8219526971782B3AC28D2 - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB01BE60B4D58EEEFE - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC16260407EF6333CB9 - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD2AC443F31CCAAFE6 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4F7E65663C6EF61C3 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEADB322B4D7450A36F - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937E588BCA2446F03348 - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744499F57FE1EEEF9EB1 - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A378462EF38F153EA - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B934138061859F17AD4FD6A - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0DD6833AA805D88913 - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4343B5DA694A9038C - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2D476CBCE420C709E - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B789AC992BC13D1D3 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F37754B7BC00CE6D39 - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDE1412D8BA701D329D - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1C9CFE664F6DD41B0A - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA20DD5F35044898FC51 - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8670F3C05B11131BBF0 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE363935A9B1B53CC31 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A1FBC83AF963DA674E - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE307D148CC98F7DDE3E - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89053E19D77CD00586 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA48CCC2B6EC938B1A - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C1031FACDBA4E475B7 - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA3091CD1670A6EA14512E - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C03EA9B77E07F5FA90 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E2622F397AA4CFB2A4 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D23D284D0235CB96F8 - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F730BC111C6CB77729 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DEDDE6D8AB35241FB - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A1DEF9DBFF14E832 - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0CA9CA38FF6DD7B2A4 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE1F3F647682ED5F11 - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65E122A639E1AC9FA6 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FC1D5E59109F278C - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E082CB397A6D33670 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4279E59A88122152AA3 - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8E2AB5B01FD4E1EBDC - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB84AD0F5E9B166CB68 - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05447444306AEC363123B8DC85 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73C4C9DA5E4F8F6F3C - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380F58053138BC2C2E66 - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3A135AED7D53D45099 - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6E466375556AE0DB9 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC33481E35C9ADC42D - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B745D52FC6C14720CD2 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3ADD0CC32210A5BB642 - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFCB0C984F443B97E06 - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA44A619555862F328 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AEB5C53236708B6D3 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8672484AAF62EFE09B684 - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE393C19F2B686D7F4D0E - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A1917A0C567E363E1382 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE3004D5F097E81BA04D05 - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C58D1D2F39F1D9BA42 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DAC45A2BF3E8D6604 - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15EDB30ABA54A2746AB - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916C4AA02573D2A39BF1 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3D8A5AD7C7FB5F10F - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23B8FE19B9F6340007A - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2603616BCC6E265626A - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F74237005ED0B7F7872F - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6C9955E10A6FBF247 - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A72D3CA70ABC954F47 - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C2821CCBA0F36E95D97 - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE094A46531B8997660C - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F107B004B3888FE41D - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FA069E1F3076963C17 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C3B2FCC3B1B391AE7 - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F42754675933FFD1329F4E - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC64A53E7289AFB529F - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AAF5B2CD9969BAFA - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05447444309621B19B6F6861A501 - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A32C2F0063B4355AD6 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAEBA81B34ED7D08252 - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFE3014B118BDC06CD - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CAE42C6A99C4325EEF - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC79A777C953FDD84B4E - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4DA7D5B7FCB1B969 - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD441182705146A5AA12 - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC4780E0DA5E4335BBCB - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DCBDF3BDF61481A62 - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE00B3B2F91EA4DB606 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8672458A6067C023E025ADE - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B5CF7CB257BDDB019 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F142E633BEC8F80E34 - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477F1105EAB67945E74 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C5042EF534E948818BBC - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9459C2EF428E75891 - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6DCC35F615B94B550F - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF06CAE455EB0ECEE93 - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3313D88A1EFC42C9F6F - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCA05B7AA4FB10AE4C - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D5A39E4D2FB1E924A - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DBF6C1D1B816A99E32 - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BBD4844A9C24239D09 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E88404E9A692AEFDA - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D5B16523CF825CBAA - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDD459695B9C94DE6C - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3B409DF5341DA454A - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE728AC1BED634B3F0 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C79D19F3F6FB456AC42 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437AE548260B082CA61 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628DAC478BCB1E418D1 - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AED3F26106820D9E12 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960DC8729A4433D0E57A - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDA307BD4FA7C82087 - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE2906F385EBB3E7CF5E - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB8C3721E46A0204FE8 - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0F9CC8572DEC7475D8 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC791872D34E0DDBBD0DC8 - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4C670BD7E9DD1F3B5E - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD4464434FFA69A426B9B2 - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E537FB42C0A5686763 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BBAF8ABE06F3A294 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7B6BB298E28BEFC4D - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A00E74092ED3B285E - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D18EDBFDACA902D63 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CD4958CA09675E496 - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FD3B0B45C40DAD6AB7 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482AD4AF5A7BCEC8CB3 - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EBDD2A186F8DC3CC80 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FBA610E05EE26C3C7 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F2FCD24D132E96205 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318E5C669C55D15DD263 - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE66D1C1E831BCA986 - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E869E2A30237539B1 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB3482BD249711FBF86F - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7B59B9BB20BF1512E7 - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E432B92E54E6B735531 - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D22553DCAD66EB633F3 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB75E3969A1A15DADB6 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB6FB27C8B8B7FF110 - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE605BBD3D47915B72CF - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C791220B677DC3169FF1C - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EA36E261EE79CD9C84 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B46A009C3277E530A2 - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2DB550082F2E36DC2A - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3CCC39C56A2092EA84 - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDF9F84EFA83ED634DC - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B19D70CEF2D4666DC7 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB8223E484477667A46C0 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF1AA4B5B172E81D5C6 - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EE86EB9918815B0B74 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE289D0C43E2F22A9B3 - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD4464078E52D7666D01B09D - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DB078513AA5A5D3DA - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BCA35C47CD4559C2E0 - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7D83A5BF128BEDAED29 - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A3848B561F00C27E5B5 - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D5F899AB21FFDB6866A - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CA2E03E2E491BCA6EF3 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FDBCF47D6F08EB02E554 - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482F576334FA82C1C13A9 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EB9C91BB9CCE5A0AFA23 - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FD27BFEF5C5C60F94F7 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F4A49DB28BCD3FF1AEA - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318EB2A00A3FB99AB17030 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE313298AE5DDA6A7F72 - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E2E58EDBE4337F8FEAB - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB3405B78D31C1928E5D0E - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7BB9DA1AB64A7FDE13B8 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E43CA3DEF0D392158829C - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D2292017E3D30C86B6E97 - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB705D58369CDEABE12E6 - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB3F8C09FF766E7AF163 - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE60FB031CE4762F7298F5 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C7912A94B3FA4D1CBE9AB2C - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EAC98F92750AAE816458 - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B4B94382114A76FD3B0A - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2D958DF7DED5E761A3E9 - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3C2B19E4300F3EA6F244 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDFAD4D06093C28C7F798 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B15C4377085A41B5029C - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB822FDD15514073E65CDEB - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF159284DA5614D057D60 - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EEB53D026EDE890584A9 - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE2E64C1992F2DF105708 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD446407E29713A4E2002F4C09 - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DC0B72923C27BD3545F - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BC22DA312BD13413AAE9 - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7D8D4F796B1B8D9707EBD - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A38B085E6DE3BB3F9EA36 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D5FE57B299E25E46D0308 - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CA20CBBF0C63B7484FF46 - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FDBCB26E76FF3765033B5E - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482F5701C83FA7CB6567725 - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EB9CE8BF80ADDAC0A14317 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FD2CC69437A3BB1984763 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F4A95BB7D80D47B41F44C - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318EB2D39C2CC1E6E48229B8 - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE3151F67C5DF19D651F27 - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E2E7E0E941AE3F0F85871 - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB34050B7A33D67BACF82483 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7BB99779B48C42E8B5BB68 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E43CA87363B1424D24DAB1E - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D2292FF51C0319073B99C2D - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB705DE99AC1CC66C019633 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB3F3F6E5A712B3E86F311 - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE60FBA23AD20BFD9371E888 - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C7912A9939E6FC6E26A0373D9 - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EAC906690AACFBD3FE65C8 - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B4B9789C5D7FA5A2AB9A35 - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2D95BD0E42C2E337A96872 - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3C2B05F2B823CC836B714F - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDFAD49500419DDE2631DD7 - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B15CEE2BCEBECD6EF974C9 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB822FD3A22741DB231F2EC58 - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF1590D258AFC3B07F71D53 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EEB571A7E4C73375355491 - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE2E60F2F90F7501423A5AD - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD446407E2F8340553180E44ABCE - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DC00FEE1FD8BD625BB2DB - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BC227123AC0914B8BAC0E8 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 7C5456E109B55A3A + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = 607DFB91AE92D187 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 9B119B25015A10BF + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = DC2FDD39A71EEA24 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = F7A293DB3FB16464 + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 5A32867CAF5725A8 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 488B8125410A22A4 + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 6A2C5DEA3A47A4A0 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = F21877ED823971BB + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = 35AFFB9367A10ABE + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = EF310BAA2F1FEC55 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = 54CE951891F27907 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 077CF101A9FEBBF5 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = 0FD117CBBF0A60C9 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 48C0AF48E0408413 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 839EC1640602502A + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = B9F64CDDE010C4C8 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 18BC13244F6D44EB + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = FFDBCE2FFA64F940 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 834B45AF9C686BC3 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 8277B41EEF294662 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2F41CE259D23DA26 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = E29883A71451EB06 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = D9EAA06B841297CA + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = EBB717A0B34C70EA + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8CDA71D430ABA120 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 5431C9E4ECA9F4FE + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 0A69C6911CB813A2 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = A2F46F12CC7F09D5 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = C4B4B0A00395A768 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 53229D0770697D3D + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = F0B7DEB4FBE0C650 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A440CA849CF90CA2 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 02A5B193AD5739203E + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = CAB4391F64177F8C2B + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = F71DE294A1AE8666EF + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = FE397BE6A452C3A584 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = 36328DF1178A866B3B + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 509261726D33708BC1 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 65E7B8CDC726BAEEEB + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = DDA938DF15396DEFD5 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = C71FF1C27C219B52B2 + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = 0DE7630F7D7002BB0D + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = C1EE912CF780B887B0 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = 0405DED097F06CDFB3 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = F7E9C884C8358F2716 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = 1774E9F0B3AFEA523A + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 709C84A935361B3D09 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = A4890916292BF9FB9F + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 829A0DD7A844ED0107 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94ACAADBA7997EA491 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A5AE8187F1ACA840 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2842FCD0F7C84F1D53 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 668A60120197B71031 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DCDC519DC109A2A + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBAC1DB9FAACED7664 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9FA5C7E325B5287D0A + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D182F9B35D56D90DBA + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F9228A462F64EBC84 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C174CCA4A60F7DC3B + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C96383BA8A04F39454 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B35B36E87D5B91FD6 + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A94F666402EB2F18B + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E53BBBCEC84E468D48 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4A28B02231EF7E460D + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 2136B2A2168B0E67E8 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 02856AEEA273E46FF98E + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = CAE4E9049F35320CB728 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = F7C8EEBE9F76E7F7EB7F + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = FEB06FEA8A1E73C7AC32 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 362B53E59C249C2F98A7 + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 50B3104A4BAF7D7FBDC4 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 65740FA64669788D11F3 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = DDAC92291FE08DDBF9F1 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = C7D64D97A0295BFEBA61 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 0DF60C965687C8D0BD7A + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = C1EC784E2204CE557785 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = 047C87F6667341E2AD56 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = F770509BD977B11B72BD + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 1718657A701DE2E2126A + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 70D4CB21C1F16CABFC8B + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = A4795865042C591FB0BA + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 82384E6752A624EA16AB + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ED26585DDFECDCD1E + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A7415E9A4260A5122C + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 2821DABFFCFBE775E279 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 663024EE8ACDD0319201 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DE31BD61F858493C3 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF0FCF0738C876E6C6D + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F113CCFF16873620B75 + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D1A9DC814D8029F915 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85B941AC4A455E39E8 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9D2E2721900B58B294 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942D7B5EB952B3C78B4 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A627B47B0553FB8C8 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11E32F726B6FE09DD5 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E595EA50FC8AFAF2B879 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB7AD7E1E1DDCD4D787 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B08C23DD2BB751FD3 + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = 02858D9952AA1D69A0B13F + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = CAE4E8A104D9001D6E7D59 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = F7C8C92234441A3DB2BB48 + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = FEB02F37A4AF000BF45B4F + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = 362BC3B43CE2332FC786C3 + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = 50B38C2284BB427E4EEC89 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 657453C2264C682D644FC5 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = DDAC917A918827FF7C9665 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = C7D6A405643AA9A50CBB39 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 0DF63E9D6A117D9C972FC9 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = C1EC7D2B854861ECB78704 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = 047C05B4EC36FDEDAE9EE2 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = F770962A85F9CF9904BC09 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 171856CD75A330EED6CA32 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 70D4210F04C0C886506401 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = A479D48B9FB9C5989CEA81 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 82386571FBEA7757723A4E + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC4CAE82306317245A + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B6DB98A0692F76C7D + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178A81D7386EB548F15 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309E300091B7DBD62B8C + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F88A75B1899F42A5 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00BB17452DA78F30E26 + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C0EFB03782023A739C + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D7EA9F653C27D1806 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C96DBFDA90FDC0AC + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC02DAA0E5AB6E82CDC + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C63841EC617616A7E6 + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A47E17415B63D3796E5 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB3E94DC6C43DD820B + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952461CB873A39553FD5 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74AA67D797ACD69D76D + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B39DD0F8857A4398695 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = 02858D8340A74FE0ACFEFF9E + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = CAE4E8F43E58E750B75CC2A1 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = F7C8C9508A0384337A7DCC2D + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = FEB02FC985729A5C6DDCA2C6 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = 362BC344C45C165CECA7FD82 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = 50B38C216056A8700BB8ACD9 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 6574532B08A722FD2236DE48 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = DDAC91464B046D53976998BC + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = C7D6A4D8EF2E1C5EB34CFF7E + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 0DF63EF6CA003BB12BEE5C5E + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = C1EC7DBD36A2965EBAA7BA30 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = 047C0593296D3B2876BE134F + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = F77096F05FDC178C6FF85637 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 171856537451BBD723A25098 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 70D42136939CB686517B5C11 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4233587EED794C551EA + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 82386521FDDEF8F5A84C3FE0 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC0449397E0823A307D9 + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1F554D52E8D58E9150 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FA920817A94D38DC9D + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2406EE2BEEA172E5B + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F499E50CDF42B4C092 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B992D2C452B5CC5D0BD + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03CCA0FFD6A370D7DBE + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2A636E0971476CA2B8 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C86C178A2A7B0FCFD6 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CE2BFA4AE50D115AFE + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D960AF7A69EFCE96D7 + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A4759C8F6A43E4E228BE8 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB964546484E5A82E691 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E595242483082B2B2D320589 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A54E383E0CB88B713DD + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926CC6693E197989071 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 02858D83AC4A4101AF5AF312B3 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = CAE4E8F43A816522AB3EBE6A5B + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = F7C8C950E8FE2521A6346E807B + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = FEB02FC901B6FBDE1E858737BF + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = 362BC3441F13BC42461BF866D5 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = 50B38C216879D1A4C4027F4129 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 6574532B5E99EB20D38C2CA48B + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = DDAC91462A8E33640C769986ED + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = C7D6A4D824E0C050BD7C2346CB + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 0DF63EF6A100A433C2CEA2EDFC + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = C1EC7DBDC1A73513E2519C8B93 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = 047C0593AE5BACFF4CD66EB1DF + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = F77096F0C58C3B89C7271A7030 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 1718565377F4C85F9C92EC25A9 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 70D42136490B6A32D4CE9342F3 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236710C8BFF36AD172B6 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 82386521951DB3001F5A10FDF2 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D92831316A1BADF724 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC64EBB4306099D377B + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB68698448644CB9EC + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C6D3DB3D964B84AD94 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41D93E165E85A7E0E8D + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3E3DB239133ABBCC0 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C785A3385AF22354E84 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC4FE7D227FA6E33EFE + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CFA577C03D44BE4AC + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED0126885C6BE7E2C33 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BED63F6573E575F33B + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A4759897E802AF86FADF01C + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB9625DF8D64C5C167CFCA + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424520325FCF2DE843AA6 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B3D148E0DCD09BC5F + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A56A3162A00E74D4F0 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 02858D83ACAB1A3CF61972F4D4E6 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = CAE4E8F43A2484E0B7F8EDA2E5DD + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = F7C8C950E82B6E6BA6C7732F93CA + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = FEB02FC90197DFF542744DF99B6B + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = 362BC3441F0A1CC130F77E47C090 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 50B38C2168367C708E8B03B69232 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 6574532B5E058EF1A4AF1ECD4E2B + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = DDAC91462A870A71FD074036B44E + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = C7D6A4D8244A5AFFCA3B7BB1180F + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 0DF63EF6A1754B39F4D872EBE389 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5290A318370E49E92 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = 047C0593AEB876B5263BDD21194D + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = F77096F0C5C95F38B23C7C8A7B89 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 1718565377631E4A02973E3177A5 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FE02C0BDD4D9571EBE + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = A479D423673030ED0334A98E2778 + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A4AD4A3C82F96581 + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95622001954DE5F8B58 + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F15879A690B765420 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9B12AD4BB84178F3FC + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA423E0FB765851B9 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB27C5BEE97CB5A28B7 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B503C407602DF2FF7A + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C786637D729066C11D2A9 + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC4692A44BFF8761F759C + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF3244562985B7E0087 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED010D64B2C44906FBDB9 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDA0F83493CC49BB025 + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A04DDCE946839173EC + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526391B16061625A331 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E59524245291350EBA9A74C80B19 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44F739C0F4004ED76A + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EADE706553CF2BE8CA + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = 02858D83ACAB98C5A819A257E7FFA8 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = CAE4E8F43A24B23FAACD042C0AF306 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = F7C8C950E82BFF38099B441FAD89B9 + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = FEB02FC90197B5A724B3471B9645BC + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 362BC3441F0AB00DE70B3CEA2A9557 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = 50B38C216836EEBBD95940F667A701 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 6574532B5E059DF7B62E291F2A1059 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = DDAC91462A87A4950E7C2E31CDFEA4 + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = C7D6A4D8244A549BD3B38443C875BB + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 0DF63EF6A175EC62631AE111788615 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A916EBED876AEFD429 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = 047C0593AEB8439BB74BC5C70B0BF5 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A8D5785690B44608 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 171856537763FEEE73557ADA143B00 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE74E26FBF59DE9B4F9 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C98A23A91A050C2EC1 + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5948955120E913DA6 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D956840CD8F6461CE0FCF5 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F09F13DDEC263919E7A + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF682111CF7725BAFBC + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5473DA4F17438B779 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F3EF92BCEA3AD330F + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51DD62BB5D6108195C9 + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAB1E5FB73E26233F + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC4692725377E9F8CE3935A + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35DD24309888909E4C7 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED0107024FDD57726FFFFF3 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC078D3C7E09E4837E + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BBE30D213A615422D5 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB96252626060E193862E0FE55 + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100FDE86A67CFB1CE3D + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B4454D19103610975E77C + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A8F56E2120C959595 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 02858D83ACAB9898A20D942E508C2D28 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = CAE4E8F43A24B29456794D144E6588AC + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = F7C8C950E82BFF8FC64E0E559B9AF0D6 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = FEB02FC90197B541D6B839E07B61FCBB + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = 362BC3441F0AB01FD8B81A3ED2FFF3B3 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 50B38C216836EE00E1CD54FF0418317F + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 6574532B5E059D8D121570EA122F20DF + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = DDAC91462A87A4B5DA538BE601D940D2 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = C7D6A4D8244A54636022D9E7AB0A0673 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 0DF63EF6A175EC92FE95077EBF53F2EC + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D34D6B4518F76EA080 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = 047C0593AEB843CD6CF329912D7786E9 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A24AE70C67BAF6860C + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 171856537763FEEDABE7ABAE72691FF8 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E052CEB76B954C594C + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C972B100D22253F0B5C3 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EACCBF68686A86E5BB + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C309CE703B9A6347F9 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092CBF37FFDFA9137521 + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF612BD3F9BFF1F54FEF8 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DE9138DCFA3F1A0FBC + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C18113A6597B404AC + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E2FB4AB9CF82D5350 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAF6B20BDCA71B2F10C + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D4CECBAE25A2A1350 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EA0203858663D2B2D + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED010706694E26C81E71CCA25 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC86DBDC782259C9360D + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9148668740C6E58003 + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269D8FA92580E11DC99D + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E595242452910019549E81C20BDD5512 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C6F366DFA9E658710 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A623A64B21C6E9EA225 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = 02858D83ACAB989804A562EECCDAEE545E + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = CAE4E8F43A24B294730EF61981E76B2986 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = F7C8C950E82BFF8F562A8D98785E7B8AF5 + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = FEB02FC90197B541D7B1A8234CF452C111 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = 362BC3441F0AB01F6FF50017A6CE9111B7 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 50B38C216836EE0011487E05F646DAB6CA + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 6574532B5E059D8DB2B1460BE4491A93A3 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = DDAC91462A87A4B58CDDB9B9B4FC25066E + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB6DAC15E471AC77A5 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 0DF63EF6A175EC9256B88347383C0BC433 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D336A28D479BEF12A6EB + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD808946B96718193FB + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2974C191BD0052B7743 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2DB87F24A71AD3E301 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01ECBB038031844862D + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263DA9DB49DAAE2DDDC + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA37F7106224EC48AED0 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351A0F4E7537B2F1BD7 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C825BA4ED7E8E39C61F + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280AC11868FDD7E2954 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBEB374D6CCA88FD417 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A0DE477738E371B84 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C7712A33602725D89 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE1E410114404811E1 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D2D8A2D90902F5518 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB7CD520668F7899925 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B2F28B2584AF6818A + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865D58035BB630B85D29 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB919470E1D0610B340AA6 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE5B1DBF7BD84BE0CF + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194F4968AFAFC49DB390 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E4FFE41DB63977D23 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD56AD6E9DDB99809C + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 02858D83ACAB98980422F06CC4BE723B830F + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = CAE4E8F43A24B294735FC421F2764636CA73 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = F7C8C950E82BFF8F56DEC35E656E41FD8623 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = FEB02FC90197B541D7309EE72E3587559056 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 362BC3441F0AB01F6FDF8C3455290466385F + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 50B38C216836EE0011124D3B1A146B527152 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 6574532B5E059D8DB294A39F51B5DFE5BB09 + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = DDAC91462A87A4B58C19B2E15DDC60399C2B + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F5BDABC4179DEC372 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 0DF63EF6A175EC92560948C039C9B63522D4 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624D128CD78D36EA4D9 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD899D144121619C26A69 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976AA63EB44336550E18 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3BCEAE3A0D2E12CB6E + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E4107E7A83A19E6FA9E + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5F2B861BA8DB1D682 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA37131C21FD43B8F61378 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C3519465F127CAD5B1AE3A + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F7DD029453D84BE3A8 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED5DCB08FC73730658 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED8A2C456A0BA27F2E2 + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B3029A0456DF0DC08 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46306DD22513D77B89 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AC2D5AB11C2508FCD + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8ED961F74E64CF74C6 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BE2F224E38BB4ADD7 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98D83A634BC89E0AF2 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF367996A6D0BE572BB + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB91948468C954197F9491E6 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93687BBEEA523F0850 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFF1E5B69FDC0CC382 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E901302D94536002D21 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD5002D3A342E0DFA62F + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 02858D83ACAB98980422AAED70B3CA1ED9159E + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = CAE4E8F43A24B294735FBE454A693E7603544A + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = F7C8C950E82BFF8F56DE85378CFA2530905288 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = FEB02FC90197B541D730A6B483C4F91D6883D3 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3BEA5FE135C4AC0C5 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 50B38C216836EE0011120CA85DB482A91DC60A + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 6574532B5E059D8DB2949AF5C1A03D268914F3 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906C352CF4D55DB3AB2 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F7B63BF32C4E2331D + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FCEFD7B8CD906D9305 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDABE932D023D3D0F0 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997CDD627CDA91C00DE6 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A999E5C8EDB8580E417 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7253A0ACEA86DAB51A + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A11C1D32C02C568EAB + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CAB17596F7E8FE0FF9 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FA3DC73D7FA60F402B + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942CADFD2059E405D46E + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F702E9525D579DB03E4A + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2D475545321F08504E + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80FD110DF75E14469E3 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7B32161DEEFB1B1DF7 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A4B7DC2C89D970BAD1 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF6AD71B82E0B7EF99C + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EADBB5B6AECEEE61235 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD920F5B9BEB73ECB5C + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1C3E74AFC7319F00B + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBB2736E1A80351CCE + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846DDBBD28762FC811F1 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE9307666A157866F048C9 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFABBFFAD7683B4D7455 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FA377DA76A58332618 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DA9F89A3A7D918F280 + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 02858D83ACAB98980422AA699F5D4D1A79F13ACF + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = CAE4E8F43A24B294735FBE279D484461F947285F + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BCBBDA55E9A9279040 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = FEB02FC90197B541D730A66AA911A147D6F4AC7A + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3998FFA3F45D2A9BF3F + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 50B38C216836EE0011120CAE6CEB1AD3718B6330 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A5EC9D1157747607 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B73E3E9CF101E126FE + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F20D4F3025F84EDB9FA + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC749DFCB466E2F306B0 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE108D2672AF3DB020E + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C323DE5BD8D8F280771 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CA9F16B00805232EE + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200E1E0E753B941F70D + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A1298CB0A19660AA9238 + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACA1A42CA60F8E8A8A3 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA2DBFB0B5D02F4B060 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BFDA0B17F65169890 + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259DAAEDB4CEEB256D9 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF837E1D2EFE93E219D + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2E149E85ADA19F5883 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF33176903CDE661CAA + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A4154FEE0F6B61DC7F02 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65AB48081412E0DE82C + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD389FBFAD806770FEBA + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD9295FC00EAFEF97B715 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1AC71754E2D6E02467C + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4B78A556482B950B8 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3B148F1FC6A52191FB + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BF22DBC0F85F40607 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F4B8C50F25B410F50 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAAB23B3742A90769278 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6421AA7ABBAA0AAA7 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = 02858D83ACAB98980422AA6932386E39F34A495D7A + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = CAE4E8F43A24B294735FBE270D40FFAB2B064B570B + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC910853CC06E180832B + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = FEB02FC90197B541D730A66A0846711859155D224B + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BD91CC2BB4DC7B367 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58FDF5A161233580C1 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A6B087D53B08682BE5 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E273670B46823CFF60 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F20541E3932EAF0E3B704 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A866FA335B4DA500CD + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F919C507C204E80C98 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE4979A9872959CEAE + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF1BB9C8C577CC11318 + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A1F88AD1A9478D9BB4 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FCC0B2E77CCEECF769 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADABE26ACEFDE0BE078 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BF3869AAD885BF622 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA739235DB2C5581315 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F702598094E56B3CF32ED2DB + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A7C8A15A541F2B0A28 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE6D545B929BD3917F + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32D11AC9EBAE7F6A045 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D30234CA1871BE6D8A + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A055F746F2561A56AE3 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B41941CCE3C810C4FC + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366BBD6B695B77659B + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE1388824B5E288B5F8 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4995F5E588D499AFE73 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD5E560DCE91476D004 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2ABA047D1B0FD33D + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86D4F404C9D7616C96 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5A52301385319C2A2 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C805C9749B9AD2FEFA + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 02858D83ACAB98980422AA6932D228AD3666B9F08A3B + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = CAE4E8F43A24B294735FBE270D327B56FEC7F7F2830E + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC910147AD67EA065F704A + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = FEB02FC90197B541D730A66A08DB1C64D01253D89FC8 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC160AC5FE684E92859 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CF62A044135354766B + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A6502446CB3A0DF18A35 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216B1D873AA801E38F4 + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAA9855421D15D1D77 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A85124445D8E2B1E29D8 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9ADFAE0B53240C7BEC4 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE45FCB96EEC583F54BE + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF1503C948B34CB3A769D + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A1446A501E2E88490757 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944D0EAF68E2583350 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC113A2A4DA33173EC3 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEEB9228A563A03675E + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736CF3E3AE34119DCEB + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A1CDAE92790EC2971 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A74330F2A793FF15863F + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4BBE5D50B007638F30 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE223E90C32F11067F8 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333AB76D4D9FB7B422F + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FF969AF448693FB5AE + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B4247810718D83F8D73D + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD9293663A5CA8BD679CB1D67 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17AE6A828DEF69698ED + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C217392BB51057C98 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD592B1A47D4864D3B445 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A52E989C85695C399 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86726DFA893B7523C5EA + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B32FE3A8B1CF60B7F3 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF52C53FB1868EC00 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 02858D83ACAB98980422AA6932D22CF6F55C96AE79AF9A + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6A678D5A263F8E89B + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E62045BCBFC0042573 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2A5529285CA5A4806 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC1760928BB08D74279E3 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB34519B12975E78E8 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650098B98878D259E5EFF + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E21615BF4848F3FE52031A + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE7C1718850EBCC84E0 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A8513859BEB9C2D86094D6 + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD27647B2D67E5C96FA1 + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458AF832FA08270FC7AE + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E07BFCAA8B824AD929 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C36C2C0125D46524DD + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A57D5F2B42468CE8E + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC19453146F9C608F6CA7 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE970F682449C741CE78 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEAEBB28459173AF75 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A32745BE9345E3994D6 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A74334268703029E62192A + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EF3A0CF17116CA2AC + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE22254449F13556C9DBB + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB467EB7ECE188FF0A + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBE2336FECDB02F41F + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B424752FBF765F685FF24F + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379F020727A508BBD15 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A454AD4F9C168D0DE56 + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6920B25111B3E8EF22 + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275E122822854F6E736 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A0962223FE42DAF912D + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A8191EC8382F877EA + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B357E0CD6276C1595681 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FE1CA5CD7B743D16 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 02858D83ACAB98980422AA6932D22C112D8AC339CCF8284D + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C678E86C2CFD2E8F08E3 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B14B30D403B506883D + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA284C5C2E43495BFE288 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644CAD8A0EEE2FA2DF8 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1B25128CF60D51DEAF + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AE2E12053338B50CF + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C1B1EEC631DBCEC4A + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE76986E3DD60BE9E364A + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384D065DCF608E63FF08 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276DEE629125ADFB43EA + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4A16B98FB3F753025E + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E01229559A4D065058D9 + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C36642B219CF130EEEC0 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A60820F118EC2E2A381 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C5F479DFC6F6CE5CF + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770A8422C8B40E06D4D + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFDBBCE9B8E74D8B290 + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326AE59179B34F1BA60C + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340AEF9ED47AAF13CF7E + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE95FDE16696439821F + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227BED4E5FC3790E463D + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E7710B0925F543BB4 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5A5234E434BAE1AFE + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0AE044E7DD733D3E6 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EA8316589C61A48329 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456CC23C7338723804F3 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C69159F40293F4433907B + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275752EDD904489A5F2AF + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A095209AE86F44F68DB80 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71AAC517C086A0B042 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B357299FEEBC8B9C31690A + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FE311A082F63333E5E + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F890E332754F69A4CE + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781BBBE95BEAE2926C49 + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E597B4759467B05077 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D55728E878D53D9E3 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA05F84038944E34C4 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD5E679A3975D2925B5 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA5F63B01FE6FBA2FD + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D9326AEBF85A88E8F + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E09ECD7CBC4444339B + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DEDDB55A4C5152257FF + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D8062F053C754BE711A + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACBE7CC016A0398D3A2 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CBD12063165541130 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B6EC6978722F2833D5 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A742D2F855066E3D1 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4D84ABD63B5A983D60 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B09D704F62E69F8213 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5A1AA549DF53BDCD38 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77ED31D31B501B58E1 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E2C51F8B55F29A642 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF17DEB3EB56B5C589 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B56C38B9FA1903A135B + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E734743CC611CE5D9DB + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BE1C7E1A3D1FC06E33 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F2EF02C10E353BADA6 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA8831796A650570D98 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C534AC29F5EF3EEBD8F + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D7A9101852DA036DA9 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EB1639B43E7E85FA7 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EB8C7575964E5445E + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FEC9991FA543BB5CA7 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B35729035417242E3C888579 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA8870D7556FA2E1E4C + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83EA333A93AA5A6B5EA + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40008B4417C63B86F0 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C93A444B43790F5E48 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7C2FA59E0C886B9923 + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07D9679A8CF92F429E + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507A861CA7032D9DD48 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C25F9CEBB4D0E802F + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D814F50A2D6895EF24A + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0464E3DC33781F46E9B + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED31122ADD74FE554759 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A121F5137A536A5EC0 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB9781A4B43357316969 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB1AB4690D17276E9AF + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B68232DE8190CB5D3A65 + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8F977F495F6227D090 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC71C6C56E0CE6735E6 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAC73717D1632AC5AA + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA140F4EB371DC6239 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A7790285AB79072264FE6 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4B745200B456C5C0CC + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7EDFC756A58276CF56 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9E2ABD0A66A394BC + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732DEC0243B324DA6355 + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA86E0DB4F4683CB66C + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F2699770DC8699E2A316 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823A8A5564CF2FE453B + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C537267D3EFEA3F8EDA02 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D7629CEE7690B74C11B3 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE60A44E84D2157A9F9 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF9790EBC420EAAAD8 + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE458F3E86960F0748B9 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D683DAC92982D2EF13 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA869BC3ECB139D4E9A8C + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BDF016D5F45D8054D + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AFF9123A36A94258B1 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90EA139BB42B108AC17 + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC5D5C7486A0349482E + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA0799D09FAFC0C86CDA07 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF2254015598D70EB2 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EF0FB8781C0652C5E + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D8142DAEC692D48FECB52 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466BBF3B2D114B2FE352 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CDEC1D33BF6FB0262 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A136053381354F46FBEA + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FA84BEEA2BBF7FF053 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB13851F629752FAB1704 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B78210FB2F14AC43CF + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF029A5E6746DC514BB + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC762DA341BA794187BF1 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEB614BE70D12AA6400 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D6439EF77EF1D8FBB + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D4E95AB595D49B525 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB26A75D6C243DF2D6D + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C0B520708F10FB9DF + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9DD8D144F40BDA970F + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D7413FEEEBA8440492F + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B0858871378EB721F + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F2694739C6BD0A07BEC275 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CD42706811E8A36A19 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EB14CF1C22BF3C78B8 + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA4E359E217DCF4158 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D759B74A97F03A003 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1AEF884AEB4C3B1AD8 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE4550678A59E60D55302D + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D37AB271E9672B458 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964060DE69ABF1D7973 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF16696919FC888F2A9 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF763445E87F0BA56D44 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED5996F5814B5AD8189 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51236436CD03ABF4EAC + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D989B994624A19475 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF62710B148215449DCE + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA22F750C7B687841FB + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E65D0A61E1B13984C + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2BCF9CD9F8C9B08ED2 + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA10450CD9DDD99BFA4 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627506DB3C891A9DA84 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC4898878BDCB189CF7 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AED428C6758ADC8D19 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708FF22F069AA30FEF7 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D34D05D28AA4F1CA8 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209DB0F59C7DEDEA69C + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA2B1C80EAE4FC77D1C + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D17BBD4FE033CA04157 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41A376918D26C38071 + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB2063D37FE43D5F986CD + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11EB41BCE79F64A7F7 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7EDFB135D6C25965AE + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BE0278E3FE945E5D69 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12B2F17C15A9EE814A + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B446F7C768D0AD78AA + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD6E20DA80D14E4CE88 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE05913DDF7EE4A7DF3 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D822949DE69060173 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A1ECBB3700DA8BE18 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8CD639B48F3C1EC64C + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016839654F72DB2E329 + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D3711146B0AC30F20 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B81F005DC82F33B0D4 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF1630A27C01CB1B9D505 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF760416D5D9D37101436E + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595C01B6CED49331594 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215DC7C967D5E2FEBF8 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D973289330B25A4B95B + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E121DC8FC4B393DF5 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210C76A04162092767D + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6262191E3185DAFB6C + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10D38D842FC353E2E1 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AFF5F775CF16CB5DE5 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A0484842ACFB1049FD + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40CC12D270715BB0540 + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE785F1DC7CBCADC2E4 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708679BCFC52D90F1E1D4 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71BBAC9B19B0F00DE9 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209769AF42BE94F2C81DE + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA2025441EDACB4D73A97 + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175C1CCF9BB00D90FB73 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AA10144C00C041F9C1 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9EC1BA6BCA216E67C + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BF6B61E39A95654FB3 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45B7812E3580C863A3 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA64FC0EDE60D7AEBF + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CF2314CA1D3A8E5B2C + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B4171774B03AECBD3D8F + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD67924B17EEC72039F64 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7AB9C5C8E96AAC1AA + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6139F620F6760FC860 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A45A0EC21734680E433 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C50465F03E96761FDC5 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8CC5EB4C0E5DB72B4 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9D59618EE31CC9DBF2 + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86A1A49E57D6B381923 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D4739BF65FAAD0F443 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C3F5F84931F89416F + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED59530ED50CFD854FADD02 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC448D3B6E27A1D1E7 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE26D4A5FCDC991337 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E734335718C87E05F87 + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A7AB9D40A04761E20B + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E62403C0FFF9B6943715A + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E716AE8DFC786C385B + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF2929F3BF1D0AFD0CD1 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C36146C651407694C + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C849DBAC112B1E3C058 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BAB8ECF655C0B96998 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670BE0D347501D3E14DA + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91B667F87E8024B9E + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F888A733EFC8FBB23 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA20208D9EEFFECD85F9B7A + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB3691D52D87E58BC8 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1922EC84A7EB15386 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9656D6BB1DE3B20B078 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFFEA16092F5B97B45 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D626987C42A8E1AB79 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216DB8B7AC34CCF558 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCAD68B8F42F74AB1CE + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A3E7FFC90F4ECFAF24 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F1404449A235B8523A + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B21AA1C68C663A0D7C + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D610349610531A1C8C8BE + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BB601E1CCF3852CBF + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C5091472DB99E88F5AB1F + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EF8488501493A6C0FC + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFD491C1CEAA2F0E53 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF78CB7FC19C03BCB42 + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44FB141A0D651179CC3 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1CF15CA9B1CA6BDD2D + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED5953023A08E8457ABCD272C + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53EBA82A03396B9AAB + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51E53C9C785373DD87 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732812E85D6D86EBDDDA + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B5C5CA8F9E390062C + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E89F09E1FEFF95C57E + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E0AD8567C124D9272 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D563743DC4FA40A29E + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95A9C2F45C783105DE + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C8427DD276A82B8BFB211 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA6147BD40417D63536B + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B54D98B839F5BD4185A + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C6F42FE6DDD0DE59A + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F06E6AC0A398CC83500 + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CCB133442A5A0CDCD + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB5248EF10E2AD34C7C9 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6888FB73CBAA3313 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EC48935BB98BB80B0 + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1E2F5A2DEC4F95AC6 + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D686A853F52E6943DF4F + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216FB1007E0B85936D7E + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05C1085C403A6A692B + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37B6EB0C1537AC7236B + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9F02242222BE007A + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B3C9BA99776F2A5071 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C401AF39B3EDFF87AA + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFAE9EC462F1EAA9CB1 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189C5FC615BD58AC0D8 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA266A7CA2BDC8A97BF + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFACE1EAC36E99F5CF0 + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CAAA8CE307DF70BFBD + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F60644AD3DD031FD772 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C739ABE982F22C5C800 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391674EC7D8F1013222 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53293F86D7AF05F529B2 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D404843E28708D7524 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892E7036EDCCC9CB800 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0EA90598EC01515604 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E29723D1E79C7B8004 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E439529293130AEB339 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FB14580F72D5CB40FF + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3E5650F3A4D30BECF + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C8427849CCF8B318FF16F69 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AEB5927E9621728B5B + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428CB649FC720FE6D1B + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F2288132D247B5F6B + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F06874C170F0E4B6701D3 + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8AF61BF9005F61B27 + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E98C1F69FB5230DBF + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CB99FAB726A9C5397 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE5281697BE8C350FDF + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B840F8F852A097488D + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863A29151192A5B82DB7 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B127F2AFC83E712B1 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA054422BD1AC7F70FC7AF + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB39B43ED07C48527EA + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B933E61B09440BAE121 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30F13E153CB183B30EB + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A5A9D1AED2E0D57D72 + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA70AAD07236810D36F7 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C50918907E7FCAE09D40B2420 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E62A60885730CE2A17 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC899D55CA1E5AB111A + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D4222304F3EC12D54 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F60823B72877C20533992 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C732891BF6388179682E6 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DA5A7444DFFE3AD341 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292F72011CE99C8B046A + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43A03EBB3A6676A94B1 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E73289219E7C19DD253EDE86E + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E358F65C463E996650C + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A465B814A8E8E9FA4B + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA8F7C26A6AF223AC9 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA5F510DCCDF06DFDB + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA2D4E10F5F04FA163 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F3F916D1FA2126D86A + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE502EE14DF16A761251 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE220F0606C17C0D80 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4DAB17B3AFAD28A4D7 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687629A5CAA190F70CAF7 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8215D5B7387B465CF99 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E117348C8F02AB7C75F + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CAB1BD840A8AF90FD2B + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584F61CE5FF97C75DF4 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8367EB5F85D03924B + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEB47218B3FD218BA61 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B9375C5235BB2B86534 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA054474EABC06787B93DD69 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3415E99960C71A82874 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341EF1E42FE402351BB + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBACFCF74B62320185B + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580F970142152452336 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA70051404C7299ED9A851 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B0CD2802C77B2ED + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F56A27AB7C2CA105 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86C6955F0961F1A8108 + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C5F6736510FFDF045 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA55627B9C3C703858 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D82B948AA5F63849BD + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDB5CD158A91F3585F + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB77154B723A0E017D5 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE6DE44099A305E711 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C095293322C531FE9 + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357B68DE4192EEC53870 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0973FA4628847375D + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30B85CE987A0152549 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA253B01B317859DCB89 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA981DBCD9809F4A26D7 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F3203E2DC4B5691588FE + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E335B22AB65E0C91E6 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE706559C5014932B5DA + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07877A766501C4DB0F + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627AC831B56ED0D4F731 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB8219526971782B3AC28D2 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB01BE60B4D58EEEFE + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC16260407EF6333CB9 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD2AC443F31CCAAFE6 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4F7E65663C6EF61C3 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEADB322B4D7450A36F + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937E588BCA2446F03348 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744499F57FE1EEEF9EB1 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A378462EF38F153EA + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B934138061859F17AD4FD6A + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0DD6833AA805D88913 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4343B5DA694A9038C + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2D476CBCE420C709E + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B789AC992BC13D1D3 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F37754B7BC00CE6D39 + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDE1412D8BA701D329D + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1C9CFE664F6DD41B0A + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA20DD5F35044898FC51 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8670F3C05B11131BBF0 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE363935A9B1B53CC31 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A1FBC83AF963DA674E + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE307D148CC98F7DDE3E + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89053E19D77CD00586 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA48CCC2B6EC938B1A + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C1031FACDBA4E475B7 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA3091CD1670A6EA14512E + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C03EA9B77E07F5FA90 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E2622F397AA4CFB2A4 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D23D284D0235CB96F8 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F730BC111C6CB77729 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DEDDE6D8AB35241FB + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A1DEF9DBFF14E832 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0CA9CA38FF6DD7B2A4 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE1F3F647682ED5F11 + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65E122A639E1AC9FA6 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FC1D5E59109F278C + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E082CB397A6D33670 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4279E59A88122152AA3 + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8E2AB5B01FD4E1EBDC + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB84AD0F5E9B166CB68 + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05447444306AEC363123B8DC85 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73C4C9DA5E4F8F6F3C + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380F58053138BC2C2E66 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3A135AED7D53D45099 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6E466375556AE0DB9 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC33481E35C9ADC42D + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B745D52FC6C14720CD2 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3ADD0CC32210A5BB642 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFCB0C984F443B97E06 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA44A619555862F328 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AEB5C53236708B6D3 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8672484AAF62EFE09B684 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE393C19F2B686D7F4D0E + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A1917A0C567E363E1382 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE3004D5F097E81BA04D05 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C58D1D2F39F1D9BA42 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DAC45A2BF3E8D6604 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15EDB30ABA54A2746AB + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916C4AA02573D2A39BF1 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3D8A5AD7C7FB5F10F + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23B8FE19B9F6340007A + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2603616BCC6E265626A + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F74237005ED0B7F7872F + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6C9955E10A6FBF247 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A72D3CA70ABC954F47 + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C2821CCBA0F36E95D97 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE094A46531B8997660C + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F107B004B3888FE41D + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FA069E1F3076963C17 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C3B2FCC3B1B391AE7 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F42754675933FFD1329F4E + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC64A53E7289AFB529F + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AAF5B2CD9969BAFA + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA05447444309621B19B6F6861A501 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A32C2F0063B4355AD6 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAEBA81B34ED7D08252 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFE3014B118BDC06CD + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CAE42C6A99C4325EEF + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC79A777C953FDD84B4E + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4DA7D5B7FCB1B969 + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD441182705146A5AA12 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC4780E0DA5E4335BBCB + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DCBDF3BDF61481A62 + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE00B3B2F91EA4DB606 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D8672458A6067C023E025ADE + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B5CF7CB257BDDB019 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F142E633BEC8F80E34 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477F1105EAB67945E74 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C5042EF534E948818BBC + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9459C2EF428E75891 + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6DCC35F615B94B550F + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF06CAE455EB0ECEE93 + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3313D88A1EFC42C9F6F + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCA05B7AA4FB10AE4C + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D5A39E4D2FB1E924A + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DBF6C1D1B816A99E32 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BBD4844A9C24239D09 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E88404E9A692AEFDA + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D5B16523CF825CBAA + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDD459695B9C94DE6C + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3B409DF5341DA454A + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE728AC1BED634B3F0 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C79D19F3F6FB456AC42 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437AE548260B082CA61 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628DAC478BCB1E418D1 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AED3F26106820D9E12 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960DC8729A4433D0E57A + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDA307BD4FA7C82087 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE2906F385EBB3E7CF5E + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB8C3721E46A0204FE8 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0F9CC8572DEC7475D8 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC791872D34E0DDBBD0DC8 + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4C670BD7E9DD1F3B5E + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD4464434FFA69A426B9B2 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E537FB42C0A5686763 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BBAF8ABE06F3A294 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7B6BB298E28BEFC4D + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A00E74092ED3B285E + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D18EDBFDACA902D63 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CD4958CA09675E496 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FD3B0B45C40DAD6AB7 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482AD4AF5A7BCEC8CB3 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EBDD2A186F8DC3CC80 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FBA610E05EE26C3C7 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F2FCD24D132E96205 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318E5C669C55D15DD263 + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE66D1C1E831BCA986 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E869E2A30237539B1 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB3482BD249711FBF86F + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7B59B9BB20BF1512E7 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E432B92E54E6B735531 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D22553DCAD66EB633F3 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB75E3969A1A15DADB6 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB6FB27C8B8B7FF110 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE605BBD3D47915B72CF + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C791220B677DC3169FF1C + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EA36E261EE79CD9C84 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B46A009C3277E530A2 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2DB550082F2E36DC2A + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3CCC39C56A2092EA84 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDF9F84EFA83ED634DC + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B19D70CEF2D4666DC7 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB8223E484477667A46C0 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF1AA4B5B172E81D5C6 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EE86EB9918815B0B74 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE289D0C43E2F22A9B3 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD4464078E52D7666D01B09D + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DB078513AA5A5D3DA + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BCA35C47CD4559C2E0 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7D83A5BF128BEDAED29 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A3848B561F00C27E5B5 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D5F899AB21FFDB6866A + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CA2E03E2E491BCA6EF3 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FDBCF47D6F08EB02E554 + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482F576334FA82C1C13A9 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EB9C91BB9CCE5A0AFA23 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FD27BFEF5C5C60F94F7 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F4A49DB28BCD3FF1AEA + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318EB2A00A3FB99AB17030 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE313298AE5DDA6A7F72 + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E2E58EDBE4337F8FEAB + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB3405B78D31C1928E5D0E + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7BB9DA1AB64A7FDE13B8 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E43CA3DEF0D392158829C + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D2292017E3D30C86B6E97 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB705D58369CDEABE12E6 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB3F8C09FF766E7AF163 + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE60FB031CE4762F7298F5 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C7912A94B3FA4D1CBE9AB2C + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EAC98F92750AAE816458 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B4B94382114A76FD3B0A + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2D958DF7DED5E761A3E9 + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3C2B19E4300F3EA6F244 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDFAD4D06093C28C7F798 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B15C4377085A41B5029C + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB822FDD15514073E65CDEB + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF159284DA5614D057D60 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EEB53D026EDE890584A9 + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE2E64C1992F2DF105708 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD446407E29713A4E2002F4C09 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DC0B72923C27BD3545F + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BC22DA312BD13413AAE9 + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 02858D83ACAB98980422AA6932D22C11F83E1BF163D44F6082FA200AE0E7D8D4F796B1B8D9707EBD + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = CAE4E8F43A24B294735FBE270D32C6781B40AF76049C1C7328D86724585A38B085E6DE3BB3F9EA36 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = F7C8C950E82BFF8F56DE85BC9101E6B1E5C90ED595302391DAFDE3937B2D5FE57B299E25E46D0308 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = FEB02FC90197B541D730A66A08DBA2847D7CC51215BC53292FB7A191F19CA20CBBF0C63B7484FF46 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 362BC3441F0AB01F6FDFD3990BC17644BA07991D97DE51D43AEE300477FDBCB26E76FF3765033B5E + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 50B38C216836EE0011120CAE58CFEB1BD507EF621E732892193C89C50482F5701C83FA7CB6567725 + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 6574532B5E059D8DB2949A45A650091AEA4C8EA210A79B0E357BBA2DF9EB9CE8BF80ADDAC0A14317 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = DDAC91462A87A4B58C1906B7E216150C3D81429E6240E8E2A4A0C15E6D9FD2CC69437A3BB1984763 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = C7D6A4D8244A5463FB1F6F2054BAE769E0466B2B10E78E43AA30916CF05F4A95BB7D80D47B41F44C + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 0DF63EF6A175EC925609FC74A851384DED315CA1AF29D5FBFA25C0F3318EB2D39C2CC1E6E48229B8 + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = C1EC7DBDC1A5A9D33624EDE1F9AD276D80A13627A05C95E3CA98E23BFCAE3151F67C5DF19D651F27 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = 047C0593AEB843CDD8997C32EE458A4ACB97FAC40C842784F320D2602D1E2E7E0E941AE3F0F85871 + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = F77096F0C5C929A2976A992CF150E0120CB138AEE7BA61AE50E3F742DB34050B7A33D67BACF82483 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 171856537763FEED2D3B7200A144C366B682B708670B5428FE709DC6BB7BB99779B48C42E8B5BB68 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 70D4213649FEE7E01E41A129FC944A608A8FF02D71D91C3F4D07A5A79E43CA87363B1424D24DAB1E + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = A479D4236730C97263E5CACADAC1945C4DC76209761F0687627A0C282D2292FF51C0319073B99C2D + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 823865219502A5EA3713FAA26BEE9770B0AAEBA202086CB82195AE09DDB705DE99AC1CC66C019633 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 943ECC04D95684C351942C3BA736BEFD5AFA5D175CEB521E11AB65F1A3CB3F3F6E5A712B3E86F311 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = D5A70B1FC63F092C82F70259803A326A77907D41AAB1CE6CABC156FAAE60FBA23AD20BFD9371E888 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 282178FADB9BF61280ED2DF8A743340A0E4BB206B9653EE584BD6E0C7912A9939E6FC6E26A0373D9 + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 66309EE2C60DA5DEBED80F2EFE4B4EE9DF7E9C11BFFFB1B8A8F4275437EAC906690AACFBD3FE65C8 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1F2DB0F41DB21F6C6A7B7BF32DE2227B562E9D7E45D6863AEBEA8EC628B4B9789C5D7FA5A2AB9A35 + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = DBF00B99F3B51D8E3C46A415D333BB2E732D74BEAA216F8B937EB8C1AE2D95BD0E42C2E337A96872 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 9F11C03C78666CAFFE3AF65A05FFFBC5BEA84B12CFCA0544744430960D3C2B05F2B823CC836B714F + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = D1D15D2AC469275D6D8EAD38B42475F0F26947B417A37BB3413A73A3EDDFAD49500419DDE2631DD7 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 8F85F2C85CF35D2EB75BD929366379EAA823CDD679F18B9341380FAE29B15CEE2BCEBECD6EF974C9 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 1C9DC0CED01070662B98B1ACE17A456C5372EBE0B7B2B30FBA0D3ACFB822FD3A22741DB231F2EC58 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = C942C6D9BEDAAC865DF3CBC4993C6915D762CA9D6103C4A580D4F6CA0FF1590D258AFC3B07F71D53 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6B5A475989A0BB9194846D3BD59275751EE61D7A455BFA7005F2AC7918EEB571A7E4C73375355491 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 1A11DB962526269DBE93076BAA2A09521EAF1A8C509189079E1B746A4CE2E60F2F90F7501423A5AD + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = E5952424529100194FAFAB4F86728A71FE455016B8EFA2E6A4F3AD446407E2F8340553180E44ABCE + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 4AB74A549B44548C3E90FAABE5B3572903D65D8D9DAFFAC86CDEFC47E59DC00FEE1FD8BD625BB2DB + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 218B3926A5EA2A62BD50DAB6C8BDF5FEA86964B86AF7CA0D6C1CFA1DA2BC227123AC0914B8BAC0E8 + diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.c b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.h b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/api.h b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/api.h new file mode 100644 index 0000000..32c9622 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/encrypt.c b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/encrypt.c new file mode 100644 index 0000000..832ac67 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "tinyjambu.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_128_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_128_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu-avr.S b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu-avr.S new file mode 100644 index 0000000..c7f2d1c --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu-avr.S @@ -0,0 +1,471 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global tiny_jambu_permutation + .type tiny_jambu_permutation, @function +tiny_jambu_permutation: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r26,r24 + movw r30,r22 +.L__stack_usage = 18 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + lsl r20 + lsl r20 + mov r19,r1 +19: + movw r24,r4 + movw r16,r6 + mov r15,r3 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r22,r24 + eor r23,r25 + eor r28,r16 + eor r29,r17 + mov r14,r7 + mov r15,r8 + mov r24,r9 + mov r25,r10 + mov r0,r6 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r9 + mov r0,r8 + mov r17,r10 + mov r21,r11 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r11 + mov r17,r12 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r10 + movw r16,r12 + mov r15,r9 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r22,r15 + eor r23,r24 + eor r28,r25 + eor r29,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r8 + movw r16,r10 + mov r15,r7 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r2,r24 + eor r3,r25 + eor r4,r16 + eor r5,r17 + mov r14,r11 + mov r15,r12 + mov r24,r13 + mov r25,r22 + mov r0,r10 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r13 + mov r0,r12 + mov r17,r22 + mov r21,r23 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r23 + mov r17,r28 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r22 + movw r16,r28 + mov r15,r13 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r2,r15 + eor r3,r24 + eor r4,r25 + eor r5,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r12 + movw r16,r22 + mov r15,r11 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r6,r24 + eor r7,r25 + eor r8,r16 + eor r9,r17 + mov r14,r23 + mov r15,r28 + mov r24,r29 + mov r25,r2 + mov r0,r22 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r29 + mov r0,r28 + mov r17,r2 + mov r21,r3 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r3 + mov r17,r4 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r2 + movw r16,r4 + mov r15,r29 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r6,r15 + eor r7,r24 + eor r8,r25 + eor r9,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r28 + movw r16,r2 + mov r15,r23 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r10,r24 + eor r11,r25 + eor r12,r16 + eor r13,r17 + mov r14,r3 + mov r15,r4 + mov r24,r5 + mov r25,r6 + mov r0,r2 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r5 + mov r0,r4 + mov r17,r6 + mov r21,r7 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r7 + mov r17,r8 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + movw r24,r6 + movw r16,r8 + mov r15,r5 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r10,r15 + eor r11,r24 + eor r12,r25 + eor r13,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + dec r18 + breq 401f + subi r19,240 + cp r19,r20 + breq 5396f + rjmp 19b +5396: + sub r30,r20 + sbc r31,r1 + mov r19,r1 + rjmp 19b +401: + st -X,r13 + st -X,r12 + st -X,r11 + st -X,r10 + st -X,r9 + st -X,r8 + st -X,r7 + st -X,r6 + st -X,r5 + st -X,r4 + st -X,r3 + st -X,r2 + st -X,r29 + st -X,r28 + st -X,r23 + st -X,r22 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size tiny_jambu_permutation, .-tiny_jambu_permutation + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.c new file mode 100644 index 0000000..7f6fcf2 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-tinyjambu.h" + +#if !defined(__AVR__) + +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds) +{ + uint32_t t1, t2, t3, t4; + unsigned round; + + /* Load the state into local variables */ + uint32_t s0 = state[0]; + uint32_t s1 = state[1]; + uint32_t s2 = state[2]; + uint32_t s3 = state[3]; + + /* Perform all permutation rounds. Each round consists of 128 steps, + * which can be performed 32 at a time plus a rotation. After four + * sets of 32 steps, the rotation order returns to the original position. + * So we can hide the rotations by doing 128 steps each round */ + for (round = 0; round < rounds; ++round) { + /* Get the key words to use during this round */ + const uint32_t *k = &(key[(round * 4) % key_words]); + + /* Perform the 128 steps of this round in groups of 32 */ + #define tiny_jambu_steps_32(s0, s1, s2, s3, offset) \ + do { \ + t1 = (s1 >> 15) | (s2 << 17); \ + t2 = (s2 >> 6) | (s3 << 26); \ + t3 = (s2 >> 21) | (s3 << 11); \ + t4 = (s2 >> 27) | (s3 << 5); \ + s0 ^= t1 ^ (~(t2 & t3)) ^ t4 ^ k[offset]; \ + } while (0) + tiny_jambu_steps_32(s0, s1, s2, s3, 0); + tiny_jambu_steps_32(s1, s2, s3, s0, 1); + tiny_jambu_steps_32(s2, s3, s0, s1, 2); + tiny_jambu_steps_32(s3, s0, s1, s2, 3); + } + + /* Store the local variables back to the state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.h new file mode 100644 index 0000000..f3bc599 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-tinyjambu.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_TINYJAMBU_H +#define LW_INTERNAL_TINYJAMBU_H + +#include "internal-util.h" + +/** + * \file internal-tinyjambu.h + * \brief Internal implementation of the TinyJAMBU permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the TinyJAMBU state in 32-bit words. + */ +#define TINY_JAMBU_STATE_SIZE 4 + +/** + * \brief Converts a number of steps into a number of rounds, where each + * round consists of 128 steps. + * + * \param steps The number of steps to perform; 384, 1024, 1152, or 1280. + * + * \return The number of rounds corresponding to \a steps. + */ +#define TINYJAMBU_ROUNDS(steps) ((steps) / 128) + +/** + * \brief Perform the TinyJAMBU permutation. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform. + * + * The number of key words should be 4 for TinyJAMBU-128, 12 for TinyJAMBU-192, + * and 8 for TinuJAMBU-256. The TinyJAMBU-192 key is duplicated so that the + * \a key_words parameter is a multiple of 4. + */ +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-util.h b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.c new file mode 100644 index 0000000..09fc41d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.c @@ -0,0 +1,487 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "tinyjambu.h" +#include "internal-tinyjambu.h" +#include + +aead_cipher_t const tiny_jambu_128_cipher = { + "TinyJAMBU-128", + TINY_JAMBU_128_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_128_aead_encrypt, + tiny_jambu_128_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_192_cipher = { + "TinyJAMBU-192", + TINY_JAMBU_192_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_192_aead_encrypt, + tiny_jambu_192_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_256_cipher = { + "TinyJAMBU-256", + TINY_JAMBU_256_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_256_aead_encrypt, + tiny_jambu_256_aead_decrypt +}; + +/** + * \brief Set up the TinyJAMBU state with the key and the nonce. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to absorb the key. + * \param nonce Points to the nonce. + * + * \sa tiny_jambu_permutation() + */ +static void tiny_jambu_setup + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, const unsigned char *nonce) +{ + /* Initialize the state with the key */ + memset(state, 0, TINY_JAMBU_STATE_SIZE * sizeof(uint32_t)); + tiny_jambu_permutation(state, key, key_words, rounds); + + /* Absorb the three 32-bit words of the 96-bit nonce */ + state[1] ^= 0x10; /* Domain separator for the nonce */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 4); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 8); +} + +/** + * \brief Processes the associated data for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void tiny_jambu_process_ad + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, const unsigned char *ad, unsigned long long adlen) +{ + /* Process as many full 32-bit words as we can */ + while (adlen >= 4) { + state[1] ^= 0x30; /* Domain separator for associated data */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(ad); + ad += 4; + adlen -= 4; + } + + /* Handle the left-over associated data bytes, if any */ + if (adlen == 1) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= ad[0]; + state[1] ^= 0x01; + } else if (adlen == 2) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad); + state[1] ^= 0x02; + } else if (adlen == 3) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad) | (((uint32_t)(ad[2])) << 16); + state[1] ^= 0x03; + } +} + +/** + * \brief Encrypts the plaintext with TinyJAMBU to produce the ciphertext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the plaintext. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_encrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(m); + state[3] ^= data; + data ^= state[2]; + le_store_word32(c, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over plaintext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = m[0]; + state[3] ^= data; + state[1] ^= 0x01; + c[0] = (uint8_t)(state[2] ^ data); + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m); + state[3] ^= data; + state[1] ^= 0x02; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m) | (((uint32_t)(m[2])) << 16); + state[3] ^= data; + state[1] ^= 0x03; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + c[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Decrypts the ciphertext with TinyJAMBU to produce the plaintext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the ciphertext. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_decrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(c) ^ state[2]; + state[3] ^= data; + le_store_word32(m, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over ciphertext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (c[0] ^ state[2]) & 0xFFU; + state[3] ^= data; + state[1] ^= 0x01; + m[0] = (uint8_t)data; + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (le_load_word16(c) ^ state[2]) & 0xFFFFU; + state[3] ^= data; + state[1] ^= 0x02; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(c) | (((uint32_t)(c[2])) << 16); + data = (data ^ state[2]) & 0xFFFFFFU; + state[3] ^= data; + state[1] ^= 0x03; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + m[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Generates the final authentication tag for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to generate the tag. + * \param tag Buffer to receive the tag. + */ +static void tiny_jambu_generate_tag + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *tag) +{ + state[1] ^= 0x70; /* Domain separator for finalization */ + tiny_jambu_permutation(state, key, key_words, rounds); + le_store_word32(tag, state[2]); + state[1] ^= 0x70; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + le_store_word32(tag + 4, state[2]); +} + +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), c + mlen); + return 0; +} + +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), c + mlen); + return 0; +} + +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), c + mlen); + return 0; +} + +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.h new file mode 100644 index 0000000..cb304ff --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu128/rhys-avr/tinyjambu.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_TINYJAMBU_H +#define LWCRYPTO_TINYJAMBU_H + +#include "aead-common.h" + +/** + * \file tinyjambu.h + * \brief TinyJAMBU authenticated encryption algorithm. + * + * TinyJAMBU is a family of encryption algorithms that are built around a + * lightweight 128-bit permutation. There are three variants of TinyJAMBU + * with different key sizes: + * + * \li TinyJAMBU-128 with a 128-bit key, a 96-bit nonce, and a 64-bit tag. + * This is the primary member of the family. + * \li TinyJAMBU-192 with a 192-bit key, a 96-bit nonce, and a 64-bit tag. + * \li TinyJAMBU-256 with a 256-bit key, a 96-bit nonce, and a 64-bit tag. + * + * TinyJAMBU has one of the smallest RAM and flash memory footprints + * out of all the algorithms in this library. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for TinyJAMBU-128. + */ +#define TINY_JAMBU_128_KEY_SIZE 16 + +/** + * \brief Size of the key for TinyJAMBU-192. + */ +#define TINY_JAMBU_192_KEY_SIZE 24 + +/** + * \brief Size of the key for TinyJAMBU-256. + */ +#define TINY_JAMBU_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all TinyJAMBU variants. + */ +#define TINY_JAMBU_TAG_SIZE 8 + +/** + * \brief Size of the nonce for all TinyJAMBU variants. + */ +#define TINY_JAMBU_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the TinyJAMBU-128 cipher. + */ +extern aead_cipher_t const tiny_jambu_128_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-192 cipher. + */ +extern aead_cipher_t const tiny_jambu_192_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-256 cipher. + */ +extern aead_cipher_t const tiny_jambu_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_128_aead_decrypt() + */ +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_128_aead_encrypt() + */ +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_192_aead_decrypt() + */ +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_192_aead_encrypt() + */ +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_256_aead_decrypt() + */ +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_256_aead_encrypt() + */ +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/LWC_AEAD_KAT_192_96.txt b/tinyjambu/Implementations/crypto_aead/tinyjambu192/LWC_AEAD_KAT_192_96.txt index 78b6102..5283ba6 100644 --- a/tinyjambu/Implementations/crypto_aead/tinyjambu192/LWC_AEAD_KAT_192_96.txt +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/LWC_AEAD_KAT_192_96.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = -CT = 7A0775B5021A22A6 - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 00 -CT = CE89A55740C8B4E3 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 0001 -CT = A92BCC1E6D5F462B - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102 -CT = 5499F49CF42FFABF - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 00010203 -CT = BB87C0583A6DD75A - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304 -CT = 97CED4E8CBCF784A - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405 -CT = 8CF17914F97A50BF - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506 -CT = AE6A72EF4F4FBBCB - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304050607 -CT = 9C7C95147F6A7275 - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708 -CT = CCC5171571CEEB8A - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506070809 -CT = A2E9F500938D3229 - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A -CT = A8DE2240D0DFB1E2 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B -CT = 35948F9B7178A645 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C -CT = FBF2822A7377A8C6 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D -CT = 8734A2D41330D694 - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E -CT = 5E4DFAB11A95B17F - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = C01709B66AAD6B36 - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 5C560476E6D3B28E - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = CF37BD8C1772820A - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = A846863CE378AB9A - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 7BF4622DA9AFFFC7 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 32C6739B79152D20 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 82F2185D19E7FAA7 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = CC9270231A049CDB - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = F7BD34CC58312F1A - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 5B9F402303A85019 - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = A75666B854A9CD83 - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = D09FCAEE4697ABF6 - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 6CBB0A7AA7E7665C - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 55B84A6CB16CE942 - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 16792CE49D7A3C01 - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 6785FFD46C12226E - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = BFD937619203F928 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = -CT = 6017F2D006DCC66569 - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00 -CT = 803A2659C516B939AB - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001 -CT = 46E3074F13C91F99B1 - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102 -CT = 307C974520591CA2E2 - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203 -CT = EC755EBA406220AB79 - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304 -CT = DC08530A4E6ED68CE3 - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405 -CT = 27C9F86B812B55C2D3 - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506 -CT = 34B131ACD6CB08FDF4 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304050607 -CT = E2B9EA9D2FDC83128C - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708 -CT = 50917462CC4FFF7E96 - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506070809 -CT = 5CA86DE2C74093148B - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A -CT = A0D9B65C49AD65C1E5 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B -CT = C3E94CDEC9CB22D075 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C -CT = 6C17A04DBD11B7E265 - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = 936DA78AF939EE4680 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = B621BD09CAABFE4B94 - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = F03778DD16E5EDC218 - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 46A0C5F58478ED3C2C - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1E5C4F1554641A60BE - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5193BE6E6A0D35D33B - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C009499C8FCFB10981 - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2C03F7FD0D1A9F4B28 - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 224C590325FCE724A9 - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 304AB56057C1A74C0A - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5F20B11B90D66EEE1E - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0FF7300006FE6207D0 - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D3B7A3C712446811E - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E45B084840170C140 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E0CE37FA4CC5D0767D - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5277EF20E98A409CFC - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26595ED841A849BB74 - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 90B08E2F255C4E0A26 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 8193A29721956FCBA5 - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = -CT = 6086D82CAB77B305DDA9 - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00 -CT = 8011D42ACA53426087A2 - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001 -CT = 466B6BF9C24B7E27E7E8 - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102 -CT = 30D2442F00250EC8E9DE - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203 -CT = EC0F77D1C9CBEC1FCF7E - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304 -CT = DCF626151373661B7ADB - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405 -CT = 27BC77D392ECECB577D9 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506 -CT = 34E97094F360DEDDB140 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304050607 -CT = E22E404BD441B873D0B9 - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708 -CT = 50D59A1143437B9DA178 - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506070809 -CT = 5C2D5E67F8933B6DC231 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A -CT = A088D5CEBCD0446F4CD5 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B -CT = C3EA6B4F03DFD21B935C - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C -CT = 6C2551E874428ECCE897 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = 93E4AEEB7F2BFC7636C0 - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3295E5D1C8F605B8A - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097950420FCD8701226 - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 46817E356018A8B6269F - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAE7F5C9837F1D39E38 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 5148CD89BD9F1CAB1BA7 - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FBACA3DF7DE2B9928 - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDB3B6AC7109D9B350 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D7B808AAFD84EF75BC - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 3065F7D7F5490091676E - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD68C6A94766CE43AD - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A9A3F51C174B9E3A2 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D538FD53459F7304985 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B94EF7B358A305AC4 - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E0339BCF053A3A65E0B7 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5243A416848B673D5AD1 - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C38E3AD7BEF8473CB9 - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A91D8A2D5AE34D589 - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813C11488E1B9B94D7AE - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = -CT = 6086FD2287A17DC7B307D3 - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00 -CT = 8011D3CBDABF7A406344D7 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001 -CT = 466B9CF02CDFD5EA6A7A4F - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102 -CT = 30D29B80C3C84E4DCA0568 - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203 -CT = EC0F17B1CC0049248DAA4A - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304 -CT = DCF6A550507B0B9CD51E64 - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405 -CT = 27BC0C2A8E8A64EBEFE952 - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506 -CT = 34E9941FFBFEC8E6E82293 - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304050607 -CT = E22EC8C53CA53D35C17E66 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708 -CT = 50D56F63349417778B0E4B - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506070809 -CT = 5C2D3E508800B4966B71A7 - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A -CT = A088BCA4B33FE32FFF2DFE - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B -CT = C3EA9A0960C0BB54E554C0 - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C -CT = 6C2578DB21B13A52369214 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = 93E43700ECD556C5AA2263 - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C7242B434BF8239F26 - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA43ABB09A08E0099B - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9E85E6967F840833E - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4E02D3CA683E1AF18 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C2225DAE5E97F37A5 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD8C0991F439F93146B - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA46D249B0B38D8920 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720BDD3B18C35AF8CFE - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 306598CB6FD5611541C514 - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD253F3B35CBB522C159 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A97A5B579D839FCB66F - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537D715DA859D57C7002 - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22B9D9F37FEACB7CAE - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E03355FC408F301E1410A7 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 524328952F3FA0D5E41953 - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C37220AAA1C14BAA1EE5 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A51E80620CA418F41F6 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA11D4B64BE7E657CA0 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = -CT = 6086FD0AE6B0BF8D1CE5F9E6 - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00 -CT = 8011D3FDE954C1DDC1EE39EA - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001 -CT = 466B9C4B8024F8416B21B012 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102 -CT = 30D29B59F71C31710D0A46A1 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203 -CT = EC0F17ADE4456F9A644D5FC2 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304 -CT = DCF6A5F7B4F2DEFED6CF6A16 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405 -CT = 27BC0CAEAAC0B59DD4684055 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506 -CT = 34E994B9082D610F54442F9E - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304050607 -CT = E22EC8910831A39F50B477D4 - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708 -CT = 50D56FE1D88077675CFEFAFB - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506070809 -CT = 5C2D3E4E707D891A33D1DA62 - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A -CT = A088BC710685402A115C845A - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B -CT = C3EA9A9F981626ABBAEE6C71 - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = 6C2578D9BF2F57CD176E4177 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = 93E437B00F06C5C7B13EEF52 - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C55F9E04540D778E2 - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39BC933A7E20C94936 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC12CEC6DD29DD4EDF - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4AD72A2A448CE3F050F - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4CB074397EE22AF8B6 - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD829BF72186BE492E85B - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA614C7D471B705B0B7D - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C241B7FD33A0584798 - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 306598876A4134D4F1A85E5D - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251AB199695798E49F6A - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A7613365D70EA3FD6 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3620F6B8C57843DC0 - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C441B29B0579EF7CDA - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558CD531C3AE3C7C5A8F - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829E729B666AE6B4025 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADA548D233C670AC6C - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161B2379354D076F452 - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8E8085DEC45A5EDE6 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = -CT = 6086FD0ABA2BA351A69DA3C6E0 - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00 -CT = 8011D3FD0CC99F45DFA7C6C031 - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001 -CT = 466B9C4B7265C57605A71D5AB4 - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102 -CT = 30D29B5918D2A18433EA16E3F5 - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203 -CT = EC0F17AD62EF0A5F9415E94998 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304 -CT = DCF6A5F77880554577E407D2E9 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405 -CT = 27BC0CAED620BFEF38A5C3ABBA - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506 -CT = 34E994B9A997DEBA059E844190 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304050607 -CT = E22EC891052FC65463C9133341 - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708 -CT = 50D56FE1323DE55C054208159B - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506070809 -CT = 5C2D3E4E071E5C180D363149BC - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A -CT = A088BC716A9F64C7C225EA0F97 - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C03B1F7E1A79734B1 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = 6C2578D9557386BE969A9DAB0B - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B954DB6F0ED90FD5A1 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BAF953B24BD44E98C - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA3958D99CB3F5E434C62F - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9D372A2F88BF7C975B - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC696840C97B9D46B69 - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C55467057344208F659 - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD8292696103BCB484D0700 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA619345F971A12F61157A - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C284E173C9FE7E72E311 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE52108EB2AB94F3B3 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A588981AF9F4194D73B - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A333FE110F1FD1932DA - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1A826262D9E0F8B32 - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44DE63F38564E468290 - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C73FBC8C15C48C02729 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 5243282952351690FBC63C6BDE - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA96E6F3BED6B09661 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A516151E1F8F81D81B0EA2B - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA399F77AEBD88E565 - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = -CT = 6086FD0ABA4C9A5DA203E6104178 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00 -CT = 8011D3FD0C16DC31D236CD08672C - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001 -CT = 466B9C4B723D174CED6731C59E85 - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102 -CT = 30D29B59184C5CE34157BE521FDF - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203 -CT = EC0F17AD6212433C698D3D8BACB0 - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304 -CT = DCF6A5F778C11B35C1C17B219962 - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405 -CT = 27BC0CAED69788740045CF300DAD - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506 -CT = 34E994B9A928FD123E0EBFD3398F - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304050607 -CT = E22EC89105085202F5E0B131CA0E - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708 -CT = 50D56FE1322FA12D69676D346146 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506070809 -CT = 5C2D3E4E078C7906EAB50C30D8C0 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A -CT = A088BC716A6D08BC001A2497264A - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80FE4C736238299370 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C777CB1183FFD87F1 - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92CC87781FFF8594951 - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD9085F063A0A58D8D - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B1BADBADC76EA547F - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB73F7596A9229171CD - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7141F790C1992A5BC - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552E68F3F8972AE7FEBE - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D78E282BD01A027618 - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D80E0A4565A58D41D3 - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846F016DC971B4D4B16B - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B629F03964EF72AFF - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A5814636713CCA7F1F2BE - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFD38A4D902D9A8360 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD3A6259CF2AD4D19C - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3CF2E52EB9905A049C - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AC4C692DD7DCFFB5B - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528C26FD69F6B071AB4C - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C2C829767C88E0B85 - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A51615111A781CCA35F2499BD - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA616DCE60BA30F86D3A - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = -CT = 6086FD0ABA4C3220CE150D5DC55346 - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00 -CT = 8011D3FD0C169CDB88F3431022F276 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001 -CT = 466B9C4B723D638929A7B35D95495D - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102 -CT = 30D29B59184CC3A5A0582246759025 - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203 -CT = EC0F17AD6212CFF35F2CEF26E9AFBF - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304 -CT = DCF6A5F778C1B2B995C4B1E7AA0EEF - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405 -CT = 27BC0CAED69703CAEA1F41ED721F02 - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506 -CT = 34E994B9A92889644FEF535F7EF67D - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304050607 -CT = E22EC891050847C78BAA51767D7CC2 - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708 -CT = 50D56FE1322FE1EC1997B1E336AF2A - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B66F6900D81411301 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A -CT = A088BC716A6D733A6B4D7253DF24A6 - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C28C872C0FEC22B74C - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C87B20FB9EA7E396491 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C512F712B9B74A3EA97 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD20A86B78C313493BCC - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10935FDFCC71BA0E93 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7169E7A816A5ED659CD - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6B7196BE95FA4769C - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED9F1415FC19F4B891B - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758B610E34B0EF9BCD2 - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D896FA05C59D7EBD8E5E - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1D2679BEB1D9D1F6D - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85349CB8F399D4F68C - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A5814648AF561703092C480 - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC4485F5B5C145E7C32 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD70EF7B8FA3FFA1B4FF - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C90D087F46B36502973 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA3F7FC4CBDEFCEA800 - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB922A14624203FDD3C - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71A3895F728FEDFD60 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175C24C0EE995FB0DD5 - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2D91736FDD1846559 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = -CT = 6086FD0ABA4C3215B65E5C5BA0BEAA4D - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00 -CT = 8011D3FD0C169C8C1E06FF2A9C085615 - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001 -CT = 466B9C4B723D637B620F5DA52F1BA926 - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102 -CT = 30D29B59184CC356F56225B6A15DB4FA - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203 -CT = EC0F17AD6212CFDEF3F040DD1CA1B9DB - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304 -CT = DCF6A5F778C1B22DC60CCA1D6BD84885 - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405 -CT = 27BC0CAED6970330D2F9221B100EAFB7 - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506 -CT = 34E994B9A92889AC3F51A852E3136DD3 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304050607 -CT = E22EC891050847B01322348BF54F81A3 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708 -CT = 50D56FE1322FE1614F2CAF03F38E91A6 - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B430F4EFF35D0AB5BCB - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A -CT = A088BC716A6D73F00862D1FB0D75F2F2 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E7A87C52C3EBA60C60 - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C87157E011B6986C33287 - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A27AC847FB3BDBD8A2 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD20006BFD30E99D9BC013 - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D47183A702620111BF - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB716279581FAC75A08A7BF - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6255E78A165B167673C - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED964A11F60B051E55661 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D75884D0B88DCF73FB475F - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962D84F8DCD5049C6D23 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F55E6022F2E3FDCBDD - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E033CB51D39C42F1A2 - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498EB8C01BEFEC6CFD3 - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F4C77234D4315E46 - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700AAB9BBA0DE26EF4C8 - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E726710E0E4128C7C - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398F80B27616DC8590A - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB9445734031ECE03546E - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71658A92AB496438A4F3 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DE7C860D875C552691 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8951D73F7B2D03BB3 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = -CT = 6086FD0ABA4C32152E54487C4166322BBC - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00 -CT = 8011D3FD0C169C8CDDCC3ACF5CE4353EC1 - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001 -CT = 466B9C4B723D637B3B167D03A95095CEAB - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102 -CT = 30D29B59184CC35613EFB779E5438DA130 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203 -CT = EC0F17AD6212CFDE64F1780A70DAE72356 - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304 -CT = DCF6A5F778C1B22DCFD80FE3D3C59B8EAE - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405 -CT = 27BC0CAED69703304585D64D9CD9CE9EB8 - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506 -CT = 34E994B9A92889ACBD5191F36D250B9D02 - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304050607 -CT = E22EC891050847B02379CE1956ACC2ECB1 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708 -CT = 50D56FE1322FE161FF2D15E8B3A65BAEA9 - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334968EC8672DF70FC9 - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A -CT = A088BC716A6D73F0230F907DCF948D566A - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F22B97B5FA1267B8 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DF705048CBF8182C1B - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A23738F407CC379D25EC - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD20003763418775BF4847AB - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D4668A9D8554F6FDA767 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB71627724EBECA9840C81CCF - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B62596757F0082AF15871E - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417659722C8B7CAC247 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D75884197D6A2ED042CB3488 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE024B8C317781A0ED0 - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5416C3A14BDC4C928AF - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E061EBC6818B7BA7553D - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A9EAD37357463745D4 - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E0C2F89712EA8F42 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A90647D4939AA51774A - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4EF252AB3C7D5FF4FA - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6A69E6D16E65293DC - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C17BB061C0234BBDED - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F5E2AD174DEACAE97 - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF3C3CC9D95A6855C - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E81C09F0FAE3320A55 - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = -CT = 6086FD0ABA4C32152E1490DE768B60AB9F28 - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00 -CT = 8011D3FD0C169C8CDD017BAA5B3A82EAE41D - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001 -CT = 466B9C4B723D637B3B3C3B56C8CDC6D2C7EC - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102 -CT = 30D29B59184CC35613302E5318FE9F979A7E - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203 -CT = EC0F17AD6212CFDE64D29A2702633E6FD6FB - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF537A4F0BF756B218CF - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405 -CT = 27BC0CAED6970330453C1BC30C4DA73EE2CC - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142448F8D753EB7B37 - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304050607 -CT = E22EC891050847B02351777542179BA573D0 - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF3FDF99CFBCF458E8F - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6CF227857DA211F16 - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CEA78553EDEB5F83C4 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F64C11FD16BEB61599 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEEFDA7E100172C50E8 - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EA3EB6D93CCC7000B0 - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F3B367873B30D5FDEE - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D466959AAD60403B48D7A8 - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F1108688D03CE1651C - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B625962683D8466CCF4F5A4B - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C95335F58EC710817D - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D75884197610F790666EA1A7FB - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090B256076010FBDFD1 - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411E8C1597147DE7D5A6 - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CE4919F75CE06BECE - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90AB93034B7C1855329 - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E388496970D88D77C7 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045B7D089002CE93CDA - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B6DFD0BC2C1648931 - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC88655CE94C0EB97 - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C100B0EBA8FCF98CBC98 - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F0142314CDD23E049C2 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF46F0C77D256CEBEA4 - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E8940CBAE24D3C4969B9 - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = -CT = 6086FD0ABA4C32152E14DDABE10E3507F590AD - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00 -CT = 8011D3FD0C169C8CDD0147AE64341DA9FF0461 - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001 -CT = 466B9C4B723D637B3B3CB76A410C6B59BF3510 - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102 -CT = 30D29B59184CC356133052C30B8ABA82882E04 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203 -CT = EC0F17AD6212CFDE64D2616FDB73CE8523DB85 - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E8C3A7730A77EAD02 - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405 -CT = 27BC0CAED6970330453CC232E50F92A054A7F8 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506 -CT = 34E994B9A92889ACBD142EE77D7B2189DBDDB9 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304050607 -CT = E22EC891050847B0235119932CC5E133746BCE - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AA6A54E51594552D9 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D63254ED7EEF776F91 - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31C16A694DCCE4C2D3 - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F6752C284084B620C93A - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6F10661D797DF12379 - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF949FA74A4812A907F - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30F9899A4A3A5215CDD - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD32490A2895779806 - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18AAA3B95E594F0F54A - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626812F5CD46A750DB1AA - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F9D8D639B1FBA55DE - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A8F266A4E6F8CED0A1 - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2068CDEB7BD06C191 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA443169E470E70D9B4 - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA712B0ABA24303020C - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3CD1449989CDBF2077 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6900AF8F61DC9B30B - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A2FF523EA0DD55597B - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09826E8148758ABD05 - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1149FE75A3DCD37E1 - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003245F4A66130258377 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E7E23A4B303DB76F7 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485D65072AB76D73AEE - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E8948650F87035F24878EA - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = -CT = 6086FD0ABA4C32152E14DD2C67072C5D03854BDE - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00 -CT = 8011D3FD0C169C8CDD0147B392E25AA6D4CDFCF2 - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001 -CT = 466B9C4B723D637B3B3CB75D68291A2EE72299E5 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102 -CT = 30D29B59184CC35613305230192297ECDD82AC87 - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613AC4EF750F4B3F91A2 - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E808719305FF5281601 - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 27BC0CAED6970330453CC24A6DEB85A33556B36C - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E86A364A21A89D70AB1 - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = E22EC891050847B0235119F4A36B4CC85CAEEEA6 - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7177C59CE2FC391D1 - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C785A7E32AE80B68A7 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE3130B29A647BF023E447 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EBD3FE5D77BA2143 - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB6F183ED97479FB85 - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92AC36ABCBD210D6AEA - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD01C81E8865503B2 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD859F44D575E5AC7BE5 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A886BA572F9F4F5DF4B - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814DA0DFF8883E254C40 - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C79CBC53942A3A9BF - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A8630B5BC2318E6D25D2 - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A280495F74D2CC130F66 - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B066661AE74006E386 - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD4DA6CCBBFF5BD0EC - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C02B488F792C53AE14D - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DC83C31A309612A519 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20CE84E4372167A2F5B - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DE763B8EE71A6054BD - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A896442B542EFC43DA - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263DF1985A7AF0DD049 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3B2B376BF67DAD2A3E - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C83E3E9F8D2EA4E28B - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E8948605406C44C3BD2AC733 - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = -CT = 6086FD0ABA4C32152E14DD2C02443907CA256CEBB0 - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36D834C320B61AB7079 - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDB9159D0288EA9F825 - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102 -CT = 30D29B59184CC35613305230DC59958BD55613C5A4 - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6C64FB31A9B1679668 - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F23D09701705084817 - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFDC03D2C8DE19BACD1 - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E86037E1E69E008024CCC - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D32C81FBA565E57039 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD48AF297E7B778B47 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74D5178C444EF044673 - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307F24D99150D8CE1556 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDCDFDAC4C4541955D - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB1194DD878B3D92792F - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A065613CFCA7C94289E - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0FC2F4985F0E0FF96 - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D2E89D84C4A75BC65F - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B08B445C7D8D271D3 - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D84CE4951055C238765 - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C44C4526AA94EC14368 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A522BA541E3B837060 - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807325FB0DB1514243BC - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B087A0D386554113BA12 - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD9167CCEE189B1C39BD - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C0286420FC6CE931847F4 - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9A52AAC6A2DD6B4FA - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4BCDC34D571F26E4F4 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA19BC9D101156BF40 - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9554B4E2818693675 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA7253E439FA87A14E - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC95A7648316E015D7 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C8290FB6897F619E8D9B - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513916C955337AB7255 - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = -CT = 6086FD0ABA4C32152E14DD2C02C9D24FBDF036DDEAFD - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB15DF174AE44A134CF - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBB65FCC149797E53CE - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = 30D29B59184CC35613305230DCAFED1FEA526D1C5070 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA35F862B7CD7FADC8D - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276032A59BEB707101F - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD0275421D3CE407BAB7 - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E860349A602B5FB9604A37C - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D150765E337D44BAD - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F110F10D72B795E55 - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD39A6A8F0B57432D69 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FAD707B097ADE15DEAC - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD276C878AA3AD05AD0 - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E717C220652C9128A9 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DE2D7EE801E6C0B1D - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB9F12AD40E21342D4 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D249A3FB5567881A228A - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7A967697C3AB9FBBC2 - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F2353F8C2090E0428 - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C444359F7C4CA7DC222FF - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B7E57FF6FBF44BF77 - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A280737619F9531D60644323 - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878ECFEFC99D386B04CB - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD91346BAFED50DF1B7743 - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C0286859C1F01BEB103F0CF - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4965918A3DE8FC34E - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2B46D62BDA24EBC093 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA7719DFE7918ABB0D1C - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9ABE36C1F8C713C2A68 - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F65DAB14820B056D8 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9169C7851881731C41 - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C82967ADD3A3086D2897DD - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA755A40262EC6F4DC - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 6086FD0ABA4C32152E14DD2C02C93543142B25A504E8D2 - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182A00A2D67FCE967BF - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD1C6EB2415EC8213F8 - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = 30D29B59184CC35613305230DCAF9555451A44CC76F95A - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA869E2F1C663B2814 - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276976666B4BD59A0F3EF - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C815AF94A05E0C9C0 - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615188AC210ADC036 - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D617A3798065346B5D5 - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3CA3AAD379CFB501CF - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC9A618A4FA286E5A - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDDDF21A5549ABCB235 - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B93D1D7A570C4CF219 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B564B658E858C7DF08 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF252AA3A3A1B6A624 - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D34A45A89BF0C95EA - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972DA45FDE716E49460 - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE43153CB37196E1E3 - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3F6276E98B2C545A72 - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F110BFD4CDFD77EA25 - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4FA68AB169698CF5B8 - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A280737683F740A92810B52F07 - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2D8A4E33BD96DCA463 - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447545C1CBF6C2FA19E - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A192658FF06AD6CA5C - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF3D5FC016A6F3AD58 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCC01DB11EFE5C46DFA - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F88ED48642F4FD2C - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3DC366B88EE1EB0D3A - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F32A49640055AC7E12F - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC91200542825D974576E9 - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B0D13B90BFCEB407E - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80E11AF9BB1B6B6C1E - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B653FD935A445D7EB9 - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5144AF34D8F90860A - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD19220B4610C12DADD0D - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B701F2DEC1A4992A1 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA03D49FACF02EBFABC7 - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971D52B3DB34163AD722 - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C76A96530EE024C3CA2 - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E86034916157564428D5921DB80 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D616832B23DE6323C26E4 - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D68FBAAE662F99144 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC634E53073E7A2BD06 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2D74D36D9DE05BC4C8 - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C194FDD2AC2818FBB - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59AA6354CC559BBA763 - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4B07D20D2F880A7039 - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3B83DAB4A584457EA8 - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B577FA771069528372 - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96BFD4A7095B5E3E8F - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0C186478A051BC62E - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E487971A5E930E8C9F - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7D7D41731A0E606B68 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837A22CED4694308A9CD - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAE626DD2361BDC5D1F - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD9134476422A85F50DD890AA9 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D3E11C5B124FF6B40 - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF3868A6DE0580680FA3 - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC897F9ED8EFB76A936 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F97C0FB7020E70741B - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D307B67EF01AA06D716 - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F321342875871DC6192A5 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E3B4E288FF861C22CD - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B7331202D81A8186CD0 - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB61B5C62F40999508 - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B619EE5AF0F15E33A30C - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C833F023C8ECD27A7A - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192761705927B54D7858C - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D25669E6BF7314C33 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F7E5464976850A72A - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE6A3043BD49FE2939E - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760B7254D6D18FCAADC4 - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E4DF5A7F29E6036284 - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D616843F124AF26AA0CDE6E - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D4164BE9535AAB930F2 - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BBD01A40543E87F488 - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC661C9B15149B78962 - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C101DF1C8F94BD03DEE - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A57FFFA7A7A13D8CC67 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC2FA0B2735A0DD7DD0 - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC5E64B4D305736087A - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB2D38B51ABBF1C5EC - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE9683D261DCE16F007083 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E567BB0FA824616ECA - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7431FDE4A326F7E40 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0586B57BF018BF7D2 - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4BF7C9C43A9CCA4B4 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF1A13DE3C6EDA997B - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A5252DE4C5D18AE33 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5FAFFED5F4742FD2D8 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CCE788E9275141FE8 - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81AAA212EE92B2445FC - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F5C5620B18974FB920 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D30759D6261D27B81B416 - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF7FC634C062234166 - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E3631BE232D1A0191C43 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B731182B6217A25EEDE8D - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB6608A1C3D2DCF688A0 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B619273F05C761367EFE34 - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA7AA0F8C7206A3D4A - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765948662F737C8A6A33 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32CFDDC2BD3B99DF9D - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F303D8DC12B3E871AD7 - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65CB9AE94DAC0581527 - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC3AF14A9E1357200D2 - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48AEC3C8405829B2C39 - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435C496AD31F913E7AFF - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419D67B0ACA072F8A2A7 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D9A6E2B8225F6005D - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67E04E00237C1226F83 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103ACF4C45B7AF094618 - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575A985BB793E70A2ACF - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A3810018A55DD5200 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC5396F2BBB58D6F7C0A3 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB120574E0FEB63055C3 - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FA266BAA7848C3126 - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517B1D8668CA605873D - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE85C94BEFAE6F4B9 - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0664D8E641553EFD42B - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A72C073134E30A11EE - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B148FB5AA174F4E0E - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05BDF9AF025361E183 - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F8467821C75E6D309B1 - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF585822CF92D8475AE - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24B4929748D8964477 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C79F9C761142FAB49 - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D084AD54BF6C963328 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6999DC64C06334E9ED - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D13095FD9F591174C1 - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116ACE89C4A25407B3B8 - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF1098E7B86BDCBBD3 - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707BA483D1C9347EE2D - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D67F2D68F128402A2 - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD19276597913B248C2A128928A - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAEE534258C1BD5617 - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BCC23EF70F9A9A94BB - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C41EB303AA91FDB960A - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C49C1FF73A9BC4E25 - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A41C780E7EB677CBB73 - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDEE1A84DE92DF8AF3D - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA094B00F898CD6CED0 - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1DCE1110E1D1EEB514 - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAFB3D88FD8B271DF71 - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E5E581D9C2B3F17C0 - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB9835136B0BE861E8 - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8A15360CCCFA128401 - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3777D4C584113C1F3 - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D6633B556340764A4 - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFC42E9FEE704935E9 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A5237A851FCF0E000D - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE750E1D89626A67590 - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F24BB020818B90CC1 - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B45F591F1B28F668 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5915E440C598DAA11A - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D74217FD80FCC84B40 - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B3A35AE15FCBA16592 - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF565A3F23DF5FC83638D - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DDCA3E9BB33B819B0E - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C40A5EF8F9CAFC62B78 - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B0BD8B38EC13907191 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF693025AD6F3C1816B798 - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D0971D62DB474D5E3 - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB97E5546DBC3C7EE90 - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF734E8F276D70C3980D - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9AA453113540A7B07 - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D869633D000FA4CCE38 - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B55F899BB75C021213 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC82A8E58717D55D0E1 - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50E9E9A324C95331C9 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197537F7B58DDF29A6B - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2FA53EC5272F5E50C7 - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D23B49FD2FE83D9E3 - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04A5966CC6B8FA0B3D - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B33C139C088A093D2 - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2E79F1E68922315078 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF90CC8C508EE7543397 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E8093262FFB28D4A8A4 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A43F26B2FC73305A3 - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC78260D0CAB2FEDB6D - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E729BE9A19DC3F8F74 - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DE51AC637F9F1A5DB - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA620662EA3EA828E1 - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599B733BD16A653EBBD - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79B1E790E18C8F26F2A - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F85846F2730122CCC40 - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B6C8BBC4074A12D1C2 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974A46EA3E9306A53BE - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D730F0CCC53AE9866454 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328ED5710F01DB72EE3 - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657E454343D3CCACBC0A - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD3607BA2EB9542FAFB8 - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C4027E7ADB6C2437E75F2 - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07BA72B036DEF30A3E6 - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A0B40F87A45168118B - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A29534CC4755160BD - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98A1E3F4ABCB2E8B6E2 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A580428A4D655E0083 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BCAA5EF304B8A5B5D1 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E938C5E1EA4AA3D172 - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CF0F40CBEBE5BD37A2 - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85F9CEE9AA675B28C89 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4D450EB4CCE384303 - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EE83897357C70CA052 - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCB68F071B188BBBC - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D68C772BDAA5BE9BFE8 - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE048378E1B8B8544B4D8C - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00D09798B14AE29266 - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC4797B53114012120C - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DF343EC4E115E084F - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805B9FF82E69070EE1BF - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8EA59EAEF4B685DAA5 - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC708125BF36A9F09A472 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E77739A7C8B13F0FCA54 - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF913B6BDA9B2C9B07D - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA078EAF506683B3A1FF - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A59976733AE225432FF8B8 - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEF1EC31ECA3659369 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E173151F1D602B8FB - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B939AEB02D478B358 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DF163A249A36AC2784 - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083E42F9CB5BD8690C7 - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EE8180FE9A797EC9AE - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC79B3F92E764FCBF14 - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD36856A9C58A4A3F9CE49 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724B6BDF301440BD202 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87BCB7DEB6A782626F - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C09EAD34B242CB089 - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A0140265918C4E00938 - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0576DE90136F5BE8C - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DB2235E149FDC3910 - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2EBF4DDA0F442045BA - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90D53E918A4E63F80EB - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAEE39BA97834930486 - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA25A16A0AA70B4B70E - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E9D1A21D3F2E5AAD17 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC822D98CBA09A571EC - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCEBA04D67D73C390A5 - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870953FD55A49056E5B - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834FAFB5DEEA59CEAB82 - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CF18055A4DD874254F - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E94AE09A31E0808ED - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7A4B889C610585201 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF4309B2C2BFEC65228 - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E32BDD18EC329C6399D - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087B5E2286C27404CBDE - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E6D4CBCC92A3E09D5 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EFD45B42B65F1176CD - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA0726160E7DA9917367B3 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761C1D006EC412D2B2B4 - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA0A43F97FA1AB9F025 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6BB5FF8FCD7CCDD54A - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E00CFA69FF002FAB8 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC447E78C2ED36DF7A8 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A5635F9B227553BF6A - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFEA90A0EF7B8D6D6A8 - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7EDA7BEE39CC8313FA4 - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520FF8C5050B446FC99 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D7C2804E8B885E0238 - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD20DF569F22E68D6C - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43F219EEE20964CE4A - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A0133B33FEE51D5572B95 - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D02283E9B3712F88BF - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC0CE5155A0F9645C6B - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5C6F074C862CF2F3F1 - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF871C1A1FF32214107 - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8CB0B454455035B6D1 - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FFB963D9156A8C43B3 - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EEFAEFD8CB7F8B3C9 - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC854C81308A59473B9F8 - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AD0146C6A6D39ECB6 - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D687019DC62C13DFC926615 - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F354E961E0B944BA299 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC55CF81E48D769DD75 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E734D4CCCD52CC4BDA8 - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7432D51F8A2630FCA9B - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF4314F56A9B83B2EC5AD - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322B3B83F677805B5C52 - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF5BE9B91BF4D3F874B - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F6F30B7CE495CB0DB - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50525B48AA6CA6B6EE - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA0726697D051E6F52CD4CEE - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAF132400EC7DA6842 - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA00690751D828A1C88BB - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A2F416C58E7ECB7FE - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85C8A5B608A8483E9D - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECE0CBBC3ED3C85274 - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A59634938FBA4F81B79C - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50634ECF2E42AA754B - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D822811B3DBF59C43 - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D171AB000DD180363C - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D6F4257855F2D4062 - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D52F3E5BD9612A3 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D30BE6DC028AB49B65 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330C2ABF9DDD1970CA27 - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BCDA73FDA35EAC01CB - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043DAB36A56DFB0FA93 - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF406D3A6BA3E250612 - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E9FBD4C2A9C96C4644 - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5CD215255352F34475 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1C0040B6DB18668111 - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75CCFB2947DA54451 - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC854216F720CD09D64DD02 - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC831431873054C8E8 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E0A5C50D1329CF29F - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F354985FA4D099EC1F87B - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501869C4E40824CB1CC - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E738428B882F9A66F9385 - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C955CDBEE6C82AEA3 - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE22C7D00372EBF14F - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11866EAEDE64C26F1 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50CF1EA99B8FFB53E38 - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5CF56C997A8961695B - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0E18577F7EF01652D - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE413D84EE0C8A6CF8 - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0253FF1159810B335 - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA00649E6BB16A25499C5C5 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51601212A643A24106 - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F12FDE384AE8B0C073 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7A4A50DE9615061EE - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A59683807FDC8F2681021B - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A2213563ED37D4C086 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1300852086B32FF092 - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D1864A1B7135A11FE4BC - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D73729E97ACFA2E507D - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D1CC2F82D6AE48814 - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D355A8020E38763949F9 - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAAFF1F267ACCDFBC88 - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC5682BF0A548E7FB67F - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6BAA3BADEFF51CAD4 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C22125D182997B53F - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96A3EFC1A6CC8AF8942 - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B9D91A427588EBFB3 - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBA04F2357ED76F50E0 - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF751E90049D79DF5A7BC - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A82F5831020831ABC8 - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356253061CEA1DFF4F - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E97711D1CC9F2A892C5 - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EB1B73BD23D54AD01 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FCE33CFDF03E6D7561 - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A39D14CBCC27E969E4 - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8917234473D94A3708 - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71774E830B73A9C874 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11EC056F73CB97B24B2 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C33DD5BCCCEA2B0DE0E - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C89EC64BC3B316907DB - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BD5BA5F66713AABFE1 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33627175617DAE9B08 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0ECBA5480BB0F027EC8 - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493D21196ED55326EE22 - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783E0513DFB7722666 - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D46059A70B405F9544 - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F39DB3566168156690 - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CB3AA2F11426752DB - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BF67E48CC2A4BB361 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D13768593A93584B3E0AF - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B8750B7F2DA4D3E1B7 - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F634D98CBB7EF5249 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EE91D17643E82D67A - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592A8D1E33F6DE545D1 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA315CBDAD91A6A2EF19 - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569A8BE8D9B340F2B16A - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6883FDD156E56543C8D - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C6357F14EBF1D0DB105 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC5EE390C97BB4FF06 - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B48788023BB9F9B7943 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF8C4615BDE956DAC3D - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141FED5E4DE832FDD14 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85BFCD957DC673F72AC - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC3564C9C504BA9CE883B5 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F9195CBABCB549919 - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF9E9ED707A81379952 - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0D0E42E79928EE82AD - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A356DAFBB67CDAD01E44 - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918DA0926341FD32508 - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B795201BA4A7A68733 - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E7B088F9863188DCA - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C339954B757FD36999004 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930162EE809E629B0C8 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE5A89BB0B1016C5775 - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BA2D06E9654520625B - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79A6C454DAE209F22B - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDC126F768D550ECFC4 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F31B923C2DAB24638 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493DFD5DF3D0AB8D4AD - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0819A0391A238A861 - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDAC4C159908C0109B1 - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6E2341FA28BF67D34 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376ADF001071668C1CDA7 - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89A3372F0E1BC33063D - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B3FC7FD5F28CCF7F2 - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA38EA41AD787AD63AC - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C8A752309EF337AC62 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BCB2E1F6967B5062FC - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADCF6C5276AD762B678 - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A4B0C4046B47B1C8B - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE6DE31E35CDFE4B01 - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E53ED97B349AF2457 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845345035F34AA9DC54 - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DC4B3D032423D9141 - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141955850F789F6CF254F - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D102EC283513C9985 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473E2F7FF2146F1A82E - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F22C5F7E9176689197B - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C2A8BFD6EE2CF4773 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF72EA67C01E520FF8 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569EF339C29D5435CC38 - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A42C95233D6EEDAB96 - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E38B65C7AB9A338215 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E52FACDD7050C2E7CA1 - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB8FEA03B3A9B34B59 - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F858EA99E32646460B - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568C82C07BF64EB5CBF - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA967295B984086CD12 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD652EFE688AF2FDCF - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC7F8CE7793E0E9D4C9 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9CD0A44D1F797D331E - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3A21AAB4F81464B62 - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B47ADF790731C61F1B - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE60A6A920C61B3CA3 - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC667AB78E7CCE1CFDEAE - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1B619FD50FA10762F6 - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB30CB7BD0739517929 - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B0066151B0869E00BEA - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31E4C336307E3210B33 - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882E66C553EFFE114D3 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CCF1C49A4D2AA75FD - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC616B750740FD65D35F - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1C67ED77EC2DA9E735 - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4B7038AC693F62A585 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23820B426C60A21498 - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A8EBC4D127DF6E2D76 - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA87E0B881CEF0933D - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C95B8E37DBFD4C99D - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0BAD2146ECA4C2BA4C - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BD2742338F3B22E864 - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C2B5DD0AA567CEFEB - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5135DCEAEA6E182E41 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C2DB65A32F0624E5 - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F1B9B5E343C95FCFD - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F1BECAD23CAB19765 - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E38895C5DA9652975E9E - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E5254DBCD2077C3962F3B - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C369D6D01B45DFD5C - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABAED8940C120425FA - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE5683884E26A96702EDC8B - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C25213082E482054A - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85A38B07A21244047F - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797726F2B4716DD4FEC - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CE6404A3E1E6D6C21 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C303C8BA79AD21947201 - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4AC17CA657E03C1421E - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE75B41869220B280308 - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AE1D77C4C09B6B0BD - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF41EF7E48B8963119 - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA19D62CC99D34EC0C - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00277AB30D018DEC19FA - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECC6DD338E21292C6B1 - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D2284176F4999E477C - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECA64672AF28E5DB70 - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A4F13162C908E0D07 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC13553359276AB792C - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC029AF4AF598F9C32 - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A994EED83B03FCBBB1 - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87FEB2F002799520716 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6DF47EE63F84CB5D4B - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11D3E83E4F925A1E7A - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B67FF8B3B39B72E4D5F - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5BFDAF21D4AE106AD - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F4C365C0B7AC8851B - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C51417DF764D65C036CDE - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C590CD12C8269DFB57 - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408D852151CC5C094D - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72AF2885E332C04D99 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388247C8E0D1DD84C9155 - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E5254777757E28AA178411E - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8EEE76D3284D54DB6A - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDEB96721A582B2BECE - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386D48FC27A892FCCEFA - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4C4B8197247D1A3914 - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E24A8BADA26CFCFF67 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797375CF23486FAD47C2B - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD07BC17870EE59FD78 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A8596BAE7483AE6BE - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC46A0B07F4FDE942FC - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590324082BF10D91D20 - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA2E70A8D02EF328085 - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF4097FF86E2B52276B4 - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA439AB31CFBFB42F6A3 - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276E376F763CCA334EA7 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE93ABE09579CBF2D4E - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D241C0F784AECBA87723 - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCFAD90552899895131 - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63DEE9CD062C9CB251 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC1122FDC56E14DB46DFB - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0F8AF68D8BDE0F4F83 - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90BABFEC54F64DA032D - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E0E547C3C098BDAB2 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D807C1AEDEE7BB45AD4 - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B00E7FEC0B71118AD6 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B678880AF3486D71B0F3F - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F5335B3A3CAF3F977B - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F90ACF81B6D43DD8543 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AFDE0D4A0C36D61266 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D256A5B22EB3D2C19F - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408AAB06E65E2404B160 - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A177EC32A7E6D25DC6 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241F29DBC946E14EB834 - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C39CCAF15FD851C006 - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0ECD28A388E71F2CF7 - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5EBCCDEE8E9FAED491 - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0395DC0FD9A497CB9 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEF3D40C43E9A3E7272 - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E222DB8875E56703F585 - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797372050E2B1ECF5535D9D - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB82E62EE7F833D3C5 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A22EF38099FE4DA99 - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0F0FCE938D44939DF - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9451AA15BC7451D2F - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285A7C4BCF91D9427B2 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C878A54A4B2B963496 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346BD9A4B40A56C9051 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE5EBDFFD1415DEC21D - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE96600C26B4E64A14C94 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D2414704915BCB1C7619AE - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF796C27800113D5C8D6 - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C63599A645097E03BA - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA493BB871293138DD - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0FBBBF56BBEDFFA5FD80 - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90B0A9417B07987658754 - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E793EED8119F5294C26 - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D80FE34260DBB3D43E2D0 - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B033748337011F82935F - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B678887E21AEA1BBA290306 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F554FFDE09B2F9A212CF - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F904529AC6067EBB65586 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AF4100D0A161A558DBA0 - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D244E8B8354DFA971996 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408A99D11FE88DE9CD787C - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A1E333DC31A1A922B333 - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241FBB16F57EC4DC958C10 - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C356A6AD9340D118F495 - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0EA8C292CBB803005F06 - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5ED1629B36E8042045B6 - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0274E9EC064EBE81B67 - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEFF4828ECE2F34249E1F - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E2223AA4C824C3AD05CDAC - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC7973720670BC056422ED80587 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB8E4AE3F5690A53654E - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A1EF8D60C0B6AFEFAC5 - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0EC70DB2F83B3009C8C - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9ED0C8234A8001AD2CA - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285407668AC98C3AA9187 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C872C1B96A32FD96238D - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346B6D144B008FE38EB29 - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE5878C092DC985607A0E - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE966F2B9094831297783AF - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D24147121059DF2C80C5D72B - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF793C0CBB8EDA0BC11415 - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C679772EE41FC00956FF - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA615182E51B7747757A - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0FBB7085CFF47CEB861DB3 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90B0A3CE901B8A4BF3ED486 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E79E7EB3E933ED45BDAEB - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D80FEBFF72CF79FC7DA0744 - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B033935291A28559774285 - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B6788878684F56BA15165008C - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F554631627745790FBCDF4 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F904594B5155753549AD848 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AF41248AEEFA5724ACA6E5 - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D244C5AEE2886E33F60B9D - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408A99F38AC4164A2B9311B7 - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A1E34FCE98E332683FEFBE - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241FBB417C93A9ADE518C356 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C3566C7375EBA1D47BB228 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0EA850B94E95932C2CAC87 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5ED12C615557FD3A99A5FA - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0275442C9919B0EE020F7 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEFF403AE6F1993DF800AB5 - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E2223AA9F93282FCD877E52F - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797372067D1206016BE0CBF7F2A - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB8E6458DD03E1EF15E850 - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A1E82D07E5D4875514BCE - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0ECCEAE91814DB706E7CE - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9EDB8E2CBDF3141F4F9B4 - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285409E92C5B97F4AFF062E - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C8722A327440A033EB8BE1 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346B6EBAB47D2AA4AB83C8D - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE587C88B8334595A7B029A - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE966F2433DEF375ED956E790 - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D241471266AADDE33297EB0D8A - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF793C3171F7A2EAD9C83E07 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C679DB25CC58A725295352 - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F1011121314151617 -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA61D1BC79FD0542453AA3 - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 7A0775B5021A22A6 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = CE89A55740C8B4E3 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = A92BCC1E6D5F462B + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = 5499F49CF42FFABF + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = BB87C0583A6DD75A + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = 97CED4E8CBCF784A + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 8CF17914F97A50BF + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = AE6A72EF4F4FBBCB + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 9C7C95147F6A7275 + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = CCC5171571CEEB8A + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = A2E9F500938D3229 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = A8DE2240D0DFB1E2 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = 35948F9B7178A645 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = FBF2822A7377A8C6 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 8734A2D41330D694 + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 5E4DFAB11A95B17F + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = C01709B66AAD6B36 + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 5C560476E6D3B28E + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = CF37BD8C1772820A + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = A846863CE378AB9A + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 7BF4622DA9AFFFC7 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 32C6739B79152D20 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 82F2185D19E7FAA7 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = CC9270231A049CDB + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = F7BD34CC58312F1A + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 5B9F402303A85019 + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = A75666B854A9CD83 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = D09FCAEE4697ABF6 + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 6CBB0A7AA7E7665C + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 55B84A6CB16CE942 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 16792CE49D7A3C01 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 6785FFD46C12226E + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = BFD937619203F928 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 6017F2D006DCC66569 + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = 803A2659C516B939AB + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = 46E3074F13C91F99B1 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = 307C974520591CA2E2 + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = EC755EBA406220AB79 + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = DC08530A4E6ED68CE3 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 27C9F86B812B55C2D3 + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 34B131ACD6CB08FDF4 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = E2B9EA9D2FDC83128C + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = 50917462CC4FFF7E96 + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = 5CA86DE2C74093148B + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = A0D9B65C49AD65C1E5 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = C3E94CDEC9CB22D075 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = 6C17A04DBD11B7E265 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = 936DA78AF939EE4680 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = B621BD09CAABFE4B94 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = F03778DD16E5EDC218 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 46A0C5F58478ED3C2C + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1E5C4F1554641A60BE + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5193BE6E6A0D35D33B + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C009499C8FCFB10981 + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2C03F7FD0D1A9F4B28 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 224C590325FCE724A9 + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 304AB56057C1A74C0A + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5F20B11B90D66EEE1E + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0FF7300006FE6207D0 + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D3B7A3C712446811E + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E45B084840170C140 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E0CE37FA4CC5D0767D + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5277EF20E98A409CFC + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26595ED841A849BB74 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 90B08E2F255C4E0A26 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 8193A29721956FCBA5 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 6086D82CAB77B305DDA9 + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 8011D42ACA53426087A2 + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = 466B6BF9C24B7E27E7E8 + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = 30D2442F00250EC8E9DE + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = EC0F77D1C9CBEC1FCF7E + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = DCF626151373661B7ADB + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 27BC77D392ECECB577D9 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 34E97094F360DEDDB140 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = E22E404BD441B873D0B9 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 50D59A1143437B9DA178 + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 5C2D5E67F8933B6DC231 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = A088D5CEBCD0446F4CD5 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = C3EA6B4F03DFD21B935C + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = 6C2551E874428ECCE897 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = 93E4AEEB7F2BFC7636C0 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3295E5D1C8F605B8A + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097950420FCD8701226 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 46817E356018A8B6269F + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAE7F5C9837F1D39E38 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 5148CD89BD9F1CAB1BA7 + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FBACA3DF7DE2B9928 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDB3B6AC7109D9B350 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D7B808AAFD84EF75BC + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 3065F7D7F5490091676E + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD68C6A94766CE43AD + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A9A3F51C174B9E3A2 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D538FD53459F7304985 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B94EF7B358A305AC4 + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E0339BCF053A3A65E0B7 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5243A416848B673D5AD1 + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C38E3AD7BEF8473CB9 + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A91D8A2D5AE34D589 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813C11488E1B9B94D7AE + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = 6086FD2287A17DC7B307D3 + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = 8011D3CBDABF7A406344D7 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = 466B9CF02CDFD5EA6A7A4F + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = 30D29B80C3C84E4DCA0568 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = EC0F17B1CC0049248DAA4A + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = DCF6A550507B0B9CD51E64 + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 27BC0C2A8E8A64EBEFE952 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 34E9941FFBFEC8E6E82293 + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = E22EC8C53CA53D35C17E66 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 50D56F63349417778B0E4B + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = 5C2D3E508800B4966B71A7 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = A088BCA4B33FE32FFF2DFE + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = C3EA9A0960C0BB54E554C0 + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = 6C2578DB21B13A52369214 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = 93E43700ECD556C5AA2263 + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C7242B434BF8239F26 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA43ABB09A08E0099B + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9E85E6967F840833E + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4E02D3CA683E1AF18 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C2225DAE5E97F37A5 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD8C0991F439F93146B + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA46D249B0B38D8920 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720BDD3B18C35AF8CFE + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 306598CB6FD5611541C514 + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD253F3B35CBB522C159 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A97A5B579D839FCB66F + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537D715DA859D57C7002 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22B9D9F37FEACB7CAE + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E03355FC408F301E1410A7 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 524328952F3FA0D5E41953 + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C37220AAA1C14BAA1EE5 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A51E80620CA418F41F6 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA11D4B64BE7E657CA0 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = 6086FD0AE6B0BF8D1CE5F9E6 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = 8011D3FDE954C1DDC1EE39EA + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = 466B9C4B8024F8416B21B012 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = 30D29B59F71C31710D0A46A1 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = EC0F17ADE4456F9A644D5FC2 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = DCF6A5F7B4F2DEFED6CF6A16 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 27BC0CAEAAC0B59DD4684055 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 34E994B9082D610F54442F9E + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = E22EC8910831A39F50B477D4 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 50D56FE1D88077675CFEFAFB + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 5C2D3E4E707D891A33D1DA62 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = A088BC710685402A115C845A + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = C3EA9A9F981626ABBAEE6C71 + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = 6C2578D9BF2F57CD176E4177 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = 93E437B00F06C5C7B13EEF52 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C55F9E04540D778E2 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39BC933A7E20C94936 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC12CEC6DD29DD4EDF + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4AD72A2A448CE3F050F + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4CB074397EE22AF8B6 + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD829BF72186BE492E85B + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA614C7D471B705B0B7D + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C241B7FD33A0584798 + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 306598876A4134D4F1A85E5D + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251AB199695798E49F6A + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A7613365D70EA3FD6 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3620F6B8C57843DC0 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C441B29B0579EF7CDA + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558CD531C3AE3C7C5A8F + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829E729B666AE6B4025 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADA548D233C670AC6C + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161B2379354D076F452 + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8E8085DEC45A5EDE6 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 6086FD0ABA2BA351A69DA3C6E0 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 8011D3FD0CC99F45DFA7C6C031 + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = 466B9C4B7265C57605A71D5AB4 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = 30D29B5918D2A18433EA16E3F5 + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = EC0F17AD62EF0A5F9415E94998 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = DCF6A5F77880554577E407D2E9 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 27BC0CAED620BFEF38A5C3ABBA + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 34E994B9A997DEBA059E844190 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = E22EC891052FC65463C9133341 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 50D56FE1323DE55C054208159B + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 5C2D3E4E071E5C180D363149BC + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = A088BC716A9F64C7C225EA0F97 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C03B1F7E1A79734B1 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = 6C2578D9557386BE969A9DAB0B + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B954DB6F0ED90FD5A1 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BAF953B24BD44E98C + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA3958D99CB3F5E434C62F + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9D372A2F88BF7C975B + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC696840C97B9D46B69 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C55467057344208F659 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD8292696103BCB484D0700 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA619345F971A12F61157A + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C284E173C9FE7E72E311 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE52108EB2AB94F3B3 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A588981AF9F4194D73B + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A333FE110F1FD1932DA + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1A826262D9E0F8B32 + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44DE63F38564E468290 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C73FBC8C15C48C02729 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 5243282952351690FBC63C6BDE + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA96E6F3BED6B09661 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A516151E1F8F81D81B0EA2B + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA399F77AEBD88E565 + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 6086FD0ABA4C9A5DA203E6104178 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = 8011D3FD0C16DC31D236CD08672C + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = 466B9C4B723D174CED6731C59E85 + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = 30D29B59184C5CE34157BE521FDF + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = EC0F17AD6212433C698D3D8BACB0 + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = DCF6A5F778C11B35C1C17B219962 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 27BC0CAED69788740045CF300DAD + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 34E994B9A928FD123E0EBFD3398F + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = E22EC89105085202F5E0B131CA0E + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 50D56FE1322FA12D69676D346146 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = 5C2D3E4E078C7906EAB50C30D8C0 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = A088BC716A6D08BC001A2497264A + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80FE4C736238299370 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C777CB1183FFD87F1 + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92CC87781FFF8594951 + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD9085F063A0A58D8D + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B1BADBADC76EA547F + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB73F7596A9229171CD + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7141F790C1992A5BC + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552E68F3F8972AE7FEBE + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D78E282BD01A027618 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D80E0A4565A58D41D3 + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846F016DC971B4D4B16B + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B629F03964EF72AFF + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A5814636713CCA7F1F2BE + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFD38A4D902D9A8360 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD3A6259CF2AD4D19C + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3CF2E52EB9905A049C + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AC4C692DD7DCFFB5B + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528C26FD69F6B071AB4C + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C2C829767C88E0B85 + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A51615111A781CCA35F2499BD + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA616DCE60BA30F86D3A + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = 6086FD0ABA4C3220CE150D5DC55346 + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = 8011D3FD0C169CDB88F3431022F276 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = 466B9C4B723D638929A7B35D95495D + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = 30D29B59184CC3A5A0582246759025 + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = EC0F17AD6212CFF35F2CEF26E9AFBF + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = DCF6A5F778C1B2B995C4B1E7AA0EEF + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 27BC0CAED69703CAEA1F41ED721F02 + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 34E994B9A92889644FEF535F7EF67D + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = E22EC891050847C78BAA51767D7CC2 + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 50D56FE1322FE1EC1997B1E336AF2A + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B66F6900D81411301 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = A088BC716A6D733A6B4D7253DF24A6 + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C28C872C0FEC22B74C + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C87B20FB9EA7E396491 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C512F712B9B74A3EA97 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD20A86B78C313493BCC + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10935FDFCC71BA0E93 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7169E7A816A5ED659CD + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6B7196BE95FA4769C + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED9F1415FC19F4B891B + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758B610E34B0EF9BCD2 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D896FA05C59D7EBD8E5E + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1D2679BEB1D9D1F6D + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85349CB8F399D4F68C + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A5814648AF561703092C480 + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC4485F5B5C145E7C32 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD70EF7B8FA3FFA1B4FF + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C90D087F46B36502973 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA3F7FC4CBDEFCEA800 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB922A14624203FDD3C + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71A3895F728FEDFD60 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175C24C0EE995FB0DD5 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2D91736FDD1846559 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 6086FD0ABA4C3215B65E5C5BA0BEAA4D + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = 8011D3FD0C169C8C1E06FF2A9C085615 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = 466B9C4B723D637B620F5DA52F1BA926 + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = 30D29B59184CC356F56225B6A15DB4FA + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = EC0F17AD6212CFDEF3F040DD1CA1B9DB + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = DCF6A5F778C1B22DC60CCA1D6BD84885 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 27BC0CAED6970330D2F9221B100EAFB7 + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 34E994B9A92889AC3F51A852E3136DD3 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = E22EC891050847B01322348BF54F81A3 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 50D56FE1322FE1614F2CAF03F38E91A6 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B430F4EFF35D0AB5BCB + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = A088BC716A6D73F00862D1FB0D75F2F2 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E7A87C52C3EBA60C60 + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C87157E011B6986C33287 + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A27AC847FB3BDBD8A2 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD20006BFD30E99D9BC013 + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D47183A702620111BF + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB716279581FAC75A08A7BF + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6255E78A165B167673C + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED964A11F60B051E55661 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D75884D0B88DCF73FB475F + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962D84F8DCD5049C6D23 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F55E6022F2E3FDCBDD + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E033CB51D39C42F1A2 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498EB8C01BEFEC6CFD3 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F4C77234D4315E46 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700AAB9BBA0DE26EF4C8 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E726710E0E4128C7C + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398F80B27616DC8590A + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB9445734031ECE03546E + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71658A92AB496438A4F3 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DE7C860D875C552691 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8951D73F7B2D03BB3 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = 6086FD0ABA4C32152E54487C4166322BBC + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = 8011D3FD0C169C8CDDCC3ACF5CE4353EC1 + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = 466B9C4B723D637B3B167D03A95095CEAB + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = 30D29B59184CC35613EFB779E5438DA130 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = EC0F17AD6212CFDE64F1780A70DAE72356 + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = DCF6A5F778C1B22DCFD80FE3D3C59B8EAE + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 27BC0CAED69703304585D64D9CD9CE9EB8 + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 34E994B9A92889ACBD5191F36D250B9D02 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = E22EC891050847B02379CE1956ACC2ECB1 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 50D56FE1322FE161FF2D15E8B3A65BAEA9 + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334968EC8672DF70FC9 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = A088BC716A6D73F0230F907DCF948D566A + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F22B97B5FA1267B8 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DF705048CBF8182C1B + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A23738F407CC379D25EC + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD20003763418775BF4847AB + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D4668A9D8554F6FDA767 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB71627724EBECA9840C81CCF + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B62596757F0082AF15871E + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417659722C8B7CAC247 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D75884197D6A2ED042CB3488 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE024B8C317781A0ED0 + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5416C3A14BDC4C928AF + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E061EBC6818B7BA7553D + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A9EAD37357463745D4 + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E0C2F89712EA8F42 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A90647D4939AA51774A + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4EF252AB3C7D5FF4FA + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6A69E6D16E65293DC + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C17BB061C0234BBDED + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F5E2AD174DEACAE97 + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF3C3CC9D95A6855C + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E81C09F0FAE3320A55 + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 6086FD0ABA4C32152E1490DE768B60AB9F28 + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = 8011D3FD0C169C8CDD017BAA5B3A82EAE41D + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = 466B9C4B723D637B3B3C3B56C8CDC6D2C7EC + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = 30D29B59184CC35613302E5318FE9F979A7E + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = EC0F17AD6212CFDE64D29A2702633E6FD6FB + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF537A4F0BF756B218CF + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 27BC0CAED6970330453C1BC30C4DA73EE2CC + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142448F8D753EB7B37 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = E22EC891050847B02351777542179BA573D0 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF3FDF99CFBCF458E8F + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6CF227857DA211F16 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CEA78553EDEB5F83C4 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F64C11FD16BEB61599 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEEFDA7E100172C50E8 + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EA3EB6D93CCC7000B0 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F3B367873B30D5FDEE + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D466959AAD60403B48D7A8 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F1108688D03CE1651C + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B625962683D8466CCF4F5A4B + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C95335F58EC710817D + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D75884197610F790666EA1A7FB + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090B256076010FBDFD1 + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411E8C1597147DE7D5A6 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CE4919F75CE06BECE + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90AB93034B7C1855329 + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E388496970D88D77C7 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045B7D089002CE93CDA + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B6DFD0BC2C1648931 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC88655CE94C0EB97 + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C100B0EBA8FCF98CBC98 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F0142314CDD23E049C2 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF46F0C77D256CEBEA4 + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E8940CBAE24D3C4969B9 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 6086FD0ABA4C32152E14DDABE10E3507F590AD + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = 8011D3FD0C169C8CDD0147AE64341DA9FF0461 + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = 466B9C4B723D637B3B3CB76A410C6B59BF3510 + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = 30D29B59184CC356133052C30B8ABA82882E04 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = EC0F17AD6212CFDE64D2616FDB73CE8523DB85 + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E8C3A7730A77EAD02 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 27BC0CAED6970330453CC232E50F92A054A7F8 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 34E994B9A92889ACBD142EE77D7B2189DBDDB9 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = E22EC891050847B0235119932CC5E133746BCE + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AA6A54E51594552D9 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D63254ED7EEF776F91 + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31C16A694DCCE4C2D3 + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F6752C284084B620C93A + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6F10661D797DF12379 + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF949FA74A4812A907F + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30F9899A4A3A5215CDD + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD32490A2895779806 + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18AAA3B95E594F0F54A + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626812F5CD46A750DB1AA + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F9D8D639B1FBA55DE + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A8F266A4E6F8CED0A1 + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2068CDEB7BD06C191 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA443169E470E70D9B4 + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA712B0ABA24303020C + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3CD1449989CDBF2077 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6900AF8F61DC9B30B + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A2FF523EA0DD55597B + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09826E8148758ABD05 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1149FE75A3DCD37E1 + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003245F4A66130258377 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E7E23A4B303DB76F7 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485D65072AB76D73AEE + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E8948650F87035F24878EA + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 6086FD0ABA4C32152E14DD2C67072C5D03854BDE + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = 8011D3FD0C169C8CDD0147B392E25AA6D4CDFCF2 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = 466B9C4B723D637B3B3CB75D68291A2EE72299E5 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = 30D29B59184CC35613305230192297ECDD82AC87 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613AC4EF750F4B3F91A2 + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E808719305FF5281601 + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 27BC0CAED6970330453CC24A6DEB85A33556B36C + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E86A364A21A89D70AB1 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = E22EC891050847B0235119F4A36B4CC85CAEEEA6 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7177C59CE2FC391D1 + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C785A7E32AE80B68A7 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE3130B29A647BF023E447 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EBD3FE5D77BA2143 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB6F183ED97479FB85 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92AC36ABCBD210D6AEA + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD01C81E8865503B2 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD859F44D575E5AC7BE5 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A886BA572F9F4F5DF4B + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814DA0DFF8883E254C40 + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C79CBC53942A3A9BF + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A8630B5BC2318E6D25D2 + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A280495F74D2CC130F66 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B066661AE74006E386 + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD4DA6CCBBFF5BD0EC + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C02B488F792C53AE14D + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DC83C31A309612A519 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20CE84E4372167A2F5B + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DE763B8EE71A6054BD + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A896442B542EFC43DA + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263DF1985A7AF0DD049 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3B2B376BF67DAD2A3E + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C83E3E9F8D2EA4E28B + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E8948605406C44C3BD2AC733 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = 6086FD0ABA4C32152E14DD2C02443907CA256CEBB0 + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36D834C320B61AB7079 + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDB9159D0288EA9F825 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = 30D29B59184CC35613305230DC59958BD55613C5A4 + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6C64FB31A9B1679668 + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F23D09701705084817 + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFDC03D2C8DE19BACD1 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E86037E1E69E008024CCC + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D32C81FBA565E57039 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD48AF297E7B778B47 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74D5178C444EF044673 + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307F24D99150D8CE1556 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDCDFDAC4C4541955D + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB1194DD878B3D92792F + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A065613CFCA7C94289E + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0FC2F4985F0E0FF96 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D2E89D84C4A75BC65F + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B08B445C7D8D271D3 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D84CE4951055C238765 + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C44C4526AA94EC14368 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A522BA541E3B837060 + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807325FB0DB1514243BC + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B087A0D386554113BA12 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD9167CCEE189B1C39BD + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C0286420FC6CE931847F4 + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9A52AAC6A2DD6B4FA + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4BCDC34D571F26E4F4 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA19BC9D101156BF40 + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9554B4E2818693675 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA7253E439FA87A14E + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC95A7648316E015D7 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C8290FB6897F619E8D9B + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513916C955337AB7255 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 6086FD0ABA4C32152E14DD2C02C9D24FBDF036DDEAFD + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB15DF174AE44A134CF + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBB65FCC149797E53CE + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = 30D29B59184CC35613305230DCAFED1FEA526D1C5070 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA35F862B7CD7FADC8D + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276032A59BEB707101F + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD0275421D3CE407BAB7 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E860349A602B5FB9604A37C + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D150765E337D44BAD + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F110F10D72B795E55 + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD39A6A8F0B57432D69 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FAD707B097ADE15DEAC + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD276C878AA3AD05AD0 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E717C220652C9128A9 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DE2D7EE801E6C0B1D + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB9F12AD40E21342D4 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D249A3FB5567881A228A + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7A967697C3AB9FBBC2 + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F2353F8C2090E0428 + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C444359F7C4CA7DC222FF + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B7E57FF6FBF44BF77 + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A280737619F9531D60644323 + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878ECFEFC99D386B04CB + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD91346BAFED50DF1B7743 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C0286859C1F01BEB103F0CF + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4965918A3DE8FC34E + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2B46D62BDA24EBC093 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA7719DFE7918ABB0D1C + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9ABE36C1F8C713C2A68 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F65DAB14820B056D8 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9169C7851881731C41 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C82967ADD3A3086D2897DD + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA755A40262EC6F4DC + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 6086FD0ABA4C32152E14DD2C02C93543142B25A504E8D2 + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182A00A2D67FCE967BF + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD1C6EB2415EC8213F8 + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = 30D29B59184CC35613305230DCAF9555451A44CC76F95A + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA869E2F1C663B2814 + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276976666B4BD59A0F3EF + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C815AF94A05E0C9C0 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615188AC210ADC036 + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D617A3798065346B5D5 + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3CA3AAD379CFB501CF + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC9A618A4FA286E5A + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDDDF21A5549ABCB235 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B93D1D7A570C4CF219 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B564B658E858C7DF08 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF252AA3A3A1B6A624 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D34A45A89BF0C95EA + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972DA45FDE716E49460 + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE43153CB37196E1E3 + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3F6276E98B2C545A72 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F110BFD4CDFD77EA25 + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4FA68AB169698CF5B8 + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A280737683F740A92810B52F07 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2D8A4E33BD96DCA463 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447545C1CBF6C2FA19E + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A192658FF06AD6CA5C + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF3D5FC016A6F3AD58 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCC01DB11EFE5C46DFA + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F88ED48642F4FD2C + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3DC366B88EE1EB0D3A + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F32A49640055AC7E12F + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC91200542825D974576E9 + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B0D13B90BFCEB407E + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80E11AF9BB1B6B6C1E + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B653FD935A445D7EB9 + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5144AF34D8F90860A + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD19220B4610C12DADD0D + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B701F2DEC1A4992A1 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA03D49FACF02EBFABC7 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971D52B3DB34163AD722 + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C76A96530EE024C3CA2 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E86034916157564428D5921DB80 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D616832B23DE6323C26E4 + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D68FBAAE662F99144 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC634E53073E7A2BD06 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2D74D36D9DE05BC4C8 + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C194FDD2AC2818FBB + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59AA6354CC559BBA763 + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4B07D20D2F880A7039 + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3B83DAB4A584457EA8 + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B577FA771069528372 + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96BFD4A7095B5E3E8F + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0C186478A051BC62E + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E487971A5E930E8C9F + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7D7D41731A0E606B68 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837A22CED4694308A9CD + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAE626DD2361BDC5D1F + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD9134476422A85F50DD890AA9 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D3E11C5B124FF6B40 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF3868A6DE0580680FA3 + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC897F9ED8EFB76A936 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F97C0FB7020E70741B + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D307B67EF01AA06D716 + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F321342875871DC6192A5 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E3B4E288FF861C22CD + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B7331202D81A8186CD0 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB61B5C62F40999508 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B619EE5AF0F15E33A30C + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C833F023C8ECD27A7A + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192761705927B54D7858C + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D25669E6BF7314C33 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F7E5464976850A72A + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE6A3043BD49FE2939E + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760B7254D6D18FCAADC4 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E4DF5A7F29E6036284 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D616843F124AF26AA0CDE6E + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D4164BE9535AAB930F2 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BBD01A40543E87F488 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC661C9B15149B78962 + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C101DF1C8F94BD03DEE + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A57FFFA7A7A13D8CC67 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC2FA0B2735A0DD7DD0 + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC5E64B4D305736087A + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB2D38B51ABBF1C5EC + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE9683D261DCE16F007083 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E567BB0FA824616ECA + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7431FDE4A326F7E40 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0586B57BF018BF7D2 + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4BF7C9C43A9CCA4B4 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF1A13DE3C6EDA997B + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A5252DE4C5D18AE33 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5FAFFED5F4742FD2D8 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CCE788E9275141FE8 + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81AAA212EE92B2445FC + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F5C5620B18974FB920 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D30759D6261D27B81B416 + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF7FC634C062234166 + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E3631BE232D1A0191C43 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B731182B6217A25EEDE8D + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB6608A1C3D2DCF688A0 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B619273F05C761367EFE34 + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA7AA0F8C7206A3D4A + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765948662F737C8A6A33 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32CFDDC2BD3B99DF9D + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F303D8DC12B3E871AD7 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65CB9AE94DAC0581527 + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC3AF14A9E1357200D2 + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48AEC3C8405829B2C39 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435C496AD31F913E7AFF + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419D67B0ACA072F8A2A7 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D9A6E2B8225F6005D + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67E04E00237C1226F83 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103ACF4C45B7AF094618 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575A985BB793E70A2ACF + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A3810018A55DD5200 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC5396F2BBB58D6F7C0A3 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB120574E0FEB63055C3 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FA266BAA7848C3126 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517B1D8668CA605873D + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE85C94BEFAE6F4B9 + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0664D8E641553EFD42B + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A72C073134E30A11EE + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B148FB5AA174F4E0E + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05BDF9AF025361E183 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F8467821C75E6D309B1 + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF585822CF92D8475AE + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24B4929748D8964477 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C79F9C761142FAB49 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D084AD54BF6C963328 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6999DC64C06334E9ED + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D13095FD9F591174C1 + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116ACE89C4A25407B3B8 + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF1098E7B86BDCBBD3 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707BA483D1C9347EE2D + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D67F2D68F128402A2 + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD19276597913B248C2A128928A + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAEE534258C1BD5617 + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BCC23EF70F9A9A94BB + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C41EB303AA91FDB960A + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C49C1FF73A9BC4E25 + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A41C780E7EB677CBB73 + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDEE1A84DE92DF8AF3D + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA094B00F898CD6CED0 + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1DCE1110E1D1EEB514 + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAFB3D88FD8B271DF71 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E5E581D9C2B3F17C0 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB9835136B0BE861E8 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8A15360CCCFA128401 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3777D4C584113C1F3 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D6633B556340764A4 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFC42E9FEE704935E9 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A5237A851FCF0E000D + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE750E1D89626A67590 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F24BB020818B90CC1 + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B45F591F1B28F668 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5915E440C598DAA11A + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D74217FD80FCC84B40 + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B3A35AE15FCBA16592 + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF565A3F23DF5FC83638D + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DDCA3E9BB33B819B0E + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C40A5EF8F9CAFC62B78 + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B0BD8B38EC13907191 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF693025AD6F3C1816B798 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D0971D62DB474D5E3 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB97E5546DBC3C7EE90 + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF734E8F276D70C3980D + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9AA453113540A7B07 + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D869633D000FA4CCE38 + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B55F899BB75C021213 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC82A8E58717D55D0E1 + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50E9E9A324C95331C9 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197537F7B58DDF29A6B + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2FA53EC5272F5E50C7 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D23B49FD2FE83D9E3 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04A5966CC6B8FA0B3D + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B33C139C088A093D2 + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2E79F1E68922315078 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF90CC8C508EE7543397 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E8093262FFB28D4A8A4 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A43F26B2FC73305A3 + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC78260D0CAB2FEDB6D + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E729BE9A19DC3F8F74 + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DE51AC637F9F1A5DB + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA620662EA3EA828E1 + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599B733BD16A653EBBD + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79B1E790E18C8F26F2A + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F85846F2730122CCC40 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B6C8BBC4074A12D1C2 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974A46EA3E9306A53BE + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D730F0CCC53AE9866454 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328ED5710F01DB72EE3 + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657E454343D3CCACBC0A + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD3607BA2EB9542FAFB8 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C4027E7ADB6C2437E75F2 + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07BA72B036DEF30A3E6 + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A0B40F87A45168118B + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A29534CC4755160BD + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98A1E3F4ABCB2E8B6E2 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A580428A4D655E0083 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BCAA5EF304B8A5B5D1 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E938C5E1EA4AA3D172 + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CF0F40CBEBE5BD37A2 + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85F9CEE9AA675B28C89 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4D450EB4CCE384303 + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EE83897357C70CA052 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCB68F071B188BBBC + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D68C772BDAA5BE9BFE8 + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE048378E1B8B8544B4D8C + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00D09798B14AE29266 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC4797B53114012120C + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DF343EC4E115E084F + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805B9FF82E69070EE1BF + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8EA59EAEF4B685DAA5 + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC708125BF36A9F09A472 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E77739A7C8B13F0FCA54 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF913B6BDA9B2C9B07D + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA078EAF506683B3A1FF + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A59976733AE225432FF8B8 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEF1EC31ECA3659369 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E173151F1D602B8FB + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B939AEB02D478B358 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DF163A249A36AC2784 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083E42F9CB5BD8690C7 + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EE8180FE9A797EC9AE + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC79B3F92E764FCBF14 + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD36856A9C58A4A3F9CE49 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724B6BDF301440BD202 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87BCB7DEB6A782626F + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C09EAD34B242CB089 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A0140265918C4E00938 + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0576DE90136F5BE8C + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DB2235E149FDC3910 + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2EBF4DDA0F442045BA + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90D53E918A4E63F80EB + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAEE39BA97834930486 + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA25A16A0AA70B4B70E + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E9D1A21D3F2E5AAD17 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC822D98CBA09A571EC + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCEBA04D67D73C390A5 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870953FD55A49056E5B + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834FAFB5DEEA59CEAB82 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CF18055A4DD874254F + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E94AE09A31E0808ED + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7A4B889C610585201 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF4309B2C2BFEC65228 + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E32BDD18EC329C6399D + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087B5E2286C27404CBDE + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E6D4CBCC92A3E09D5 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EFD45B42B65F1176CD + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA0726160E7DA9917367B3 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761C1D006EC412D2B2B4 + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA0A43F97FA1AB9F025 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6BB5FF8FCD7CCDD54A + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E00CFA69FF002FAB8 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC447E78C2ED36DF7A8 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A5635F9B227553BF6A + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFEA90A0EF7B8D6D6A8 + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7EDA7BEE39CC8313FA4 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520FF8C5050B446FC99 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D7C2804E8B885E0238 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD20DF569F22E68D6C + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43F219EEE20964CE4A + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A0133B33FEE51D5572B95 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D02283E9B3712F88BF + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC0CE5155A0F9645C6B + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5C6F074C862CF2F3F1 + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF871C1A1FF32214107 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8CB0B454455035B6D1 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FFB963D9156A8C43B3 + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EEFAEFD8CB7F8B3C9 + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC854C81308A59473B9F8 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AD0146C6A6D39ECB6 + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D687019DC62C13DFC926615 + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F354E961E0B944BA299 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC55CF81E48D769DD75 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E734D4CCCD52CC4BDA8 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7432D51F8A2630FCA9B + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF4314F56A9B83B2EC5AD + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322B3B83F677805B5C52 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF5BE9B91BF4D3F874B + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F6F30B7CE495CB0DB + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50525B48AA6CA6B6EE + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA0726697D051E6F52CD4CEE + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAF132400EC7DA6842 + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA00690751D828A1C88BB + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A2F416C58E7ECB7FE + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85C8A5B608A8483E9D + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECE0CBBC3ED3C85274 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A59634938FBA4F81B79C + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50634ECF2E42AA754B + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D822811B3DBF59C43 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D171AB000DD180363C + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D6F4257855F2D4062 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D52F3E5BD9612A3 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D30BE6DC028AB49B65 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330C2ABF9DDD1970CA27 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BCDA73FDA35EAC01CB + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043DAB36A56DFB0FA93 + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF406D3A6BA3E250612 + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E9FBD4C2A9C96C4644 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5CD215255352F34475 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1C0040B6DB18668111 + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75CCFB2947DA54451 + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC854216F720CD09D64DD02 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC831431873054C8E8 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E0A5C50D1329CF29F + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F354985FA4D099EC1F87B + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501869C4E40824CB1CC + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E738428B882F9A66F9385 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C955CDBEE6C82AEA3 + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE22C7D00372EBF14F + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11866EAEDE64C26F1 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50CF1EA99B8FFB53E38 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5CF56C997A8961695B + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0E18577F7EF01652D + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE413D84EE0C8A6CF8 + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0253FF1159810B335 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA00649E6BB16A25499C5C5 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51601212A643A24106 + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F12FDE384AE8B0C073 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7A4A50DE9615061EE + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A59683807FDC8F2681021B + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A2213563ED37D4C086 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1300852086B32FF092 + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D1864A1B7135A11FE4BC + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D73729E97ACFA2E507D + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D1CC2F82D6AE48814 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D355A8020E38763949F9 + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAAFF1F267ACCDFBC88 + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC5682BF0A548E7FB67F + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6BAA3BADEFF51CAD4 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C22125D182997B53F + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96A3EFC1A6CC8AF8942 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B9D91A427588EBFB3 + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBA04F2357ED76F50E0 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF751E90049D79DF5A7BC + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A82F5831020831ABC8 + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356253061CEA1DFF4F + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E97711D1CC9F2A892C5 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EB1B73BD23D54AD01 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FCE33CFDF03E6D7561 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A39D14CBCC27E969E4 + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8917234473D94A3708 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71774E830B73A9C874 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11EC056F73CB97B24B2 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C33DD5BCCCEA2B0DE0E + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C89EC64BC3B316907DB + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BD5BA5F66713AABFE1 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33627175617DAE9B08 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0ECBA5480BB0F027EC8 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493D21196ED55326EE22 + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783E0513DFB7722666 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D46059A70B405F9544 + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F39DB3566168156690 + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CB3AA2F11426752DB + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BF67E48CC2A4BB361 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D13768593A93584B3E0AF + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B8750B7F2DA4D3E1B7 + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F634D98CBB7EF5249 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EE91D17643E82D67A + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592A8D1E33F6DE545D1 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA315CBDAD91A6A2EF19 + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569A8BE8D9B340F2B16A + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6883FDD156E56543C8D + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C6357F14EBF1D0DB105 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC5EE390C97BB4FF06 + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B48788023BB9F9B7943 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF8C4615BDE956DAC3D + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141FED5E4DE832FDD14 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85BFCD957DC673F72AC + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC3564C9C504BA9CE883B5 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F9195CBABCB549919 + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF9E9ED707A81379952 + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0D0E42E79928EE82AD + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A356DAFBB67CDAD01E44 + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918DA0926341FD32508 + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B795201BA4A7A68733 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E7B088F9863188DCA + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C339954B757FD36999004 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930162EE809E629B0C8 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE5A89BB0B1016C5775 + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BA2D06E9654520625B + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79A6C454DAE209F22B + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDC126F768D550ECFC4 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F31B923C2DAB24638 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493DFD5DF3D0AB8D4AD + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0819A0391A238A861 + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDAC4C159908C0109B1 + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6E2341FA28BF67D34 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376ADF001071668C1CDA7 + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89A3372F0E1BC33063D + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B3FC7FD5F28CCF7F2 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA38EA41AD787AD63AC + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C8A752309EF337AC62 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BCB2E1F6967B5062FC + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADCF6C5276AD762B678 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A4B0C4046B47B1C8B + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE6DE31E35CDFE4B01 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E53ED97B349AF2457 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845345035F34AA9DC54 + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DC4B3D032423D9141 + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141955850F789F6CF254F + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D102EC283513C9985 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473E2F7FF2146F1A82E + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F22C5F7E9176689197B + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C2A8BFD6EE2CF4773 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF72EA67C01E520FF8 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569EF339C29D5435CC38 + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A42C95233D6EEDAB96 + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E38B65C7AB9A338215 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E52FACDD7050C2E7CA1 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB8FEA03B3A9B34B59 + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F858EA99E32646460B + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568C82C07BF64EB5CBF + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA967295B984086CD12 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD652EFE688AF2FDCF + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC7F8CE7793E0E9D4C9 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9CD0A44D1F797D331E + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3A21AAB4F81464B62 + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B47ADF790731C61F1B + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE60A6A920C61B3CA3 + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC667AB78E7CCE1CFDEAE + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1B619FD50FA10762F6 + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB30CB7BD0739517929 + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B0066151B0869E00BEA + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31E4C336307E3210B33 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882E66C553EFFE114D3 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CCF1C49A4D2AA75FD + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC616B750740FD65D35F + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1C67ED77EC2DA9E735 + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4B7038AC693F62A585 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23820B426C60A21498 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A8EBC4D127DF6E2D76 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA87E0B881CEF0933D + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C95B8E37DBFD4C99D + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0BAD2146ECA4C2BA4C + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BD2742338F3B22E864 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C2B5DD0AA567CEFEB + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5135DCEAEA6E182E41 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C2DB65A32F0624E5 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F1B9B5E343C95FCFD + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F1BECAD23CAB19765 + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E38895C5DA9652975E9E + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E5254DBCD2077C3962F3B + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C369D6D01B45DFD5C + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABAED8940C120425FA + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE5683884E26A96702EDC8B + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C25213082E482054A + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85A38B07A21244047F + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797726F2B4716DD4FEC + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CE6404A3E1E6D6C21 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C303C8BA79AD21947201 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4AC17CA657E03C1421E + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE75B41869220B280308 + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AE1D77C4C09B6B0BD + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF41EF7E48B8963119 + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA19D62CC99D34EC0C + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00277AB30D018DEC19FA + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECC6DD338E21292C6B1 + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D2284176F4999E477C + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECA64672AF28E5DB70 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A4F13162C908E0D07 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC13553359276AB792C + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC029AF4AF598F9C32 + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A994EED83B03FCBBB1 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87FEB2F002799520716 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6DF47EE63F84CB5D4B + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11D3E83E4F925A1E7A + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B67FF8B3B39B72E4D5F + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5BFDAF21D4AE106AD + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F4C365C0B7AC8851B + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C51417DF764D65C036CDE + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C590CD12C8269DFB57 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408D852151CC5C094D + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72AF2885E332C04D99 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388247C8E0D1DD84C9155 + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E5254777757E28AA178411E + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8EEE76D3284D54DB6A + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDEB96721A582B2BECE + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386D48FC27A892FCCEFA + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4C4B8197247D1A3914 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E24A8BADA26CFCFF67 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797375CF23486FAD47C2B + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD07BC17870EE59FD78 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A8596BAE7483AE6BE + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC46A0B07F4FDE942FC + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590324082BF10D91D20 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA2E70A8D02EF328085 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF4097FF86E2B52276B4 + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA439AB31CFBFB42F6A3 + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276E376F763CCA334EA7 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE93ABE09579CBF2D4E + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D241C0F784AECBA87723 + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCFAD90552899895131 + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63DEE9CD062C9CB251 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC1122FDC56E14DB46DFB + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0F8AF68D8BDE0F4F83 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90BABFEC54F64DA032D + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E0E547C3C098BDAB2 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D807C1AEDEE7BB45AD4 + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B00E7FEC0B71118AD6 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B678880AF3486D71B0F3F + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F5335B3A3CAF3F977B + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F90ACF81B6D43DD8543 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AFDE0D4A0C36D61266 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D256A5B22EB3D2C19F + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408AAB06E65E2404B160 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A177EC32A7E6D25DC6 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241F29DBC946E14EB834 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C39CCAF15FD851C006 + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0ECD28A388E71F2CF7 + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5EBCCDEE8E9FAED491 + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0395DC0FD9A497CB9 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEF3D40C43E9A3E7272 + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E222DB8875E56703F585 + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797372050E2B1ECF5535D9D + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB82E62EE7F833D3C5 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A22EF38099FE4DA99 + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0F0FCE938D44939DF + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9451AA15BC7451D2F + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285A7C4BCF91D9427B2 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C878A54A4B2B963496 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346BD9A4B40A56C9051 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE5EBDFFD1415DEC21D + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE96600C26B4E64A14C94 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D2414704915BCB1C7619AE + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF796C27800113D5C8D6 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C63599A645097E03BA + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA493BB871293138DD + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0FBBBF56BBEDFFA5FD80 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90B0A9417B07987658754 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E793EED8119F5294C26 + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D80FE34260DBB3D43E2D0 + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B033748337011F82935F + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B678887E21AEA1BBA290306 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F554FFDE09B2F9A212CF + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F904529AC6067EBB65586 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AF4100D0A161A558DBA0 + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D244E8B8354DFA971996 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408A99D11FE88DE9CD787C + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A1E333DC31A1A922B333 + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241FBB16F57EC4DC958C10 + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C356A6AD9340D118F495 + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0EA8C292CBB803005F06 + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5ED1629B36E8042045B6 + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0274E9EC064EBE81B67 + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEFF4828ECE2F34249E1F + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E2223AA4C824C3AD05CDAC + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC7973720670BC056422ED80587 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB8E4AE3F5690A53654E + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A1EF8D60C0B6AFEFAC5 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0EC70DB2F83B3009C8C + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9ED0C8234A8001AD2CA + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285407668AC98C3AA9187 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C872C1B96A32FD96238D + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346B6D144B008FE38EB29 + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE5878C092DC985607A0E + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE966F2B9094831297783AF + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D24147121059DF2C80C5D72B + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF793C0CBB8EDA0BC11415 + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C679772EE41FC00956FF + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA615182E51B7747757A + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 6086FD0ABA4C32152E14DD2C02C935B6192707E9BC2E5CF41C63AE4BEC0FBB7085CFF47CEB861DB3 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 8011D3FD0C169C8CDD0147B36DB182B5C8DA2D86E90DF8E96AFC7E23A90B0A3CE901B8A4BF3ED486 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = 466B9C4B723D637B3B3CB75DDBBBD192765979B5CFAE8C5C6B4845A87F8E79E7EB3E933ED45BDAEB + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = 30D29B59184CC35613305230DCAF950B8D32AAC85FA2FF1CBAF82DCA6D80FEBFF72CF79FC7DA0744 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = EC0F17AD6212CFDE64D2613A6CA3FA035F30BC50A4E91EF75141951C11B033935291A28559774285 + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = DCF6A5F778C1B22DCF538E80F276971DE65C4197EEC85421A85B9D0B6788878684F56BA15165008C + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 27BC0CAED6970330453CC24AFD023C760BC30C2F0FCE8AFC356473BDE5F554631627745790FBCDF4 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 34E994B9A92889ACBD142E8603491615E48A410D6870192E976F229C5F904594B5155753549AD848 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = E22EC891050847B0235119F4D36D6168435CDE04834F35496EF94C5141AF41248AEEFA5724ACA6E5 + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 50D56FE1322FE161FFF37AC7DD8F3C2D419DA01B00CFC501FC0DDF80C5D244C5AEE2886E33F60B9D + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 5C2D3E4E078C3B4334C6D6C74DD3CAC6BB7D1D2EC42E7384A3569E2F408A99F38AC4164A2B9311B7 + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = A088BC716A6D73F023CE31307FADDD2DC67EAF906DA7434C8918A43F72A1E34FCE98E332683FEFBE + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = C3EA9A9F2C80C2E726F67529EDD2B94C103A4E805BF431BE71B7E388241FBB417C93A9ADE518C356 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = 6C2578D9553C8715DFEE6FCB11E7B59A575ADB3A8E322BC11E0E525477C3566C7375EBA1D47BB228 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = 93E437B0B92C51A237EAF92A066DFF4BC20A8AC7087BF50C3399DB1C8E0EA850B94E95932C2CAC87 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = B6F3C79C2BDD200037F30FDCD0AB8D3BC539D3E7778E5F5C8930F8ABDE5ED12C615557FD3A99A5FA + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = F097FA39582B10D46695BD85D24972B5CB124D2DF9EF50D0BDE568386DD0275442C9919B0EE020F7 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4681E9DC9DB7162772F18A889B7AEE96833FDFFA072669EE33BAA98C4CEFF403AE6F1993DF800AB5 + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 1EAED4ADC6B7B6259626814D845F3FE0E517A599761CAAA0EC79DD85E2223AA9F93282FCD877E52F + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 51485C4C552ED96417C98F2C4443F1E4D7CFE79BEEA006493DDCC797372067D1206016BE0CBF7F2A + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = C00FD82926D758841976A863A52B4F7DC0665F852E6B3A51783F9C8CD0BB8E6458DD03E1EF15E850 + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 2CEDFA6193D8962DE090A2807376837AA4A730B67B7E85F1D493C3036A7A1E82D07E5D4875514BCE + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 22D720C2846FC1F5411EA4B0878E2DAEEF0B5974DFC4ECA7F3F0B4ACC4D0ECCEAE91814DB706E7CE + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 30659887BE5B85E0610CA7AD913447641A05D73083A596836CDABE7590D9EDB8E2CBDF3141F4F9B4 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 5FAD251A58146498A90A3C028685A14D5F84B328EEFE50A29BC6671AA285409E92C5B97F4AFF062E + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 0F7A977A33CFC478F2E3A6DCF9E4EF387CF5657EC7ED0D1376AD1BFF40C8722A327440A033EB8BE1 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = 2D537DF3C1AD700A9045A20C4B2BCCC81A24DD368520D186B89AB3BA4346B6EBAB47D2AA4AB83C8D + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 5E2B22C44D3C909E4E6B09DECA77D9F9F59C402724D79D732F0B00276EE587C88B8334595A7B029A + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = E033558C731AA398D6CBC1A8D9AB3D3075D0B07B87FD792D9EA31ECCE966F2433DEF375ED956E790 + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = 52432829528CB944C1003263CA5F3213EF6930A06C43D35592C882D241471266AADDE33297EB0D8A + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 26C372ADDA7C71650F016E3BAC9120E363D15D8A01330CAA31BC2CECCF793C3171F7A2EAD9C83E07 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 906A5161511175DEABF485C829673B73116AB98AF0D0BC569ADC619A63C679DB25CC58A725295352 + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = 813CA1B8AA61E2A8E894860513AA80BB66BF73A54DC043D6882A1CC112CA61D1BC79FD0542453AA3 + diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.c b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.h b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/api.h b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/api.h new file mode 100644 index 0000000..1ee99ed --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 24 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/encrypt.c b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/encrypt.c new file mode 100644 index 0000000..62a5dde --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "tinyjambu.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_192_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_192_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu-avr.S b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu-avr.S new file mode 100644 index 0000000..c7f2d1c --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu-avr.S @@ -0,0 +1,471 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global tiny_jambu_permutation + .type tiny_jambu_permutation, @function +tiny_jambu_permutation: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r26,r24 + movw r30,r22 +.L__stack_usage = 18 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + lsl r20 + lsl r20 + mov r19,r1 +19: + movw r24,r4 + movw r16,r6 + mov r15,r3 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r22,r24 + eor r23,r25 + eor r28,r16 + eor r29,r17 + mov r14,r7 + mov r15,r8 + mov r24,r9 + mov r25,r10 + mov r0,r6 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r9 + mov r0,r8 + mov r17,r10 + mov r21,r11 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r11 + mov r17,r12 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r10 + movw r16,r12 + mov r15,r9 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r22,r15 + eor r23,r24 + eor r28,r25 + eor r29,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r8 + movw r16,r10 + mov r15,r7 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r2,r24 + eor r3,r25 + eor r4,r16 + eor r5,r17 + mov r14,r11 + mov r15,r12 + mov r24,r13 + mov r25,r22 + mov r0,r10 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r13 + mov r0,r12 + mov r17,r22 + mov r21,r23 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r23 + mov r17,r28 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r22 + movw r16,r28 + mov r15,r13 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r2,r15 + eor r3,r24 + eor r4,r25 + eor r5,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r12 + movw r16,r22 + mov r15,r11 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r6,r24 + eor r7,r25 + eor r8,r16 + eor r9,r17 + mov r14,r23 + mov r15,r28 + mov r24,r29 + mov r25,r2 + mov r0,r22 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r29 + mov r0,r28 + mov r17,r2 + mov r21,r3 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r3 + mov r17,r4 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r2 + movw r16,r4 + mov r15,r29 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r6,r15 + eor r7,r24 + eor r8,r25 + eor r9,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r28 + movw r16,r2 + mov r15,r23 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r10,r24 + eor r11,r25 + eor r12,r16 + eor r13,r17 + mov r14,r3 + mov r15,r4 + mov r24,r5 + mov r25,r6 + mov r0,r2 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r5 + mov r0,r4 + mov r17,r6 + mov r21,r7 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r7 + mov r17,r8 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + movw r24,r6 + movw r16,r8 + mov r15,r5 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r10,r15 + eor r11,r24 + eor r12,r25 + eor r13,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + dec r18 + breq 401f + subi r19,240 + cp r19,r20 + breq 5396f + rjmp 19b +5396: + sub r30,r20 + sbc r31,r1 + mov r19,r1 + rjmp 19b +401: + st -X,r13 + st -X,r12 + st -X,r11 + st -X,r10 + st -X,r9 + st -X,r8 + st -X,r7 + st -X,r6 + st -X,r5 + st -X,r4 + st -X,r3 + st -X,r2 + st -X,r29 + st -X,r28 + st -X,r23 + st -X,r22 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size tiny_jambu_permutation, .-tiny_jambu_permutation + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.c new file mode 100644 index 0000000..7f6fcf2 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-tinyjambu.h" + +#if !defined(__AVR__) + +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds) +{ + uint32_t t1, t2, t3, t4; + unsigned round; + + /* Load the state into local variables */ + uint32_t s0 = state[0]; + uint32_t s1 = state[1]; + uint32_t s2 = state[2]; + uint32_t s3 = state[3]; + + /* Perform all permutation rounds. Each round consists of 128 steps, + * which can be performed 32 at a time plus a rotation. After four + * sets of 32 steps, the rotation order returns to the original position. + * So we can hide the rotations by doing 128 steps each round */ + for (round = 0; round < rounds; ++round) { + /* Get the key words to use during this round */ + const uint32_t *k = &(key[(round * 4) % key_words]); + + /* Perform the 128 steps of this round in groups of 32 */ + #define tiny_jambu_steps_32(s0, s1, s2, s3, offset) \ + do { \ + t1 = (s1 >> 15) | (s2 << 17); \ + t2 = (s2 >> 6) | (s3 << 26); \ + t3 = (s2 >> 21) | (s3 << 11); \ + t4 = (s2 >> 27) | (s3 << 5); \ + s0 ^= t1 ^ (~(t2 & t3)) ^ t4 ^ k[offset]; \ + } while (0) + tiny_jambu_steps_32(s0, s1, s2, s3, 0); + tiny_jambu_steps_32(s1, s2, s3, s0, 1); + tiny_jambu_steps_32(s2, s3, s0, s1, 2); + tiny_jambu_steps_32(s3, s0, s1, s2, 3); + } + + /* Store the local variables back to the state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.h new file mode 100644 index 0000000..f3bc599 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-tinyjambu.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_TINYJAMBU_H +#define LW_INTERNAL_TINYJAMBU_H + +#include "internal-util.h" + +/** + * \file internal-tinyjambu.h + * \brief Internal implementation of the TinyJAMBU permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the TinyJAMBU state in 32-bit words. + */ +#define TINY_JAMBU_STATE_SIZE 4 + +/** + * \brief Converts a number of steps into a number of rounds, where each + * round consists of 128 steps. + * + * \param steps The number of steps to perform; 384, 1024, 1152, or 1280. + * + * \return The number of rounds corresponding to \a steps. + */ +#define TINYJAMBU_ROUNDS(steps) ((steps) / 128) + +/** + * \brief Perform the TinyJAMBU permutation. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform. + * + * The number of key words should be 4 for TinyJAMBU-128, 12 for TinyJAMBU-192, + * and 8 for TinuJAMBU-256. The TinyJAMBU-192 key is duplicated so that the + * \a key_words parameter is a multiple of 4. + */ +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-util.h b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.c new file mode 100644 index 0000000..09fc41d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.c @@ -0,0 +1,487 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "tinyjambu.h" +#include "internal-tinyjambu.h" +#include + +aead_cipher_t const tiny_jambu_128_cipher = { + "TinyJAMBU-128", + TINY_JAMBU_128_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_128_aead_encrypt, + tiny_jambu_128_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_192_cipher = { + "TinyJAMBU-192", + TINY_JAMBU_192_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_192_aead_encrypt, + tiny_jambu_192_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_256_cipher = { + "TinyJAMBU-256", + TINY_JAMBU_256_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_256_aead_encrypt, + tiny_jambu_256_aead_decrypt +}; + +/** + * \brief Set up the TinyJAMBU state with the key and the nonce. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to absorb the key. + * \param nonce Points to the nonce. + * + * \sa tiny_jambu_permutation() + */ +static void tiny_jambu_setup + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, const unsigned char *nonce) +{ + /* Initialize the state with the key */ + memset(state, 0, TINY_JAMBU_STATE_SIZE * sizeof(uint32_t)); + tiny_jambu_permutation(state, key, key_words, rounds); + + /* Absorb the three 32-bit words of the 96-bit nonce */ + state[1] ^= 0x10; /* Domain separator for the nonce */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 4); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 8); +} + +/** + * \brief Processes the associated data for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void tiny_jambu_process_ad + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, const unsigned char *ad, unsigned long long adlen) +{ + /* Process as many full 32-bit words as we can */ + while (adlen >= 4) { + state[1] ^= 0x30; /* Domain separator for associated data */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(ad); + ad += 4; + adlen -= 4; + } + + /* Handle the left-over associated data bytes, if any */ + if (adlen == 1) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= ad[0]; + state[1] ^= 0x01; + } else if (adlen == 2) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad); + state[1] ^= 0x02; + } else if (adlen == 3) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad) | (((uint32_t)(ad[2])) << 16); + state[1] ^= 0x03; + } +} + +/** + * \brief Encrypts the plaintext with TinyJAMBU to produce the ciphertext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the plaintext. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_encrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(m); + state[3] ^= data; + data ^= state[2]; + le_store_word32(c, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over plaintext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = m[0]; + state[3] ^= data; + state[1] ^= 0x01; + c[0] = (uint8_t)(state[2] ^ data); + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m); + state[3] ^= data; + state[1] ^= 0x02; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m) | (((uint32_t)(m[2])) << 16); + state[3] ^= data; + state[1] ^= 0x03; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + c[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Decrypts the ciphertext with TinyJAMBU to produce the plaintext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the ciphertext. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_decrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(c) ^ state[2]; + state[3] ^= data; + le_store_word32(m, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over ciphertext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (c[0] ^ state[2]) & 0xFFU; + state[3] ^= data; + state[1] ^= 0x01; + m[0] = (uint8_t)data; + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (le_load_word16(c) ^ state[2]) & 0xFFFFU; + state[3] ^= data; + state[1] ^= 0x02; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(c) | (((uint32_t)(c[2])) << 16); + data = (data ^ state[2]) & 0xFFFFFFU; + state[3] ^= data; + state[1] ^= 0x03; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + m[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Generates the final authentication tag for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to generate the tag. + * \param tag Buffer to receive the tag. + */ +static void tiny_jambu_generate_tag + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *tag) +{ + state[1] ^= 0x70; /* Domain separator for finalization */ + tiny_jambu_permutation(state, key, key_words, rounds); + le_store_word32(tag, state[2]); + state[1] ^= 0x70; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + le_store_word32(tag + 4, state[2]); +} + +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), c + mlen); + return 0; +} + +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), c + mlen); + return 0; +} + +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), c + mlen); + return 0; +} + +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.h new file mode 100644 index 0000000..cb304ff --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu192/rhys-avr/tinyjambu.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_TINYJAMBU_H +#define LWCRYPTO_TINYJAMBU_H + +#include "aead-common.h" + +/** + * \file tinyjambu.h + * \brief TinyJAMBU authenticated encryption algorithm. + * + * TinyJAMBU is a family of encryption algorithms that are built around a + * lightweight 128-bit permutation. There are three variants of TinyJAMBU + * with different key sizes: + * + * \li TinyJAMBU-128 with a 128-bit key, a 96-bit nonce, and a 64-bit tag. + * This is the primary member of the family. + * \li TinyJAMBU-192 with a 192-bit key, a 96-bit nonce, and a 64-bit tag. + * \li TinyJAMBU-256 with a 256-bit key, a 96-bit nonce, and a 64-bit tag. + * + * TinyJAMBU has one of the smallest RAM and flash memory footprints + * out of all the algorithms in this library. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for TinyJAMBU-128. + */ +#define TINY_JAMBU_128_KEY_SIZE 16 + +/** + * \brief Size of the key for TinyJAMBU-192. + */ +#define TINY_JAMBU_192_KEY_SIZE 24 + +/** + * \brief Size of the key for TinyJAMBU-256. + */ +#define TINY_JAMBU_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all TinyJAMBU variants. + */ +#define TINY_JAMBU_TAG_SIZE 8 + +/** + * \brief Size of the nonce for all TinyJAMBU variants. + */ +#define TINY_JAMBU_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the TinyJAMBU-128 cipher. + */ +extern aead_cipher_t const tiny_jambu_128_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-192 cipher. + */ +extern aead_cipher_t const tiny_jambu_192_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-256 cipher. + */ +extern aead_cipher_t const tiny_jambu_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_128_aead_decrypt() + */ +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_128_aead_encrypt() + */ +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_192_aead_decrypt() + */ +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_192_aead_encrypt() + */ +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_256_aead_decrypt() + */ +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_256_aead_encrypt() + */ +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/LWC_AEAD_KAT_256_96.txt b/tinyjambu/Implementations/crypto_aead/tinyjambu256/LWC_AEAD_KAT_256_96.txt index da8a6f7..4cb2726 100644 --- a/tinyjambu/Implementations/crypto_aead/tinyjambu256/LWC_AEAD_KAT_256_96.txt +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/LWC_AEAD_KAT_256_96.txt @@ -1,7623 +1,7623 @@ -Count = 1 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = -CT = 9B04ED416F7D7F56 - -Count = 2 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 00 -CT = A68D4C7689096558 - -Count = 3 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 0001 -CT = 3880832C55BA0EF7 - -Count = 4 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102 -CT = F5307A8F4B4BFE33 - -Count = 5 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203 -CT = 90F1ACE82C4C5FFE - -Count = 6 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304 -CT = E82AC228EAF98D94 - -Count = 7 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405 -CT = 7AF6934353AD254D - -Count = 8 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506 -CT = 63B7F14C5C681E40 - -Count = 9 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 0001020304050607 -CT = 8814394302B1901F - -Count = 10 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708 -CT = DC66CE621D36C24A - -Count = 11 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 00010203040506070809 -CT = 9DD9F8DCDC0F6165 - -Count = 12 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A -CT = 7687D515C16CEE99 - -Count = 13 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B -CT = B8ED0366A704D7E4 - -Count = 14 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C -CT = 60A22BF76CF44185 - -Count = 15 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D -CT = 369A942DC80F16ED - -Count = 16 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E -CT = 121A9D7408F04051 - -Count = 17 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F -CT = 9FA3D466AAB8BC6B - -Count = 18 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 4177B93AE777ADB5 - -Count = 19 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = 67959AA6AF28C5A6 - -Count = 20 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = 6A087031C9995ED0 - -Count = 21 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = FB6E584DD2A596A8 - -Count = 22 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = B3A766EDD05AD3A0 - -Count = 23 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 76D848A262B96F25 - -Count = 24 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = 29ED6E4DFE707CC0 - -Count = 25 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = 4BCB9F6307C96A80 - -Count = 26 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 3C54EB10929256DD - -Count = 27 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = CF230F2A9FBD0F24 - -Count = 28 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = 212854ADA5AA446B - -Count = 29 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = B63EB7F810A28E85 - -Count = 30 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E4F17DDD58E40356 - -Count = 31 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = CF4C5EE8A1492380 - -Count = 32 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 53383CA2EDEE2685 - -Count = 33 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A4FD9861FA427370 - -Count = 34 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = -CT = 0FE90A41B4AA18329F - -Count = 35 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00 -CT = 20BB303279C2739CE5 - -Count = 36 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001 -CT = A60656C46372BDB879 - -Count = 37 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102 -CT = B074F0F0641772E0EE - -Count = 38 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203 -CT = 02864A20E6A4E8114C - -Count = 39 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304 -CT = 9E299B7AE94760FA38 - -Count = 40 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405 -CT = 6A8B881C425EB74CFD - -Count = 41 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506 -CT = 724E19E116720B29A5 - -Count = 42 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 0001020304050607 -CT = 526AC5A7EC5FE2F42F - -Count = 43 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708 -CT = 5B3AAE5564D6DCFE3F - -Count = 44 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 00010203040506070809 -CT = 340B9802468C8EA7D2 - -Count = 45 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A -CT = C765E9EA500299C858 - -Count = 46 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B -CT = 168D3BD9526DDB9F14 - -Count = 47 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C -CT = DCBFA929C6DAA4D1E2 - -Count = 48 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D -CT = EAE6E94EE87928C691 - -Count = 49 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E -CT = 0E29CB3679E366CD95 - -Count = 50 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A0535B65102C7A0D6 - -Count = 51 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 941AE29048BCD1A3E8 - -Count = 52 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E457E766F6A756F429 - -Count = 53 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = AD323D860103C98504 - -Count = 54 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E93764D09B24C131B - -Count = 55 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 1073A7E2469106BEE5 - -Count = 56 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 69AACC5A8C97DC586C - -Count = 57 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFD33D2CA04CEB118D - -Count = 58 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD56459164860424C6 - -Count = 59 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 05B5EC226FFF3A023C - -Count = 60 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF79A6FD9C750C344A - -Count = 61 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BF69123485A336EE91 - -Count = 62 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 230C74CB413F722BBA - -Count = 63 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E6FC56D1D8A932CBA9 - -Count = 64 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 216D2620FCC132DD96 - -Count = 65 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8DCA3E92D8AD0502E4 - -Count = 66 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A56BA29045045FCC90 - -Count = 67 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = -CT = 0F1075ADA3038BE00F6A - -Count = 68 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00 -CT = 205E2DD6C39964302DAF - -Count = 69 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001 -CT = A65195C1435B597C827B - -Count = 70 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102 -CT = B0165691CA904D6390C6 - -Count = 71 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203 -CT = 0243154EA3A904831ADA - -Count = 72 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304 -CT = 9E82C787DEB87B1CA3D4 - -Count = 73 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405 -CT = 6AB2A099B55DE942D7B8 - -Count = 74 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506 -CT = 72DA2E26BE945B766CB0 - -Count = 75 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 0001020304050607 -CT = 52043487EE34C7A96FC5 - -Count = 76 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708 -CT = 5BF7AC9254A41D22691A - -Count = 77 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 00010203040506070809 -CT = 34661382DFF62ED5EFE6 - -Count = 78 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A -CT = C701ED12AE2FCB0F7904 - -Count = 79 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B -CT = 16A46E4FA23A6822BD4A - -Count = 80 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C -CT = DCC50FC817ABA427F4A7 - -Count = 81 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D -CT = EAA0FEEF7D1887506375 - -Count = 82 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E -CT = 0E869CC17F7FD6AD1D6A - -Count = 83 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A0566885B87F55AD476 - -Count = 84 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F86655CCB8DF5083D8 - -Count = 85 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A17B36AD8267E54133 - -Count = 86 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB16478A0BE79DEEAFE - -Count = 87 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BD06465A538686293 - -Count = 88 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FCD6206F9E610B812 - -Count = 89 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C5DA5E7503880816A - -Count = 90 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF1C373051F506FFD7C - -Count = 91 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD420DD6D10ABFCDD9A6 - -Count = 92 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051FD46CC4A526BD9E66 - -Count = 93 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01BCAAD0DAEED526A1 - -Count = 94 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE77E46536E9788893A - -Count = 95 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 23349F82B4AD0A46D4A1 - -Count = 96 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E6015FFAB0220BDDA68D - -Count = 97 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2113CB6AC00097F62E9E - -Count = 98 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D5781931A12CCD4AAC0 - -Count = 99 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A56211FA9ED75B0F17ED - -Count = 100 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = -CT = 0F10070E369864A55A251C - -Count = 101 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00 -CT = 205E492D78A4FA4A6C9201 - -Count = 102 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001 -CT = A6510CAA1FEA539122553D - -Count = 103 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102 -CT = B016860C5AB7B34E414FC3 - -Count = 104 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203 -CT = 02436519D7CCA944B3B67C - -Count = 105 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304 -CT = 9E821E88B61BE434ADB63B - -Count = 106 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405 -CT = 6AB222389667B8D7FC4679 - -Count = 107 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506 -CT = 72DAE4FAC605DAD671A9EC - -Count = 108 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 0001020304050607 -CT = 5204EEF9C19AC83330D7C5 - -Count = 109 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708 -CT = 5BF7E664604888C2664374 - -Count = 110 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 00010203040506070809 -CT = 34660D25E90784D2AE8695 - -Count = 111 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A -CT = C701B9C36F8FD9C1A16292 - -Count = 112 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B -CT = 16A417D2B1176EE88D83FE - -Count = 113 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C -CT = DCC52FE9867DE89CF20567 - -Count = 114 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D -CT = EAA069CF0984D14B067D7B - -Count = 115 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683CCD1965794154B30 - -Count = 116 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E91E1FF1644ECBAF4A - -Count = 117 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F92A2865DE8611EBB4 - -Count = 118 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D96D1ED02BD92B9419 - -Count = 119 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F0E52623A11EA14A20 - -Count = 120 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF033FF40EB51F19F3F - -Count = 121 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1370F267BB90DAE76 - -Count = 122 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82CB00D9B30718F74F - -Count = 123 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16C0F835051B8913ABA - -Count = 124 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429B37A3F08CD9313566 - -Count = 125 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4833F82B0EE0BDBB92 - -Count = 126 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A874DDB9FE92A48BF4 - -Count = 127 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE729E559EAB8A3B431FE - -Count = 128 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497B35E191D0068F9F8 - -Count = 129 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EEDE6DB97F76AB575A - -Count = 130 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 2113021A0A13C513FB52E6 - -Count = 131 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F2A099F7BF6195432 - -Count = 132 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DC91FF29114C09314 - -Count = 133 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = -CT = 0F10074860C726A4E8CC6C80 - -Count = 134 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00 -CT = 205E499F8BB004DA96D65AB7 - -Count = 135 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001 -CT = A6510C62F921B1AC06900D75 - -Count = 136 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102 -CT = B016869DAD339E5B06D25490 - -Count = 137 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203 -CT = 0243655595B82F3B398F3D96 - -Count = 138 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304 -CT = 9E821E2F984DA4ED9B58BFF7 - -Count = 139 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405 -CT = 6AB222DB8C273ADB8370C904 - -Count = 140 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506 -CT = 72DAE4B2308C21ACDE640ACF - -Count = 141 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 0001020304050607 -CT = 5204EE55218825B5715A2D77 - -Count = 142 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708 -CT = 5BF7E602EAA5B4A7400BF3A9 - -Count = 143 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 00010203040506070809 -CT = 34660D5E5F8CABA519B36B92 - -Count = 144 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A -CT = C701B9E9071899BE5D984616 - -Count = 145 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B -CT = 16A4179E45B8A67B45163A3E - -Count = 146 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C -CT = DCC52F22E9ECCC1C393413E2 - -Count = 147 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D -CT = EAA06990BDCB82563BB1BBE4 - -Count = 148 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E -CT = 0E868336ADA6E0447A4665B6 - -Count = 149 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F10BAE24D03BA26AD3 - -Count = 150 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F930F2F1B0D3E011E17B - -Count = 151 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC2D2DE43B01E8FB14 - -Count = 152 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076207D15F2B94F611A - -Count = 153 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC10C52B77099B2ECB - -Count = 154 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABF66591DA640FF7B5 - -Count = 155 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D5F88FADDAF3EB61DC - -Count = 156 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDE92B6447023A7E76 - -Count = 157 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAE45033A7CAFFEE2E3 - -Count = 158 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879E59DD30EEEDDCE20 - -Count = 159 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A810E2F3AE52F7E61547 - -Count = 160 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A537F1FB8732E1E0D - -Count = 161 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E5F8E2316CB8970CD8 - -Count = 162 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70CA6FF03AC7B1B448 - -Count = 163 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DE4905318F8DA86857 - -Count = 164 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F53F5F7782BAC8BF63F - -Count = 165 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF7C492F35658F9A981 - -Count = 166 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = -CT = 0F100748031AE7F1B014A5EDF7 - -Count = 167 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00 -CT = 205E499F3C73EB24C920771F1C - -Count = 168 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001 -CT = A6510C620A3ED7448D550BC955 - -Count = 169 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102 -CT = B016869D49CC7557D7E228F13E - -Count = 170 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203 -CT = 02436555E6A773134FAD6DF798 - -Count = 171 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304 -CT = 9E821E2FBD5F8968D189569388 - -Count = 172 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405 -CT = 6AB222DB94BAB061F13C1137EE - -Count = 173 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506 -CT = 72DAE4B2E148E6A21FCAFB7CE0 - -Count = 174 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 0001020304050607 -CT = 5204EE553EF3CBF057BE98CC51 - -Count = 175 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708 -CT = 5BF7E60280D60E51272DB4C772 - -Count = 176 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 00010203040506070809 -CT = 34660D5ED3D969B721F954C4F5 - -Count = 177 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A -CT = C701B9E9E0AEC6C184D6658AF1 - -Count = 178 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B -CT = 16A4179E941A01F07B61CF4223 - -Count = 179 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C -CT = DCC52F22BE3BA3CC09CAAA0F25 - -Count = 180 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049EA37A97D64B520D0 - -Count = 181 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360CC76312DED8369247 - -Count = 182 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE2AAE9FA41D5211D3 - -Count = 183 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F9308300CC90FBA985CEA9 - -Count = 184 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8E23447D0F8642F0E6 - -Count = 185 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6BBE4D6E17B0435C0 - -Count = 186 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FD122F03A5AAA9176 - -Count = 187 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC1C3611D4728A8F4AC - -Count = 188 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55E24A17FA4664C0E55 - -Count = 189 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEE75DD57C90DFE1226 - -Count = 190 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEED2AC0FD357B8D16AB - -Count = 191 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1624F8D3225D3B272 - -Count = 192 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A81021F6ECCBB58C47370C - -Count = 193 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2EC5A7A7AF984B7D89 - -Count = 194 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E65309CFB0A7A8356 - -Count = 195 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE7019F9DB25C2D47D4A45 - -Count = 196 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD32A1DBCE915E2620 - -Count = 197 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339A7D8B6C124B247CD - -Count = 198 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF7136D86C898E9C43A1E - -Count = 199 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = -CT = 0F100748039616C8E2D9C38C3814 - -Count = 200 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00 -CT = 205E499F3C9CD88D6F9B52FC3842 - -Count = 201 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001 -CT = A6510C620A4718C3E7508F3E85DB - -Count = 202 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102 -CT = B016869D4940B662AFE16A820E53 - -Count = 203 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203 -CT = 02436555E615B014970EE0B7B05F - -Count = 204 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304 -CT = 9E821E2FBD3ACB03EB86577113C1 - -Count = 205 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405 -CT = 6AB222DB94E65B0B7681C3D7B3A8 - -Count = 206 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506 -CT = 72DAE4B2E1465E071B69138172BA - -Count = 207 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 0001020304050607 -CT = 5204EE553EFCA33F8AB0811C7365 - -Count = 208 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708 -CT = 5BF7E6028053BAA9804646EB30E6 - -Count = 209 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 00010203040506070809 -CT = 34660D5ED37867E7F0C24C6384E0 - -Count = 210 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A -CT = C701B9E9E02D25F8AB39BF54CEA9 - -Count = 211 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B -CT = 16A4179E944254A117D162F6E921 - -Count = 212 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF04F34F40A9196BB8A - -Count = 213 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C1CF08D460DC79D23F - -Count = 214 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C6418B28073A6E6F75D - -Count = 215 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4C82CA20A9F22B659E - -Count = 216 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F280878D779E46D78D - -Count = 217 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5488FF5D3525452B2 - -Count = 218 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F6E7E004360F3664F8 - -Count = 219 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB7D77D810B563B6E03 - -Count = 220 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138708578A01E252EEC - -Count = 221 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB17247D494A6AA24B8 - -Count = 222 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB69DA1DBBE39D546BA - -Count = 223 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE39F4BDB997EF7870 - -Count = 224 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC724323DABF3E5165 - -Count = 225 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134D863D60F10169E43 - -Count = 226 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E96A26F493C3D8ECD - -Count = 227 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9837E66FD4252B78DF - -Count = 228 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194AADE41224EFC50DD9 - -Count = 229 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D966ABC09EFD18F1A - -Count = 230 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD1354F56D81343498 - -Count = 231 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D4155C63298F8587BC - -Count = 232 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = -CT = 0F100748039646BE64990F3F39532D - -Count = 233 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00 -CT = 205E499F3C9CBF5508F62E4539E0A7 - -Count = 234 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001 -CT = A6510C620A47703392B0F8235727AC - -Count = 235 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102 -CT = B016869D49402B328741104062810F - -Count = 236 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203 -CT = 02436555E615B68D70E215A296EF17 - -Count = 237 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304 -CT = 9E821E2FBD3AA3CFB6B5DB225884D1 - -Count = 238 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405 -CT = 6AB222DB94E65BA59797F6FA340FDB - -Count = 239 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506 -CT = 72DAE4B2E146FA9C4E84E869E4146A - -Count = 240 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 0001020304050607 -CT = 5204EE553EFC42FE0ED1C60D46E3CB - -Count = 241 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708 -CT = 5BF7E60280536A7A5CEE5F11838CB8 - -Count = 242 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 00010203040506070809 -CT = 34660D5ED378B67ED48DC756306B76 - -Count = 243 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A -CT = C701B9E9E02D3119BFC5D86BD66D4B - -Count = 244 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1B8431C1AB81A9031 - -Count = 245 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D4001CEC97B974959 - -Count = 246 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B00E994926B012E40 - -Count = 247 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7DFB41C92B4F35C4D - -Count = 248 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC79A7BF1D4EB9DD0A9 - -Count = 249 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D4BA635ADBA897FCE3 - -Count = 250 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE552A20C08F8CCB63CF7 - -Count = 251 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B093D6EBAFB5379EF - -Count = 252 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D4CFA6862919FDA35 - -Count = 253 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DFD9BE56EE216A50DF - -Count = 254 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED3BD75E4E0D7A14DA - -Count = 255 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68E2D5B1A0C25E1C25C - -Count = 256 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE9384499AA9510A619A - -Count = 257 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F110F160123457960 - -Count = 258 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE710255F7582E87A9 - -Count = 259 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4479BE7D4C78550DD3 - -Count = 260 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893446C81668AA00E51 - -Count = 261 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A9157E212BD6D0833CF - -Count = 262 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D9656C4A7CB622DC3C2 - -Count = 263 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD05EE2C20663965DDD1 - -Count = 264 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43154D9DB1027FEAF09 - -Count = 265 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = -CT = 0F100748039646FB79516E3A740611C4 - -Count = 266 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00 -CT = 205E499F3C9CBFE01BCBB35AFE03BE79 - -Count = 267 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001 -CT = A6510C620A47707389757FD3FE6E581A - -Count = 268 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102 -CT = B016869D49402B1A12CFA8044BF25CF5 - -Count = 269 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203 -CT = 02436555E615B6F7ECA412138E1C7D10 - -Count = 270 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304 -CT = 9E821E2FBD3AA328FE74C863F0BE6B83 - -Count = 271 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405 -CT = 6AB222DB94E65B1A2F40EC8A7D4C6E9C - -Count = 272 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506 -CT = 72DAE4B2E146FAE0C29F42C9C6D5C912 - -Count = 273 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 0001020304050607 -CT = 5204EE553EFC426969677172EE4D4698 - -Count = 274 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AA9373EEE153E766 - -Count = 275 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB471F6BD10AEBE171 - -Count = 276 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A -CT = C701B9E9E02D3128864EFC1455C29942 - -Count = 277 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F28AB64F265690851B - -Count = 278 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A0476213163917FFC - -Count = 279 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B604C5A358F627E7CF6 - -Count = 280 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FDCD6C679A3CE0694C - -Count = 281 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC785AF537859665199FC - -Count = 282 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D4511C5294D508CF8595 - -Count = 283 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523D70C3DD1046B1047F - -Count = 284 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B818BF77A1C53952CC7 - -Count = 285 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5ADFC36FAB850FF2F8 - -Count = 286 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9508CC0DC4F6483A10 - -Count = 287 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83E7DFAFE897AB37F3 - -Count = 288 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE2DB0CCD5F76013F0 - -Count = 289 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADC0BE1D1D090B5466 - -Count = 290 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F074C4701726B8CC786 - -Count = 291 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2D4B30917799E19839 - -Count = 292 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E44179EE5130B243CC89A - -Count = 293 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FC77D337B9A53E7FFB - -Count = 294 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D090862238E2D9C1B - -Count = 295 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D9638A30B0E4F0E9D9236 - -Count = 296 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574B79ABF7F66A75FE4 - -Count = 297 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 0001020304050607 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D4316218A127FC09046F81 - -Count = 298 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = -CT = 0F100748039646FB86A636270B90BC63D6 - -Count = 299 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00 -CT = 205E499F3C9CBFE00438B6BA106C5508FD - -Count = 300 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001 -CT = A6510C620A477073C1BAC3DC9600C63F2A - -Count = 301 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102 -CT = B016869D49402B1AC7825D5C9FA92C82D0 - -Count = 302 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203 -CT = 02436555E615B6F7BCBC61595021AB86DF - -Count = 303 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304 -CT = 9E821E2FBD3AA32831EE233BDA625506F8 - -Count = 304 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405 -CT = 6AB222DB94E65B1A9D70D1676190A7E1FA - -Count = 305 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D9951A3A7D9643D72 - -Count = 306 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9CF863591D30BC4E5 - -Count = 307 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708 -CT = 5BF7E60280536AC6ADD01DB7AA08C5BA5D - -Count = 308 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB486B69A4CC0A81F741 - -Count = 309 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A -CT = C701B9E9E02D312865DAD982FF31C4677E - -Count = 310 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E39B6847306C5B610 - -Count = 311 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7918A22B1CF6D9FF91 - -Count = 312 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053112FCB1C1F71869C - -Count = 313 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD952852C856C9285DEA - -Count = 314 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857EF320EA76D8E1B7A8 - -Count = 315 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D45161EC5DE88CF7CEAD83 - -Count = 316 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB542DE00D66D25C1C1 - -Count = 317 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B810562627C47FF958536 - -Count = 318 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A799DF682E710EF88F4 - -Count = 319 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510F79769653B51106E - -Count = 320 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F99E68C05CDF0D44F3 - -Count = 321 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE829467B991DB8616B4 - -Count = 322 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFFB8F427C9BD41F47E - -Count = 323 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F07237FBB09C42B32D816 - -Count = 324 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5B91713E7081082BB - -Count = 325 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2239AEBBC8255EE49 - -Count = 326 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB805A4CE73BE179328 - -Count = 327 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FFD3F86A4E66C7085 - -Count = 328 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BC7D33B1FC6F252E - -Count = 329 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A75003AF8057015E78 - -Count = 330 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E8F1E55AF5EEA90EFA - -Count = 331 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = -CT = 0F100748039646FB86A6A1C2F43DF3BCF54A - -Count = 332 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00 -CT = 205E499F3C9CBFE00433EBF8878670CA6E78 - -Count = 333 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001 -CT = A6510C620A477073C19FC9143B3003737C18 - -Count = 334 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102 -CT = B016869D49402B1AC77AB1D5215694F82F01 - -Count = 335 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203 -CT = 02436555E615B6F7BC673BA6F212DA47327E - -Count = 336 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304 -CT = 9E821E2FBD3AA32831174F7163226186E0F6 - -Count = 337 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC1916A506844DDFBE - -Count = 338 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D27714D7CA4D6206096 - -Count = 339 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E931FA0B0EE5483A35 - -Count = 340 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B9526FF6C79D47351 - -Count = 341 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342C879372E6CB5078 - -Count = 342 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A -CT = C701B9E9E02D312865753DA00DE50B5CF310 - -Count = 343 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E047728A1CCCE827D05 - -Count = 344 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A79446C36958A7E5EE3FB - -Count = 345 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B605358F08D5C367F54E3C7 - -Count = 346 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D210B768B87FF0FEB8 - -Count = 347 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E8079E1A6B661130482 - -Count = 348 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A692B460DA22A3138 - -Count = 349 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58C8B8B2A50ED6CE095 - -Count = 350 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E951F4A8784FC07E65 - -Count = 351 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796EAD3CD1409A5002E8 - -Count = 352 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510633F8FADFA8F9FA00F - -Count = 353 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94AA53C2F1098A0E4F9 - -Count = 354 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820C0C5763B35139F8D2 - -Count = 355 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44AA8B44C68E3A49CB - -Count = 356 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F072349F4EB237BE075A409 - -Count = 357 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABE6849B336BC6B1E7 - -Count = 358 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2567366506AE2CCC479 - -Count = 359 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895F678CB551FC0FD4C - -Count = 360 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2D6969CA8B6D32192 - -Count = 361 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BC08A7EB0AD489E142 - -Count = 362 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A7568C29BC54DC7A66FD - -Count = 363 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 00010203040506070809 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E82462C9F11B02173555 - -Count = 364 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = -CT = 0F100748039646FB86A69E0C2F9D551FCB883A - -Count = 365 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00 -CT = 205E499F3C9CBFE00433379F3AC0D6A750B54A - -Count = 366 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001 -CT = A6510C620A477073C19FB7ED115459C0F0026C - -Count = 367 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102 -CT = B016869D49402B1AC77A5BCDA92EE95A456B14 - -Count = 368 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203 -CT = 02436555E615B6F7BC677351ABF15320F93B4B - -Count = 369 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304 -CT = 9E821E2FBD3AA32831178A4B81C3C2DFFD0601 - -Count = 370 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC06A6D2C256FF0256C2 - -Count = 371 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BE73B7DE89D2524F0 - -Count = 372 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E6D481A340D7E1281 - -Count = 373 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63CC1E116A37CF0F31 - -Count = 374 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342A7D34AA1C68A8710C - -Count = 375 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8D8F181DAD80BC83E - -Count = 376 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E0401EC614493D5E193A9 - -Count = 377 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944128A78592041267B5A - -Count = 378 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583BB33083EF74D0377E - -Count = 379 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29B5891111DF3095986 - -Count = 380 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1FEE4F6589F52E1DC - -Count = 381 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A30D6BC9797DEAF0F87 - -Count = 382 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC07342059AE23E94C1 - -Count = 383 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1927349B67B21274C - -Count = 384 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9FD39DD3FA5701804F - -Count = 385 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D289E97D6409B8036 - -Count = 386 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DD028FF73C73EB56D - -Count = 387 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6C91D1ADA0402E053 - -Count = 388 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CBF228FF5C731D1E37 - -Count = 389 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493BAD739B540A5EB1F6 - -Count = 390 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4206B9ED197C16DE1 - -Count = 391 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569BDF6913D341FF5850 - -Count = 392 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC3509DEC20D2BFA3B - -Count = 393 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC274CB6E60AC138122B6 - -Count = 394 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD2DC83AE390507B1F2 - -Count = 395 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D911BEC9E48D887BF7 - -Count = 396 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6FE3A7449E9B818CA - -Count = 397 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = -CT = 0F100748039646FB86A69E9C2C3744A6F38F7CB1 - -Count = 398 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00 -CT = 205E499F3C9CBFE0043337A3C6EFA78B46F84A09 - -Count = 399 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001 -CT = A6510C620A477073C19FB7AE717020332CC09E99 - -Count = 400 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102 -CT = B016869D49402B1AC77A5B52C8D53D41446A4F55 - -Count = 401 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203 -CT = 02436555E615B6F7BC6773D16F42219321BB75BD - -Count = 402 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC7410B7BD852B7D14A - -Count = 403 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F59C250A4B1FD2FF2 - -Count = 404 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB6C32B1B943CE72A7 - -Count = 405 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E136083090A93A6D478 - -Count = 406 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A6972E34FBE30C973B - -Count = 407 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADF59F42E38915DEC53 - -Count = 408 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F85361D6AD94714D19 - -Count = 409 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015081C242CFE03F0000 - -Count = 410 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124D86A23CF0528E1C47 - -Count = 411 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B6494BFB30B9747171D - -Count = 412 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9BE1118642459A637 - -Count = 413 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB238D5140B0690147 - -Count = 414 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D606BC510AAFD25CB - -Count = 415 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09CBB92E904C4021FEF - -Count = 416 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CFC3BDE3D33F484EDA - -Count = 417 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67EA9A8772FEC1C52C - -Count = 418 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86CB338D2DC3C3EF20 - -Count = 419 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAF76969C1403AAE5FB - -Count = 420 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A329C20E7C03AD43CD - -Count = 421 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7FE0FEB12BCB1746C7 - -Count = 422 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B1344D900C7675B9E19 - -Count = 423 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB444954A060F13121582 - -Count = 424 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B0055F5041FBDEAC659 - -Count = 425 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9DF3EAAF7FC222104F - -Count = 426 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747CC43BBDCD81BD3595 - -Count = 427 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257A7CEA1BE780BF5B9 - -Count = 428 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D95114670183874A9906 - -Count = 429 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E620E146EA48AFB36714 - -Count = 430 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = -CT = 0F100748039646FB86A69E9CBC8C7A508E794CD8DB - -Count = 431 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD2D2BDB261CBC5CCF - -Count = 432 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001 -CT = A6510C620A477073C19FB7AEA545D30030A65010E8 - -Count = 433 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102 -CT = B016869D49402B1AC77A5B524474F132D57E6FF23D - -Count = 434 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5DBF5270FA325514F - -Count = 435 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74F63C2F286E5F670BF - -Count = 436 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2AB392864928375712 - -Count = 437 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB44EA180B44BF8875E0 - -Count = 438 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB9C22265044CC8BB5 - -Count = 439 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623F56BC6C894713DF6 - -Count = 440 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA655D0726B047DC56C - -Count = 441 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B31E3C03141BE785C5 - -Count = 442 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E040150617DF31F75C95CB45F - -Count = 443 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFAC010041FCD1AA204 - -Count = 444 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E14D14238BDC7DAD1 - -Count = 445 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CD635BF41AB02F7D50 - -Count = 446 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB608C844100D036B285 - -Count = 447 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D40C343845B67207015 - -Count = 448 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C56C71A248EC3BDB72B - -Count = 449 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9ADA76C457AC04EDC1 - -Count = 450 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FCB5590B56FA1D600D - -Count = 451 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86421E8E99BB850AB764 - -Count = 452 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE27D304315A8D2F748 - -Count = 453 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DBB17C705E24F9BF16 - -Count = 454 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F106FB2CDB07AAE887A - -Count = 455 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC814B1890D658BBF7 - -Count = 456 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB44499051AE511EA52AC90 - -Count = 457 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD7A591B274426012B - -Count = 458 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19B58F1C72B9798BE9 - -Count = 459 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EDC7C96D831AB2C79 - -Count = 460 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD25743E3CD50D330F58FF4 - -Count = 461 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC0A4CD3AED7F6B735 - -Count = 462 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B10D856C400C54B13 - -Count = 463 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = -CT = 0F100748039646FB86A69E9CBCAB50FAA298860E9A2A - -Count = 464 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20B2311BC64D8C16CB - -Count = 465 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A8F4BEF7D23BDAEA9 - -Count = 466 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102 -CT = B016869D49402B1AC77A5B5244E31EAAA2CB95F6C311 - -Count = 467 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B52109155DE0A1B0ADF9 - -Count = 468 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3EADC7DA31BC41741 - -Count = 469 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A65AE4E0688C764D215 - -Count = 470 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442FF3D2434D314B17FD - -Count = 471 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A9C9CC1635F2F82D7 - -Count = 472 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C29919372BDD5DFE9D - -Count = 473 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA66072F36C46EE126380 - -Count = 474 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C9C3F07D49F0B72942 - -Count = 475 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E08A6415B965C5E015 - -Count = 476 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194F0FA58B05B385A2 - -Count = 477 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E335CA7E099EB713190 - -Count = 478 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE408452097B07CCC73 - -Count = 479 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5DD8747DC129E5855 - -Count = 480 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D4030552EFC637F429C3D - -Count = 481 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569B6A4DA1066585B0AB - -Count = 482 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD3B9C7876EA4585EBF - -Count = 483 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC093C4E8F200F95F11E - -Count = 484 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D8642924AD909819C9EAEFC - -Count = 485 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE2559FC87D00EB20BE04 - -Count = 486 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EDC4D33A08B16F715 - -Count = 487 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F1008A7E6A56A42C1188F - -Count = 488 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC5861727E4E9D248C10 - -Count = 489 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB44499928B09C1FA68E16AC0 - -Count = 490 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD658EF7FFFADD36CB64 - -Count = 491 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F141D57793D7B3A235 - -Count = 492 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEBA5D08F41CAA7BE99 - -Count = 493 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD25743881B906508D1210854 - -Count = 494 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09743D4FDCBABE4ED7 - -Count = 495 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B37D38B090C695A4701 - -Count = 496 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = -CT = 0F100748039646FB86A69E9CBCAB409B3E586F84B2864F - -Count = 497 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD2011B6D5E37780566617 - -Count = 498 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A225FFB120634585A9F - -Count = 499 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F28E762450FD936374 - -Count = 500 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E261451262BFD7B7C - -Count = 501 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7D1AFA6C1EEDFC8A8 - -Count = 502 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F5E82C1DF3A2268F1 - -Count = 503 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F92964DCEDC6BE3F8AD - -Count = 504 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8BEDE50B72C63B919C - -Count = 505 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D86D1EC39ECCA543CD - -Count = 506 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FA1C3089934E3BD3DE - -Count = 507 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957E1D6E6413831ECF4 - -Count = 508 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F32BA53352D8EB3C15 - -Count = 509 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AE7DFE47E8C41E723 - -Count = 510 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332F4AA18223DC32186 - -Count = 511 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B48B55424EB6CA544 - -Count = 512 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F78DCFA9CA4B70C68F - -Count = 513 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D4030237DCB981C1AC8A9ED - -Count = 514 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA93BAD4880265ADAE1 - -Count = 515 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306FA990AC75F268D0D - -Count = 516 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094FD124E30CDE300BEF - -Count = 517 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D864292237ED69D6FD0B7CD35 - -Count = 518 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536B85FB19027886757 - -Count = 519 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB28B1008C56C62E3AE - -Count = 520 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F10080705EF333DBDCCDCFA - -Count = 521 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF9942A32C806CEBA4 - -Count = 522 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB444999276BDBE24A17B30D0DD - -Count = 523 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657307443CA61512755D - -Count = 524 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F19783B2669B78003087 - -Count = 525 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62148F64CC9B1901EA - -Count = 526 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830650617D5DF7A29BE - -Count = 527 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09272FC74C0AE7261E24 - -Count = 528 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373BA51896A185511560 - -Count = 529 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = -CT = 0F100748039646FB86A69E9CBCAB4023DE6691495106D12C - -Count = 530 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FEE2A34FEF586DC59 - -Count = 531 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A184339D58E51F0BB1 - -Count = 532 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F291F605E654AF15FB76 - -Count = 533 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B2F03CADB88627244 - -Count = 534 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7AC99736969DFB69EBE - -Count = 535 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9B94009DEEC84D6EC9 - -Count = 536 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A324C8CE5FAB5BE26 - -Count = 537 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AA2A4AB90C0DADFBD - -Count = 538 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808B96FAD4189844527 - -Count = 539 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD00D4DB513521BA23 - -Count = 540 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D6D149056C63D950FA - -Count = 541 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393D2FA021340FB88FB - -Count = 542 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFADEDDE4DBC59EC89A - -Count = 543 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332980F99DF9930028BEB - -Count = 544 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3EA633026F4930DEAC - -Count = 545 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E27B9E516D4BF4BB1F - -Count = 546 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F50D84D5DFD1B1DC5B - -Count = 547 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D7BD83A00E8544C82 - -Count = 548 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306010047CE3478C0EB06 - -Count = 549 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F605BEE4C5C2F42BDD3 - -Count = 550 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D4EDE545C708C57FD8 - -Count = 551 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A133AEC4F458357175 - -Count = 552 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24BD8B492194BC84984 - -Count = 553 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D6FB3286B795D45E67 - -Count = 554 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D01E10C0044BEF64F - -Count = 555 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB44499927607016E7FDA447CDC37 - -Count = 556 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD6573156190FA54DB599FE3 - -Count = 557 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A17B587F350264B34F - -Count = 558 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E0C01E3B435DD81828 - -Count = 559 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BD6F9CA939E582CE23 - -Count = 560 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F66994D616F6AA6F2 - -Count = 561 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B99BC5D40218A8E21E0 - -Count = 562 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236FC69D252567A24A60 - -Count = 563 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF7FED7DAEA01E7581D - -Count = 564 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A11546EBA33DA1AF92B4 - -Count = 565 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137A1010A2007036C97 - -Count = 566 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7CD6334E04488C4512 - -Count = 567 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4BA657EA74039CF31 - -Count = 568 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC00E01E3BBB9FFE65 - -Count = 569 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F8DBEFD27D6BF6738 - -Count = 570 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4E3A400697FC95E0E - -Count = 571 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C39468CFDDBC1D0030 - -Count = 572 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D310979DA25C87F17 - -Count = 573 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A22FAF24BD8446E5E - -Count = 574 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F3937522C6CF52CCED26D3 - -Count = 575 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB28EBFEC74F931236 - -Count = 576 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E333298856B85CA53E6804CEC - -Count = 577 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4D0A133F87586184A1 - -Count = 578 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CC3D7827C6BBC04960 - -Count = 579 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FACBFCC2057AC05954 - -Count = 580 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4E9BDB6925CC78E7C9 - -Count = 581 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD30601776C9CC7029243DA78 - -Count = 582 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F6060B984D5510B9CAD4D - -Count = 583 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47EEFFF54A24B61DB75 - -Count = 584 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E0EDF6D0ADCD2C1E5E - -Count = 585 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B19F1AD68FC69CDC893 - -Count = 586 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600E1610FD61C82DCE3 - -Count = 587 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84837F8811D5B8C70F - -Count = 588 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB44499927607798A59E9A49099EBAF - -Count = 589 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3DE332E2F6EB8D293 - -Count = 590 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147620E5CDC93AAC3ED - -Count = 591 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037C034C1E613AD765E - -Count = 592 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBEEF9A7BB03B5279A3 - -Count = 593 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F40422D00E890467571 - -Count = 594 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B9972EC19B4FCC386C983 - -Count = 595 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40578FB7F924F2B33B - -Count = 596 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF7415856021F5BFB7BF7 - -Count = 597 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F29861B6106F078D4 - -Count = 598 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA1979541ED31007FE - -Count = 599 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C280FD330ABA5994A63 - -Count = 600 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F1E2ABE3936C8FAC7A - -Count = 601 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34DB79B142D9222548 - -Count = 602 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F225F28E83BCFEB97A9 - -Count = 603 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F05346C8CAE361AF88 - -Count = 604 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E7B03DB21BE6B48D4 - -Count = 605 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D96539BCBC552D1A213 - -Count = 606 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C1AB819F780C7D434 - -Count = 607 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E7EA7537B77D883E7 - -Count = 608 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB06508AA2D8A0213A9B - -Count = 609 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E333298855821A6616B78728FA9 - -Count = 610 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63DED2E6FD54BC661 - -Count = 611 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC3F2061CFF429C9B1 - -Count = 612 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55BBE5858668E9DB28 - -Count = 613 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE76C9CECB380C3D969 - -Count = 614 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD3060177838A11A679889E15DA - -Count = 615 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F60601997899AAA2D69D8D5 - -Count = 616 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E102488EE8E37259192 - -Count = 617 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065FC00ED745680003D - -Count = 618 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B19462544EC1FAD9B4CB2 - -Count = 619 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D60027B7D0983FE728D18C - -Count = 620 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F66637A78B7A98C57C - -Count = 621 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F69C1AC2AB7FB0DE79 - -Count = 622 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C343454DBEC38CC6BFB0 - -Count = 623 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE79E20F5718062891 - -Count = 624 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F3E0E16F3DB9A692FB - -Count = 625 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE2318330A78713FDFEE - -Count = 626 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F9B1B3ABBDA0DB44F - -Count = 627 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247A4AC1E77649EC024 - -Count = 628 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F4019581697DFF3979112 - -Count = 629 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A07AF44CA41F2E621D - -Count = 630 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8D6A06B9A536A5A6DE - -Count = 631 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA46795FAABF7501688F - -Count = 632 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28547C1D546D740B8934 - -Count = 633 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F13462CD0FF1BAEA8A90 - -Count = 634 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1CC0358CEA9B56BEE - -Count = 635 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E7E38334DE311C62FA - -Count = 636 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E2B53C1B55F2B25C06 - -Count = 637 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E211BE83B7BC86A1A6A - -Count = 638 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966094D42DEAFE857FBB - -Count = 639 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2BE511CA19DABC7D25 - -Count = 640 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E933D6E44A5D3F0B345 - -Count = 641 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A0BD9738E3CC21548 - -Count = 642 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3F390F9147E378EB7 - -Count = 643 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63CECB756378A1941C0 - -Count = 644 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8FFE21097C5699AE30 - -Count = 645 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C51098A2D5C49719D2 - -Count = 646 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700FD0E2FD469B88EA6 - -Count = 647 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3AD61658A87DB2F93 - -Count = 648 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CD9E407F48BFD3490A - -Count = 649 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109DDB052DB166CC2C07 - -Count = 650 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C5D187370908C0C650 - -Count = 651 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B194694F771C9E87B1881AE - -Count = 652 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D95F39D83F3C07EBA - -Count = 653 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F616B2AE6B4939099487 - -Count = 654 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647499E10DD6965917D - -Count = 655 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438FC2FFFB15C7C921CF - -Count = 656 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE504CC2B0BA184DFA41 - -Count = 657 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F3301151A560E6F83427 - -Count = 658 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E921A6FE17D2FF5B68 - -Count = 659 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F30D8B6BB0DCBC7F3FD - -Count = 660 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA16E281786E7A6829 - -Count = 661 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F1AAA3BB9934ED9EA - -Count = 662 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6609FEE194CEB6BCE - -Count = 663 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC5D76A03BAFF540E67 - -Count = 664 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA46912A8C8F51C8DD222D - -Count = 665 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C285483981430655F6DEA00 - -Count = 666 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E2348873D2AFF12FA8 - -Count = 667 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F4E36FFDADAA67C954 - -Count = 668 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76A25BE1D7E8AC9A592 - -Count = 669 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26E56081B40790C661D - -Count = 670 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECB05DF9127F28AC0D - -Count = 671 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D9660883551650422516AF3 - -Count = 672 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F927A3C7E4C000D29 - -Count = 673 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C2A9DEF5596714E376 - -Count = 674 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A092DA56D8BB67B3BAB - -Count = 675 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC4966C1D31AF4F90 - -Count = 676 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C197B09B94B582B613C - -Count = 677 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3EF9D69A5EFC36D40E - -Count = 678 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518F1F16337B5FD61CD - -Count = 679 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E15358246CBEDD69AE - -Count = 680 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3005954F324CC5B64AE - -Count = 681 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9DC4348CCEB9204E5 - -Count = 682 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D79DFB644150973E749 - -Count = 683 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568164E28DFFDD0E8F0 - -Count = 684 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940DEDAEF7867EDB4FB5 - -Count = 685 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D353945B9C84B25DAFD - -Count = 686 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646F88F6AF6A9D6C5B6 - -Count = 687 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2C58C199B75198DF0 - -Count = 688 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F9427FCAE95941E69AC - -Count = 689 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F71C8273484867EAEF - -Count = 690 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E551405F21BA3F8AF2 - -Count = 691 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F244A152EDC54B495F - -Count = 692 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C911D2A597E05D123 - -Count = 693 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3A74F303FF9D5ABA55 - -Count = 694 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F033020081A761B0474 - -Count = 695 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F773AFE8C3C2DF15DD - -Count = 696 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56DE67127FA06213BDA - -Count = 697 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DEFF26E375A3680B84 - -Count = 698 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C2854833020C16E4455D4083D - -Count = 699 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29EF0572ABDEE862126 - -Count = 700 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453F304CCA07A2779E6 - -Count = 701 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD930F34B2834CE6A2A - -Count = 702 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE5075976EAAB75F93 - -Count = 703 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCF69D8FC5D4F3D0099 - -Count = 704 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D96608801B4D689A4AD4C674B - -Count = 705 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26E58FAB017936778D - -Count = 706 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25DEC0E45A191DF7BB2 - -Count = 707 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A0934FABAF7A6BC921D9B - -Count = 708 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC05B0A9A1633B1DA90 - -Count = 709 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F9AB0032C9473E5 - -Count = 710 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E75D048EEE5D5B9439B - -Count = 711 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C48962BCEF70781C75 - -Count = 712 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14AEE9A79A992F51332 - -Count = 713 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F30036B033B71BF4786493 - -Count = 714 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA989C32ADE7D2D218C47 - -Count = 715 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793D1197F7D2433D0741 - -Count = 716 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C56889C492585464141B23 - -Count = 717 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D58EE69413DCD77E9DE - -Count = 718 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35962CF7C08645D2088C - -Count = 719 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF9C7179438DC4EDCB - -Count = 720 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E201F18A5D13070AB1D7 - -Count = 721 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A004667EA85CAED4B6 - -Count = 722 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73DFAE67A8999C9F926 - -Count = 723 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E51359CCA6B7DF60F005 - -Count = 724 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F2887D71328214A138EB - -Count = 725 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D096B7EE0F35E18A - -Count = 726 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD5A5FCC3E326DD540A - -Count = 727 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030FBCD8EA24E9379BA8 - -Count = 728 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F345B13DCE454BB320 - -Count = 729 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D73A23220CA7293E52B - -Count = 730 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1D1FC8FEE133E04902 - -Count = 731 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D78E4BB5B83D6F6752 - -Count = 732 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B7CF8304BFA36668E - -Count = 733 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD12BAE5B24755A562 - -Count = 734 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D42D9132845A3AB355 - -Count = 735 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4DD606F49F65D1D213 - -Count = 736 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE7A6295BED54213AE1 - -Count = 737 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018617F2A919AF27C50E - -Count = 738 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD9703B0C4150C0821 - -Count = 739 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20782D015949B79A1A - -Count = 740 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348AD17A770C947F7D36 - -Count = 741 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC069AAAD74F3D8B1F1A4 - -Count = 742 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F84D58C8ED75F7F36 - -Count = 743 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F8EF3C50C0AD9C109 - -Count = 744 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C3B37A63E6155F2B37 - -Count = 745 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A55155757EE1E074A - -Count = 746 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F30036103D1315C1DA117A44 - -Count = 747 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA989271EA54AAB6A5B7631 - -Count = 748 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDC810665808A695908 - -Count = 749 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A5B19294DF2366A04 - -Count = 750 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F2755727727B5E75F - -Count = 751 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F151611BDC94FB3BA - -Count = 752 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF92D0368F69E891A298 - -Count = 753 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B4E9E63F492777625 - -Count = 754 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012AEA0099378801B01 - -Count = 755 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D7450A58F079F3F7074 - -Count = 756 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E51378CB5763943B12CBB4 - -Count = 757 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F288522260E5AE7907F5B2 - -Count = 758 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D449845C61B5ADB443 - -Count = 759 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513A1A30316855BB7CA - -Count = 760 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97F47F9753935CC4DE - -Count = 761 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CC47DCDD41181641 - -Count = 762 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E0FF8E54F7242C974 - -Count = 763 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE774E2C99AA7CF835D - -Count = 764 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E4785D802756B03B0E - -Count = 765 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B10512827B5C7D22876 - -Count = 766 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D5F03EF7B1178087A - -Count = 767 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D400BFE36143CCD6DF0E - -Count = 768 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4850552E154385D903 - -Count = 769 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70BA23301E4C71ADD53 - -Count = 770 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D9660880186190A27D633F452EF43 - -Count = 771 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD2894887023B3EEA1D9 - -Count = 772 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E194149DB85AE3177C - -Count = 773 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29BA77E724D15518F8 - -Count = 774 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC069400B64A555737E9E80 - -Count = 775 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B5054E7B37543A14D - -Count = 776 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19D83F19C5C21D6490 - -Count = 777 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C312BFD5D8FA489E5585 - -Count = 778 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A511231424C19E12C8C - -Count = 779 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3003610679C6430205682021D - -Count = 780 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA98927861AD40A8E591CA61A - -Count = 781 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF14BAD346AF8AC5DBF - -Count = 782 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1714D399C483CBA4E0 - -Count = 783 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F1572F2822594179260 - -Count = 784 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2E6EB3BE91848A7681 - -Count = 785 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BF3F545A9CD7CDFE1 - -Count = 786 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1D0301550CAC708248 - -Count = 787 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B948B6C0CC84146096 - -Count = 788 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2AF16C15F3DAC4B43 - -Count = 789 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E513787630D80920CC8FF680 - -Count = 790 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BA3BC71A4124C31308 - -Count = 791 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DE5E0C0B6BED783FF - -Count = 792 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AA8513EA8C621FFD - -Count = 793 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BC500DBD0096552B5D - -Count = 794 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB1285B57935E13FD2 - -Count = 795 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D03704125F3E28546 - -Count = 796 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F64348CD49C2D2FF9E - -Count = 797 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45318A57A78F59F661D - -Count = 798 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088D52AAFFAC1CB1716 - -Count = 799 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D10DCF3C12E6AE79238 - -Count = 800 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038467FAC14FB337C89 - -Count = 801 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D48604D091A71B589E332 - -Count = 802 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B972282EC65195C9022 - -Count = 803 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F3C84360520DE8A648 - -Count = 804 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2C316F0E9A8F6095F - -Count = 805 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16AEC0B8B1535B09C82 - -Count = 806 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2576A800D90CA07B0 - -Count = 807 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4BC0452D525897013 - -Count = 808 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1535435F041AE5644B - -Count = 809 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA208CB3949B882DEA - -Count = 810 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C312968974D7CAF149AB3B - -Count = 811 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A5187F94E1EFBEE71BC19 - -Count = 812 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CF8D99898B61C295C4 - -Count = 813 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EAF89CF74F8F1FFC9B - -Count = 814 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F066DD8D5E85378253 - -Count = 815 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739BF102CD50083E2A6 - -Count = 816 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D2296CE1ADB445F8EE - -Count = 817 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDACAABFCC12ECE913 - -Count = 818 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA885D2D690B3E6D4CC - -Count = 819 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFEFB5289408CE89AA - -Count = 820 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B9943D9F3845867C04DB - -Count = 821 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B51E7A67AAEB5D2978 - -Count = 822 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAB9352CF105E6BBBC - -Count = 823 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACB9F0DF06E49EC540C - -Count = 824 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF09EA1B5880C331E78 - -Count = 825 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F1011121314151617 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE1E8D5EA4713298D4 - -Count = 826 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB3CE31434D1329B20 - -Count = 827 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42F32F9D381A23DA94 - -Count = 828 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D4922AE729074988A8F - -Count = 829 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6565503503D1DA35213 - -Count = 830 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E453803C9E3644E2F3FA01 - -Count = 831 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB80A3F95C530358CB - -Count = 832 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D1069E55E4E3D6CEF4D20 - -Count = 833 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BAEE808A7C6CF45DD6 - -Count = 834 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E57F921F89850AA198 - -Count = 835 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B97424BD52A58C4084395 - -Count = 836 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F3754D482F0A939CBE0D - -Count = 837 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD3BD07DB05C517625 - -Count = 838 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53EBB5B9C8B17A6CE2 - -Count = 839 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CC2236DF2D5DF1ADB3 - -Count = 840 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A46820EEC7DFF4B9A372 - -Count = 841 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B15036D3B7BA1B9DBE123 - -Count = 842 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DF772AA105896CC04 - -Count = 843 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296ED38159876CAA02112 - -Count = 844 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A51873502E2717361B37B79 - -Count = 845 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD687E445F54E6A082D - -Count = 846 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4ABE38751D87F15DF9 - -Count = 847 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0ADA2980C18B509B84B - -Count = 848 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBCA132E1BBD92C78C - -Count = 849 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258D749AFB3795F33F8 - -Count = 850 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFD1AC1C36CAA74918 - -Count = 851 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF5F95A6496213F3C1 - -Count = 852 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDBCD295355BFD5AF1A - -Count = 853 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2084533FAF34E5476 - -Count = 854 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F4001B5D784BDC6633 - -Count = 855 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF2FA65C582BE1F90D0 - -Count = 856 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8EB3A4CD0CC27752A - -Count = 857 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF0899EEE98CD2294B8FD - -Count = 858 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34A850B4C33C0AC835 - -Count = 859 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB724D8910B7BA768E73 - -Count = 860 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232FD206577F8F4AD3C - -Count = 861 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D4964A0F4987DBE6FF007 - -Count = 862 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566FC684BF9D4084EC60 - -Count = 863 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B62141ED5166709123 - -Count = 864 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B19123F7E5F7FCECF - -Count = 865 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D1069277602D852A6F376E3 - -Count = 866 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FA4DF041FE70A21C - -Count = 867 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E24FDD5300B227697B - -Count = 868 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C8D7A8420AD826C806 - -Count = 869 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F454A3C45EA77B96CF - -Count = 870 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD51D5C610EBA4647573 - -Count = 871 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53166323C88DD74C4275 - -Count = 872 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD03DDFA02EF4CCFBC3 - -Count = 873 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F7C1502485C9627A4 - -Count = 874 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FBB1DFF94FBF7AB270 - -Count = 875 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD6855D2C1454474F8C - -Count = 876 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC01286A79ADA5400D0 - -Count = 877 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D2E511BF33FF524210 - -Count = 878 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D35CAC793E82980D53 - -Count = 879 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37775B3B5C89036755 - -Count = 880 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD034487F392ED9748CD - -Count = 881 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBCE5093114FCA7D68E - -Count = 882 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A36FC03F9CEDBFA77F - -Count = 883 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB04179DA99F8F2927 - -Count = 884 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF491367ED90F816D56A - -Count = 885 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79D5CFB2FED9DE4382 - -Count = 886 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A13EC565533CD311F0 - -Count = 887 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45032E4B021B4C09188 - -Count = 888 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244C621AE49479BDAA9 - -Count = 889 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2A47CDF2959907B6A - -Count = 890 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996562F303CB09939E6 - -Count = 891 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE3486C8BA2E8F1A63CD72 - -Count = 892 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A2250A9EEDA1AD756 - -Count = 893 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232901C332E210D9E1094 - -Count = 894 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430A1DCF2269A48A90F - -Count = 895 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F2097A7E1BCE97C86AE - -Count = 896 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B6213210F57A91B06CA1 - -Count = 897 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B1138F2EF1345387F61 - -Count = 898 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C5696EFE35E9E1896A - -Count = 899 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB02584DF964EF5F01 - -Count = 900 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E2536BE287CF1DA14848 - -Count = 901 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82D2FAF07993AC5A7F7 - -Count = 902 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41EEB1CA230A592D0CF - -Count = 903 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A090C2F66908F24ED - -Count = 904 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169FEA7E35A24C607281 - -Count = 905 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040452492ED3696DF45 - -Count = 906 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F869B3B0FA0F52E5C4C - -Count = 907 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9667D98BFB96E85285 - -Count = 908 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD623E9B190503926B3CD - -Count = 909 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C768ED7BE1445D7B5 - -Count = 910 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D2760F9E1087CD3B6B14 - -Count = 911 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D3651B4A41D564D3C038 - -Count = 912 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37244906442A5713954B - -Count = 913 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314DF5A834054E98CBE - -Count = 914 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC14DC03B9E7CEDE7C0A - -Count = 915 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DBF49FF0F5E369A72C - -Count = 916 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6FE656F6BC61F66405 - -Count = 917 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490DAACE9CDD5BC0FF0B - -Count = 918 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCF9DC4D0E3E62533F - -Count = 919 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A129B91052111E7ECE52 - -Count = 920 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087FB7FBE9CD9C849C6 - -Count = 921 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244364529C5C27FB01BC5 - -Count = 922 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C26963EACCE9E4B03D47 - -Count = 923 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7375434035F7C6C95 - -Count = 924 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863FC6E3A843557EF7CB - -Count = 925 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ABCEE258EA906DA71 - -Count = 926 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42329054BA599318AAD91B62 - -Count = 927 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C95C281910DD822609 - -Count = 928 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F34636975609CA175 - -Count = 929 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B1D3675EE2A34EE448 - -Count = 930 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DA164994B965BAB92 - -Count = 931 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519F42193A83F632512 - -Count = 932 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB9028585FD92BCB55E5 - -Count = 933 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253519DC6E2DA94F90E00 - -Count = 934 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB856A8B053A764E995 - -Count = 935 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DB4F403BF3884B3C6 - -Count = 936 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C4A233DC8F99739AE - -Count = 937 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F928148249962D7520A - -Count = 938 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F50F5BB6DDE6C24AA1 - -Count = 939 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F867057601527F87410AF - -Count = 940 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB96228262160A3CD52EB5 - -Count = 941 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD6231191E9A09AC001BEF8 - -Count = 942 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C93404788FC26E055E9 - -Count = 943 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CDF793F03727D02701 - -Count = 944 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D561D3412CF2428C44 - -Count = 945 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C57E9670A1069FA52 - -Count = 946 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314AD264FA201C8BBF536 - -Count = 947 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC143866DB8C6961EF25DD - -Count = 948 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1010E5F67734A220DD - -Count = 949 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87D4976B5CCC6BEF40 - -Count = 950 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4DEC56358E1A041CEE - -Count = 951 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BBCB951B0F3B28FB - -Count = 952 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A6B939CCFD0D5BF6B - -Count = 953 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F450873730AF94FFF8CC276D - -Count = 954 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F0AECEFCB9859D67A - -Count = 955 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FB736461FA6B8AB11 - -Count = 956 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0E8994BFD66F248D7 - -Count = 957 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F0393BC69FED0BA89CC - -Count = 958 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA0B7D4047B15AAD6F - -Count = 959 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42329054316ABBAFB9E4974EE7 - -Count = 960 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C9418DF611ACA8983115 - -Count = 961 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F910DF2A6B6C760AC45 - -Count = 962 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18D39A7EBBB280F1606 - -Count = 963 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDE9BA142A4025D7100 - -Count = 964 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C5193074F377A16ECA9B4D - -Count = 965 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A59B7492E1EB30AC11 - -Count = 966 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516ECA3B633E83D60ECE - -Count = 967 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83BF4A147A583349395 - -Count = 968 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBAE25958C81B169E11 - -Count = 969 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C8533289C13B63DAD31 - -Count = 970 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F9205A595C5631C7FD2DF - -Count = 971 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F41C8A2D0A5733B90 - -Count = 972 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700EBDF385A1D9EAEA77 - -Count = 973 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622420D7F9E7A0534BE97 - -Count = 974 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311975F5E0514F9B6B807 - -Count = 975 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935D7A7573943468CBF4 - -Count = 976 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29082912405E3FD0E3 - -Count = 977 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D508B50ED23A0A87A7B7 - -Count = 978 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3BEA674E1C034FEE41 - -Count = 979 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB008308C2454CAE149 - -Count = 980 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC14386093A51C79B14E2317 - -Count = 981 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023738A28DAE01200E1 - -Count = 982 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BFC05537298A33E0E1 - -Count = 983 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D881E4829FC24149CAD - -Count = 984 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BAF97AC6787AE481BE - -Count = 985 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A97A0B58088F23805E5 - -Count = 986 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F450873780CF2316BEF20722EA - -Count = 987 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F75E19421AA01EA0E8A - -Count = 988 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA7ED1E5CE64B773ECA - -Count = 989 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0440AECD1B3586BB301 - -Count = 990 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EAFBE9709E0C1A0938 - -Count = 991 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6B143B0AEF84328F81 - -Count = 992 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E462AD039A5AD19A83 - -Count = 993 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA8792685028591D01 - -Count = 994 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917CC6C79D53C9A1BB6F - -Count = 995 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC1B8381F197E89FF3 - -Count = 996 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB0B79955F41804F8D2 - -Count = 997 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F86DE0B756796B4A1 - -Count = 998 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F0CA6EA7E9BAEECB74 - -Count = 999 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3DCC2764921D6931E3 - -Count = 1000 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2EE24B6027001324AB - -Count = 1001 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA444DA91F946F413C22 - -Count = 1002 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C858261C5D099A8EB1140 - -Count = 1003 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F92053494DBCB03854C1245 - -Count = 1004 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F064A30AB949E987C1C - -Count = 1005 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2CCBF38676A53AED3D - -Count = 1006 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FFCB836DA52C3D92B - -Count = 1007 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AE14B17ADCC679EE2 - -Count = 1008 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA385136D7AC737593F - -Count = 1009 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BAAFF4B7F0B56C093B - -Count = 1010 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D508336D9D599C02D1659E - -Count = 1011 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39E699C09EEA254C76 - -Count = 1012 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E4D809AAD1038F1EC - -Count = 1013 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603D1DBCA61EACF9D4FA - -Count = 1014 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC6DFD63392AF61A13 - -Count = 1015 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D2AFD449557A4CC33 - -Count = 1016 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872FC59D10E2700E048 - -Count = 1017 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA906FE1F1897E2EC8F2 - -Count = 1018 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978BDEF3EF6CBC7C5352 - -Count = 1019 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F4508737804939477EBAAD33A322 - -Count = 1020 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F750995D728A1F05A0415 - -Count = 1021 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA7909598CA0AE405F3F7 - -Count = 1022 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BECB59D81B49BEDFF - -Count = 1023 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA74C94657D342F518 - -Count = 1024 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6BD738040A94DBE6F683 - -Count = 1025 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E48B1E1FCBA710F58646 - -Count = 1026 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA9B868E88FD2FD9C3EB - -Count = 1027 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917C34D9BD7E168834010A - -Count = 1028 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC65903DD27920663C9D - -Count = 1029 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB04326D779C2F20CB9B5 - -Count = 1030 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F72EAE0BAF5504C71F9 - -Count = 1031 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F070142D4DE733FE8EA9 - -Count = 1032 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3D99C7E6E2610AD1390B - -Count = 1033 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2E567FEBBC61CEA25164 - -Count = 1034 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA448D5A41FB8899F65CFE - -Count = 1035 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C85824BE68469789500120A - -Count = 1036 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F920534B3503B401FEDCFC12C - -Count = 1037 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F064911CC128B3AEDC5EA - -Count = 1038 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2C374EE18FA3986279BA - -Count = 1039 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FEA46DCBCEBC215745D - -Count = 1040 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AF97A56D838FC4F5C7B - -Count = 1041 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA3E00AC0F835B6EBB0FF - -Count = 1042 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BADF3C0A8B47F38463C0 - -Count = 1043 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D50833C89DC18F915F801488 - -Count = 1044 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39A458EED32A0FE5DED1 - -Count = 1045 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E5F1FEA39A5FF9E9E19 - -Count = 1046 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603DF0E52F97A4291B521E - -Count = 1047 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC42CFFBAF6CD2277684 - -Count = 1048 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D5DEE3C130BF18B7A70 - -Count = 1049 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872A5DF58A473D233DA86 - -Count = 1050 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA90002163D163FD8ED0AD - -Count = 1051 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978B360869B1DCC51E0F51 - -Count = 1052 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087378049FEB8C77D04B0D532BE - -Count = 1053 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F7509EF8675EA7CBEB083D7 - -Count = 1054 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA790A58D535EE2C64EA11F - -Count = 1055 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BA559E7A54670CCCB7A - -Count = 1056 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA21A84D85352EC7CFCF - -Count = 1057 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = -CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6BD743D699983303890EB7 - -Count = 1058 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00 -CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E48B5A09161FDA4734B439 - -Count = 1059 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001 -CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA9BAE1A444025616E1BD6 - -Count = 1060 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102 -CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917C349E36583337C30D7E94 - -Count = 1061 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203 -CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC65AA30E70B427C2437AE - -Count = 1062 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304 -CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB043F95604E4CC0B6C71DB - -Count = 1063 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405 -CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F7291C529EDB492B30D57 - -Count = 1064 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506 -CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F0705903C1DB1139F32A53 - -Count = 1065 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 0001020304050607 -CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3D99423B447E8279690ADD - -Count = 1066 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708 -CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2E56DFC9AF7D62F0306DBE - -Count = 1067 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 00010203040506070809 -CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA448DF663DA804C4B09343F - -Count = 1068 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A -CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C85824BCF900461DF10E094BC - -Count = 1069 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B -CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F920534B3BFA38A450C66E979B2 - -Count = 1070 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C -CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F0649819C00B92F01B424D5 - -Count = 1071 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D -CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2C377BE8FEC58C75A47F28 - -Count = 1072 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E -CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FEA5D8EC4E2E501BD6FBC - -Count = 1073 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F -CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AF9A376E20BC87B39E464 - -Count = 1074 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10 -CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA3E0665468B0F679912FCE - -Count = 1075 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011 -CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BADFD4477EE4C491D46434 - -Count = 1076 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112 -CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D50833C8846270F53316E8851E - -Count = 1077 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213 -CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39A4E74814EBDD448D00CF - -Count = 1078 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314 -CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E5FBD7048941C680CC7CC - -Count = 1079 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415 -CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603DF0462565092F0C307009 - -Count = 1080 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516 -CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC4250677244490885DB92 - -Count = 1081 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F1011121314151617 -CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D5D99D441AE08D4410987 - -Count = 1082 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718 -CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872A511FEEE8EA4B36B42F3 - -Count = 1083 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 -CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA90007D97D707696F56A765 - -Count = 1084 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A -CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978B364C9289384827ED2BC6 - -Count = 1085 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B -CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087378049FE3EF9914808464DFA2E - -Count = 1086 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C -CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F7509EFF3C523D43BFE946663 - -Count = 1087 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D -CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA790A51C949AEC36B55C0508 - -Count = 1088 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E -CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BA56CD12AD5F04F9AE05A - -Count = 1089 -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -Nonce = 000102030405060708090A0B -PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F -CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA21545FB318EE9CACC3BB - +Count = 1 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = +CT = 9B04ED416F7D7F56 + +Count = 2 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 00 +CT = A68D4C7689096558 + +Count = 3 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 0001 +CT = 3880832C55BA0EF7 + +Count = 4 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102 +CT = F5307A8F4B4BFE33 + +Count = 5 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203 +CT = 90F1ACE82C4C5FFE + +Count = 6 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304 +CT = E82AC228EAF98D94 + +Count = 7 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405 +CT = 7AF6934353AD254D + +Count = 8 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506 +CT = 63B7F14C5C681E40 + +Count = 9 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 0001020304050607 +CT = 8814394302B1901F + +Count = 10 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708 +CT = DC66CE621D36C24A + +Count = 11 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 00010203040506070809 +CT = 9DD9F8DCDC0F6165 + +Count = 12 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A +CT = 7687D515C16CEE99 + +Count = 13 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B +CT = B8ED0366A704D7E4 + +Count = 14 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C +CT = 60A22BF76CF44185 + +Count = 15 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D +CT = 369A942DC80F16ED + +Count = 16 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E +CT = 121A9D7408F04051 + +Count = 17 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F +CT = 9FA3D466AAB8BC6B + +Count = 18 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 4177B93AE777ADB5 + +Count = 19 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = 67959AA6AF28C5A6 + +Count = 20 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = 6A087031C9995ED0 + +Count = 21 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = FB6E584DD2A596A8 + +Count = 22 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = B3A766EDD05AD3A0 + +Count = 23 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 76D848A262B96F25 + +Count = 24 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = 29ED6E4DFE707CC0 + +Count = 25 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = 4BCB9F6307C96A80 + +Count = 26 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 3C54EB10929256DD + +Count = 27 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = CF230F2A9FBD0F24 + +Count = 28 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = 212854ADA5AA446B + +Count = 29 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = B63EB7F810A28E85 + +Count = 30 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E4F17DDD58E40356 + +Count = 31 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = CF4C5EE8A1492380 + +Count = 32 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 53383CA2EDEE2685 + +Count = 33 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A4FD9861FA427370 + +Count = 34 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = +CT = 0FE90A41B4AA18329F + +Count = 35 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00 +CT = 20BB303279C2739CE5 + +Count = 36 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001 +CT = A60656C46372BDB879 + +Count = 37 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102 +CT = B074F0F0641772E0EE + +Count = 38 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203 +CT = 02864A20E6A4E8114C + +Count = 39 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304 +CT = 9E299B7AE94760FA38 + +Count = 40 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405 +CT = 6A8B881C425EB74CFD + +Count = 41 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506 +CT = 724E19E116720B29A5 + +Count = 42 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 0001020304050607 +CT = 526AC5A7EC5FE2F42F + +Count = 43 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708 +CT = 5B3AAE5564D6DCFE3F + +Count = 44 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 00010203040506070809 +CT = 340B9802468C8EA7D2 + +Count = 45 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A +CT = C765E9EA500299C858 + +Count = 46 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B +CT = 168D3BD9526DDB9F14 + +Count = 47 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C +CT = DCBFA929C6DAA4D1E2 + +Count = 48 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D +CT = EAE6E94EE87928C691 + +Count = 49 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E +CT = 0E29CB3679E366CD95 + +Count = 50 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A0535B65102C7A0D6 + +Count = 51 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 941AE29048BCD1A3E8 + +Count = 52 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E457E766F6A756F429 + +Count = 53 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = AD323D860103C98504 + +Count = 54 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E93764D09B24C131B + +Count = 55 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 1073A7E2469106BEE5 + +Count = 56 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 69AACC5A8C97DC586C + +Count = 57 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFD33D2CA04CEB118D + +Count = 58 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD56459164860424C6 + +Count = 59 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 05B5EC226FFF3A023C + +Count = 60 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF79A6FD9C750C344A + +Count = 61 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BF69123485A336EE91 + +Count = 62 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 230C74CB413F722BBA + +Count = 63 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E6FC56D1D8A932CBA9 + +Count = 64 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 216D2620FCC132DD96 + +Count = 65 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8DCA3E92D8AD0502E4 + +Count = 66 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A56BA29045045FCC90 + +Count = 67 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = +CT = 0F1075ADA3038BE00F6A + +Count = 68 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00 +CT = 205E2DD6C39964302DAF + +Count = 69 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001 +CT = A65195C1435B597C827B + +Count = 70 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102 +CT = B0165691CA904D6390C6 + +Count = 71 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203 +CT = 0243154EA3A904831ADA + +Count = 72 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304 +CT = 9E82C787DEB87B1CA3D4 + +Count = 73 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405 +CT = 6AB2A099B55DE942D7B8 + +Count = 74 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506 +CT = 72DA2E26BE945B766CB0 + +Count = 75 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 0001020304050607 +CT = 52043487EE34C7A96FC5 + +Count = 76 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708 +CT = 5BF7AC9254A41D22691A + +Count = 77 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 00010203040506070809 +CT = 34661382DFF62ED5EFE6 + +Count = 78 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A +CT = C701ED12AE2FCB0F7904 + +Count = 79 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B +CT = 16A46E4FA23A6822BD4A + +Count = 80 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C +CT = DCC50FC817ABA427F4A7 + +Count = 81 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D +CT = EAA0FEEF7D1887506375 + +Count = 82 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E +CT = 0E869CC17F7FD6AD1D6A + +Count = 83 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A0566885B87F55AD476 + +Count = 84 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F86655CCB8DF5083D8 + +Count = 85 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A17B36AD8267E54133 + +Count = 86 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB16478A0BE79DEEAFE + +Count = 87 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BD06465A538686293 + +Count = 88 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FCD6206F9E610B812 + +Count = 89 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C5DA5E7503880816A + +Count = 90 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF1C373051F506FFD7C + +Count = 91 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD420DD6D10ABFCDD9A6 + +Count = 92 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051FD46CC4A526BD9E66 + +Count = 93 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01BCAAD0DAEED526A1 + +Count = 94 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE77E46536E9788893A + +Count = 95 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 23349F82B4AD0A46D4A1 + +Count = 96 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E6015FFAB0220BDDA68D + +Count = 97 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2113CB6AC00097F62E9E + +Count = 98 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D5781931A12CCD4AAC0 + +Count = 99 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A56211FA9ED75B0F17ED + +Count = 100 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = +CT = 0F10070E369864A55A251C + +Count = 101 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00 +CT = 205E492D78A4FA4A6C9201 + +Count = 102 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001 +CT = A6510CAA1FEA539122553D + +Count = 103 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102 +CT = B016860C5AB7B34E414FC3 + +Count = 104 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203 +CT = 02436519D7CCA944B3B67C + +Count = 105 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304 +CT = 9E821E88B61BE434ADB63B + +Count = 106 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405 +CT = 6AB222389667B8D7FC4679 + +Count = 107 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506 +CT = 72DAE4FAC605DAD671A9EC + +Count = 108 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 0001020304050607 +CT = 5204EEF9C19AC83330D7C5 + +Count = 109 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708 +CT = 5BF7E664604888C2664374 + +Count = 110 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 00010203040506070809 +CT = 34660D25E90784D2AE8695 + +Count = 111 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A +CT = C701B9C36F8FD9C1A16292 + +Count = 112 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B +CT = 16A417D2B1176EE88D83FE + +Count = 113 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C +CT = DCC52FE9867DE89CF20567 + +Count = 114 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D +CT = EAA069CF0984D14B067D7B + +Count = 115 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683CCD1965794154B30 + +Count = 116 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E91E1FF1644ECBAF4A + +Count = 117 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F92A2865DE8611EBB4 + +Count = 118 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D96D1ED02BD92B9419 + +Count = 119 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F0E52623A11EA14A20 + +Count = 120 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF033FF40EB51F19F3F + +Count = 121 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1370F267BB90DAE76 + +Count = 122 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82CB00D9B30718F74F + +Count = 123 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16C0F835051B8913ABA + +Count = 124 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429B37A3F08CD9313566 + +Count = 125 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4833F82B0EE0BDBB92 + +Count = 126 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A874DDB9FE92A48BF4 + +Count = 127 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE729E559EAB8A3B431FE + +Count = 128 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497B35E191D0068F9F8 + +Count = 129 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EEDE6DB97F76AB575A + +Count = 130 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 2113021A0A13C513FB52E6 + +Count = 131 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F2A099F7BF6195432 + +Count = 132 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DC91FF29114C09314 + +Count = 133 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = +CT = 0F10074860C726A4E8CC6C80 + +Count = 134 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00 +CT = 205E499F8BB004DA96D65AB7 + +Count = 135 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001 +CT = A6510C62F921B1AC06900D75 + +Count = 136 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102 +CT = B016869DAD339E5B06D25490 + +Count = 137 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203 +CT = 0243655595B82F3B398F3D96 + +Count = 138 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304 +CT = 9E821E2F984DA4ED9B58BFF7 + +Count = 139 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405 +CT = 6AB222DB8C273ADB8370C904 + +Count = 140 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506 +CT = 72DAE4B2308C21ACDE640ACF + +Count = 141 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 0001020304050607 +CT = 5204EE55218825B5715A2D77 + +Count = 142 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708 +CT = 5BF7E602EAA5B4A7400BF3A9 + +Count = 143 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 00010203040506070809 +CT = 34660D5E5F8CABA519B36B92 + +Count = 144 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A +CT = C701B9E9071899BE5D984616 + +Count = 145 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B +CT = 16A4179E45B8A67B45163A3E + +Count = 146 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C +CT = DCC52F22E9ECCC1C393413E2 + +Count = 147 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D +CT = EAA06990BDCB82563BB1BBE4 + +Count = 148 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E +CT = 0E868336ADA6E0447A4665B6 + +Count = 149 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F10BAE24D03BA26AD3 + +Count = 150 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F930F2F1B0D3E011E17B + +Count = 151 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC2D2DE43B01E8FB14 + +Count = 152 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076207D15F2B94F611A + +Count = 153 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC10C52B77099B2ECB + +Count = 154 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABF66591DA640FF7B5 + +Count = 155 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D5F88FADDAF3EB61DC + +Count = 156 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDE92B6447023A7E76 + +Count = 157 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAE45033A7CAFFEE2E3 + +Count = 158 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879E59DD30EEEDDCE20 + +Count = 159 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A810E2F3AE52F7E61547 + +Count = 160 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A537F1FB8732E1E0D + +Count = 161 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E5F8E2316CB8970CD8 + +Count = 162 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70CA6FF03AC7B1B448 + +Count = 163 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DE4905318F8DA86857 + +Count = 164 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F53F5F7782BAC8BF63F + +Count = 165 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF7C492F35658F9A981 + +Count = 166 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = +CT = 0F100748031AE7F1B014A5EDF7 + +Count = 167 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00 +CT = 205E499F3C73EB24C920771F1C + +Count = 168 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001 +CT = A6510C620A3ED7448D550BC955 + +Count = 169 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102 +CT = B016869D49CC7557D7E228F13E + +Count = 170 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203 +CT = 02436555E6A773134FAD6DF798 + +Count = 171 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304 +CT = 9E821E2FBD5F8968D189569388 + +Count = 172 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405 +CT = 6AB222DB94BAB061F13C1137EE + +Count = 173 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506 +CT = 72DAE4B2E148E6A21FCAFB7CE0 + +Count = 174 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 0001020304050607 +CT = 5204EE553EF3CBF057BE98CC51 + +Count = 175 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708 +CT = 5BF7E60280D60E51272DB4C772 + +Count = 176 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 00010203040506070809 +CT = 34660D5ED3D969B721F954C4F5 + +Count = 177 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A +CT = C701B9E9E0AEC6C184D6658AF1 + +Count = 178 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B +CT = 16A4179E941A01F07B61CF4223 + +Count = 179 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C +CT = DCC52F22BE3BA3CC09CAAA0F25 + +Count = 180 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049EA37A97D64B520D0 + +Count = 181 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360CC76312DED8369247 + +Count = 182 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE2AAE9FA41D5211D3 + +Count = 183 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F9308300CC90FBA985CEA9 + +Count = 184 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8E23447D0F8642F0E6 + +Count = 185 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6BBE4D6E17B0435C0 + +Count = 186 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FD122F03A5AAA9176 + +Count = 187 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC1C3611D4728A8F4AC + +Count = 188 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55E24A17FA4664C0E55 + +Count = 189 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEE75DD57C90DFE1226 + +Count = 190 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEED2AC0FD357B8D16AB + +Count = 191 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1624F8D3225D3B272 + +Count = 192 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A81021F6ECCBB58C47370C + +Count = 193 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2EC5A7A7AF984B7D89 + +Count = 194 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E65309CFB0A7A8356 + +Count = 195 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE7019F9DB25C2D47D4A45 + +Count = 196 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD32A1DBCE915E2620 + +Count = 197 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339A7D8B6C124B247CD + +Count = 198 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF7136D86C898E9C43A1E + +Count = 199 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = +CT = 0F100748039616C8E2D9C38C3814 + +Count = 200 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00 +CT = 205E499F3C9CD88D6F9B52FC3842 + +Count = 201 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001 +CT = A6510C620A4718C3E7508F3E85DB + +Count = 202 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102 +CT = B016869D4940B662AFE16A820E53 + +Count = 203 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203 +CT = 02436555E615B014970EE0B7B05F + +Count = 204 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304 +CT = 9E821E2FBD3ACB03EB86577113C1 + +Count = 205 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405 +CT = 6AB222DB94E65B0B7681C3D7B3A8 + +Count = 206 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506 +CT = 72DAE4B2E1465E071B69138172BA + +Count = 207 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 0001020304050607 +CT = 5204EE553EFCA33F8AB0811C7365 + +Count = 208 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708 +CT = 5BF7E6028053BAA9804646EB30E6 + +Count = 209 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 00010203040506070809 +CT = 34660D5ED37867E7F0C24C6384E0 + +Count = 210 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A +CT = C701B9E9E02D25F8AB39BF54CEA9 + +Count = 211 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B +CT = 16A4179E944254A117D162F6E921 + +Count = 212 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF04F34F40A9196BB8A + +Count = 213 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C1CF08D460DC79D23F + +Count = 214 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C6418B28073A6E6F75D + +Count = 215 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4C82CA20A9F22B659E + +Count = 216 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F280878D779E46D78D + +Count = 217 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5488FF5D3525452B2 + +Count = 218 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F6E7E004360F3664F8 + +Count = 219 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB7D77D810B563B6E03 + +Count = 220 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138708578A01E252EEC + +Count = 221 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB17247D494A6AA24B8 + +Count = 222 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB69DA1DBBE39D546BA + +Count = 223 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE39F4BDB997EF7870 + +Count = 224 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC724323DABF3E5165 + +Count = 225 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134D863D60F10169E43 + +Count = 226 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E96A26F493C3D8ECD + +Count = 227 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9837E66FD4252B78DF + +Count = 228 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194AADE41224EFC50DD9 + +Count = 229 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D966ABC09EFD18F1A + +Count = 230 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD1354F56D81343498 + +Count = 231 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D4155C63298F8587BC + +Count = 232 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = +CT = 0F100748039646BE64990F3F39532D + +Count = 233 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00 +CT = 205E499F3C9CBF5508F62E4539E0A7 + +Count = 234 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001 +CT = A6510C620A47703392B0F8235727AC + +Count = 235 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102 +CT = B016869D49402B328741104062810F + +Count = 236 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203 +CT = 02436555E615B68D70E215A296EF17 + +Count = 237 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304 +CT = 9E821E2FBD3AA3CFB6B5DB225884D1 + +Count = 238 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405 +CT = 6AB222DB94E65BA59797F6FA340FDB + +Count = 239 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506 +CT = 72DAE4B2E146FA9C4E84E869E4146A + +Count = 240 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 0001020304050607 +CT = 5204EE553EFC42FE0ED1C60D46E3CB + +Count = 241 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708 +CT = 5BF7E60280536A7A5CEE5F11838CB8 + +Count = 242 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 00010203040506070809 +CT = 34660D5ED378B67ED48DC756306B76 + +Count = 243 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A +CT = C701B9E9E02D3119BFC5D86BD66D4B + +Count = 244 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1B8431C1AB81A9031 + +Count = 245 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D4001CEC97B974959 + +Count = 246 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B00E994926B012E40 + +Count = 247 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7DFB41C92B4F35C4D + +Count = 248 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC79A7BF1D4EB9DD0A9 + +Count = 249 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D4BA635ADBA897FCE3 + +Count = 250 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE552A20C08F8CCB63CF7 + +Count = 251 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B093D6EBAFB5379EF + +Count = 252 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D4CFA6862919FDA35 + +Count = 253 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DFD9BE56EE216A50DF + +Count = 254 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED3BD75E4E0D7A14DA + +Count = 255 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68E2D5B1A0C25E1C25C + +Count = 256 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE9384499AA9510A619A + +Count = 257 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F110F160123457960 + +Count = 258 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE710255F7582E87A9 + +Count = 259 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4479BE7D4C78550DD3 + +Count = 260 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893446C81668AA00E51 + +Count = 261 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A9157E212BD6D0833CF + +Count = 262 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D9656C4A7CB622DC3C2 + +Count = 263 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD05EE2C20663965DDD1 + +Count = 264 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43154D9DB1027FEAF09 + +Count = 265 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = +CT = 0F100748039646FB79516E3A740611C4 + +Count = 266 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00 +CT = 205E499F3C9CBFE01BCBB35AFE03BE79 + +Count = 267 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001 +CT = A6510C620A47707389757FD3FE6E581A + +Count = 268 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102 +CT = B016869D49402B1A12CFA8044BF25CF5 + +Count = 269 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203 +CT = 02436555E615B6F7ECA412138E1C7D10 + +Count = 270 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304 +CT = 9E821E2FBD3AA328FE74C863F0BE6B83 + +Count = 271 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405 +CT = 6AB222DB94E65B1A2F40EC8A7D4C6E9C + +Count = 272 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506 +CT = 72DAE4B2E146FAE0C29F42C9C6D5C912 + +Count = 273 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 0001020304050607 +CT = 5204EE553EFC426969677172EE4D4698 + +Count = 274 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AA9373EEE153E766 + +Count = 275 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB471F6BD10AEBE171 + +Count = 276 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A +CT = C701B9E9E02D3128864EFC1455C29942 + +Count = 277 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F28AB64F265690851B + +Count = 278 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A0476213163917FFC + +Count = 279 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B604C5A358F627E7CF6 + +Count = 280 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FDCD6C679A3CE0694C + +Count = 281 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC785AF537859665199FC + +Count = 282 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D4511C5294D508CF8595 + +Count = 283 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523D70C3DD1046B1047F + +Count = 284 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B818BF77A1C53952CC7 + +Count = 285 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5ADFC36FAB850FF2F8 + +Count = 286 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9508CC0DC4F6483A10 + +Count = 287 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83E7DFAFE897AB37F3 + +Count = 288 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE2DB0CCD5F76013F0 + +Count = 289 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADC0BE1D1D090B5466 + +Count = 290 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F074C4701726B8CC786 + +Count = 291 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2D4B30917799E19839 + +Count = 292 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E44179EE5130B243CC89A + +Count = 293 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FC77D337B9A53E7FFB + +Count = 294 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D090862238E2D9C1B + +Count = 295 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D9638A30B0E4F0E9D9236 + +Count = 296 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574B79ABF7F66A75FE4 + +Count = 297 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 0001020304050607 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D4316218A127FC09046F81 + +Count = 298 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = +CT = 0F100748039646FB86A636270B90BC63D6 + +Count = 299 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00 +CT = 205E499F3C9CBFE00438B6BA106C5508FD + +Count = 300 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001 +CT = A6510C620A477073C1BAC3DC9600C63F2A + +Count = 301 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102 +CT = B016869D49402B1AC7825D5C9FA92C82D0 + +Count = 302 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203 +CT = 02436555E615B6F7BCBC61595021AB86DF + +Count = 303 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304 +CT = 9E821E2FBD3AA32831EE233BDA625506F8 + +Count = 304 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405 +CT = 6AB222DB94E65B1A9D70D1676190A7E1FA + +Count = 305 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D9951A3A7D9643D72 + +Count = 306 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9CF863591D30BC4E5 + +Count = 307 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708 +CT = 5BF7E60280536AC6ADD01DB7AA08C5BA5D + +Count = 308 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB486B69A4CC0A81F741 + +Count = 309 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A +CT = C701B9E9E02D312865DAD982FF31C4677E + +Count = 310 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E39B6847306C5B610 + +Count = 311 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7918A22B1CF6D9FF91 + +Count = 312 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053112FCB1C1F71869C + +Count = 313 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD952852C856C9285DEA + +Count = 314 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857EF320EA76D8E1B7A8 + +Count = 315 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D45161EC5DE88CF7CEAD83 + +Count = 316 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB542DE00D66D25C1C1 + +Count = 317 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B810562627C47FF958536 + +Count = 318 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A799DF682E710EF88F4 + +Count = 319 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510F79769653B51106E + +Count = 320 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F99E68C05CDF0D44F3 + +Count = 321 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE829467B991DB8616B4 + +Count = 322 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFFB8F427C9BD41F47E + +Count = 323 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F07237FBB09C42B32D816 + +Count = 324 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5B91713E7081082BB + +Count = 325 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2239AEBBC8255EE49 + +Count = 326 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB805A4CE73BE179328 + +Count = 327 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FFD3F86A4E66C7085 + +Count = 328 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BC7D33B1FC6F252E + +Count = 329 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A75003AF8057015E78 + +Count = 330 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E8F1E55AF5EEA90EFA + +Count = 331 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = +CT = 0F100748039646FB86A6A1C2F43DF3BCF54A + +Count = 332 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00 +CT = 205E499F3C9CBFE00433EBF8878670CA6E78 + +Count = 333 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001 +CT = A6510C620A477073C19FC9143B3003737C18 + +Count = 334 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102 +CT = B016869D49402B1AC77AB1D5215694F82F01 + +Count = 335 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203 +CT = 02436555E615B6F7BC673BA6F212DA47327E + +Count = 336 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304 +CT = 9E821E2FBD3AA32831174F7163226186E0F6 + +Count = 337 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC1916A506844DDFBE + +Count = 338 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D27714D7CA4D6206096 + +Count = 339 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E931FA0B0EE5483A35 + +Count = 340 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B9526FF6C79D47351 + +Count = 341 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342C879372E6CB5078 + +Count = 342 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A +CT = C701B9E9E02D312865753DA00DE50B5CF310 + +Count = 343 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E047728A1CCCE827D05 + +Count = 344 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A79446C36958A7E5EE3FB + +Count = 345 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B605358F08D5C367F54E3C7 + +Count = 346 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D210B768B87FF0FEB8 + +Count = 347 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E8079E1A6B661130482 + +Count = 348 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A692B460DA22A3138 + +Count = 349 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58C8B8B2A50ED6CE095 + +Count = 350 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E951F4A8784FC07E65 + +Count = 351 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796EAD3CD1409A5002E8 + +Count = 352 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510633F8FADFA8F9FA00F + +Count = 353 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94AA53C2F1098A0E4F9 + +Count = 354 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820C0C5763B35139F8D2 + +Count = 355 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44AA8B44C68E3A49CB + +Count = 356 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F072349F4EB237BE075A409 + +Count = 357 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABE6849B336BC6B1E7 + +Count = 358 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2567366506AE2CCC479 + +Count = 359 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895F678CB551FC0FD4C + +Count = 360 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2D6969CA8B6D32192 + +Count = 361 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BC08A7EB0AD489E142 + +Count = 362 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A7568C29BC54DC7A66FD + +Count = 363 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 00010203040506070809 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E82462C9F11B02173555 + +Count = 364 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = +CT = 0F100748039646FB86A69E0C2F9D551FCB883A + +Count = 365 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00 +CT = 205E499F3C9CBFE00433379F3AC0D6A750B54A + +Count = 366 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001 +CT = A6510C620A477073C19FB7ED115459C0F0026C + +Count = 367 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102 +CT = B016869D49402B1AC77A5BCDA92EE95A456B14 + +Count = 368 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203 +CT = 02436555E615B6F7BC677351ABF15320F93B4B + +Count = 369 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304 +CT = 9E821E2FBD3AA32831178A4B81C3C2DFFD0601 + +Count = 370 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC06A6D2C256FF0256C2 + +Count = 371 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BE73B7DE89D2524F0 + +Count = 372 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E6D481A340D7E1281 + +Count = 373 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63CC1E116A37CF0F31 + +Count = 374 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342A7D34AA1C68A8710C + +Count = 375 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8D8F181DAD80BC83E + +Count = 376 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E0401EC614493D5E193A9 + +Count = 377 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944128A78592041267B5A + +Count = 378 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583BB33083EF74D0377E + +Count = 379 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29B5891111DF3095986 + +Count = 380 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1FEE4F6589F52E1DC + +Count = 381 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A30D6BC9797DEAF0F87 + +Count = 382 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC07342059AE23E94C1 + +Count = 383 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1927349B67B21274C + +Count = 384 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9FD39DD3FA5701804F + +Count = 385 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D289E97D6409B8036 + +Count = 386 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DD028FF73C73EB56D + +Count = 387 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6C91D1ADA0402E053 + +Count = 388 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CBF228FF5C731D1E37 + +Count = 389 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493BAD739B540A5EB1F6 + +Count = 390 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4206B9ED197C16DE1 + +Count = 391 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569BDF6913D341FF5850 + +Count = 392 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC3509DEC20D2BFA3B + +Count = 393 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC274CB6E60AC138122B6 + +Count = 394 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD2DC83AE390507B1F2 + +Count = 395 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D911BEC9E48D887BF7 + +Count = 396 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6FE3A7449E9B818CA + +Count = 397 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = +CT = 0F100748039646FB86A69E9C2C3744A6F38F7CB1 + +Count = 398 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00 +CT = 205E499F3C9CBFE0043337A3C6EFA78B46F84A09 + +Count = 399 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001 +CT = A6510C620A477073C19FB7AE717020332CC09E99 + +Count = 400 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102 +CT = B016869D49402B1AC77A5B52C8D53D41446A4F55 + +Count = 401 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203 +CT = 02436555E615B6F7BC6773D16F42219321BB75BD + +Count = 402 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC7410B7BD852B7D14A + +Count = 403 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F59C250A4B1FD2FF2 + +Count = 404 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB6C32B1B943CE72A7 + +Count = 405 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E136083090A93A6D478 + +Count = 406 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A6972E34FBE30C973B + +Count = 407 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADF59F42E38915DEC53 + +Count = 408 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F85361D6AD94714D19 + +Count = 409 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015081C242CFE03F0000 + +Count = 410 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124D86A23CF0528E1C47 + +Count = 411 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B6494BFB30B9747171D + +Count = 412 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9BE1118642459A637 + +Count = 413 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB238D5140B0690147 + +Count = 414 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D606BC510AAFD25CB + +Count = 415 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09CBB92E904C4021FEF + +Count = 416 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CFC3BDE3D33F484EDA + +Count = 417 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67EA9A8772FEC1C52C + +Count = 418 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86CB338D2DC3C3EF20 + +Count = 419 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAF76969C1403AAE5FB + +Count = 420 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A329C20E7C03AD43CD + +Count = 421 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7FE0FEB12BCB1746C7 + +Count = 422 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B1344D900C7675B9E19 + +Count = 423 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB444954A060F13121582 + +Count = 424 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B0055F5041FBDEAC659 + +Count = 425 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9DF3EAAF7FC222104F + +Count = 426 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747CC43BBDCD81BD3595 + +Count = 427 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257A7CEA1BE780BF5B9 + +Count = 428 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D95114670183874A9906 + +Count = 429 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E620E146EA48AFB36714 + +Count = 430 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = +CT = 0F100748039646FB86A69E9CBC8C7A508E794CD8DB + +Count = 431 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD2D2BDB261CBC5CCF + +Count = 432 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001 +CT = A6510C620A477073C19FB7AEA545D30030A65010E8 + +Count = 433 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102 +CT = B016869D49402B1AC77A5B524474F132D57E6FF23D + +Count = 434 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5DBF5270FA325514F + +Count = 435 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74F63C2F286E5F670BF + +Count = 436 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2AB392864928375712 + +Count = 437 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB44EA180B44BF8875E0 + +Count = 438 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB9C22265044CC8BB5 + +Count = 439 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623F56BC6C894713DF6 + +Count = 440 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA655D0726B047DC56C + +Count = 441 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B31E3C03141BE785C5 + +Count = 442 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E040150617DF31F75C95CB45F + +Count = 443 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFAC010041FCD1AA204 + +Count = 444 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E14D14238BDC7DAD1 + +Count = 445 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CD635BF41AB02F7D50 + +Count = 446 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB608C844100D036B285 + +Count = 447 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D40C343845B67207015 + +Count = 448 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C56C71A248EC3BDB72B + +Count = 449 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9ADA76C457AC04EDC1 + +Count = 450 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FCB5590B56FA1D600D + +Count = 451 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86421E8E99BB850AB764 + +Count = 452 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE27D304315A8D2F748 + +Count = 453 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DBB17C705E24F9BF16 + +Count = 454 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F106FB2CDB07AAE887A + +Count = 455 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC814B1890D658BBF7 + +Count = 456 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB44499051AE511EA52AC90 + +Count = 457 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD7A591B274426012B + +Count = 458 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19B58F1C72B9798BE9 + +Count = 459 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EDC7C96D831AB2C79 + +Count = 460 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD25743E3CD50D330F58FF4 + +Count = 461 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC0A4CD3AED7F6B735 + +Count = 462 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B10D856C400C54B13 + +Count = 463 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = +CT = 0F100748039646FB86A69E9CBCAB50FAA298860E9A2A + +Count = 464 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20B2311BC64D8C16CB + +Count = 465 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A8F4BEF7D23BDAEA9 + +Count = 466 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102 +CT = B016869D49402B1AC77A5B5244E31EAAA2CB95F6C311 + +Count = 467 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B52109155DE0A1B0ADF9 + +Count = 468 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3EADC7DA31BC41741 + +Count = 469 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A65AE4E0688C764D215 + +Count = 470 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442FF3D2434D314B17FD + +Count = 471 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A9C9CC1635F2F82D7 + +Count = 472 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C29919372BDD5DFE9D + +Count = 473 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA66072F36C46EE126380 + +Count = 474 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C9C3F07D49F0B72942 + +Count = 475 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E08A6415B965C5E015 + +Count = 476 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194F0FA58B05B385A2 + +Count = 477 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E335CA7E099EB713190 + +Count = 478 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE408452097B07CCC73 + +Count = 479 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5DD8747DC129E5855 + +Count = 480 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D4030552EFC637F429C3D + +Count = 481 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569B6A4DA1066585B0AB + +Count = 482 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD3B9C7876EA4585EBF + +Count = 483 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC093C4E8F200F95F11E + +Count = 484 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D8642924AD909819C9EAEFC + +Count = 485 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE2559FC87D00EB20BE04 + +Count = 486 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EDC4D33A08B16F715 + +Count = 487 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F1008A7E6A56A42C1188F + +Count = 488 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC5861727E4E9D248C10 + +Count = 489 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB44499928B09C1FA68E16AC0 + +Count = 490 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD658EF7FFFADD36CB64 + +Count = 491 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F141D57793D7B3A235 + +Count = 492 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEBA5D08F41CAA7BE99 + +Count = 493 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD25743881B906508D1210854 + +Count = 494 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09743D4FDCBABE4ED7 + +Count = 495 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B37D38B090C695A4701 + +Count = 496 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = +CT = 0F100748039646FB86A69E9CBCAB409B3E586F84B2864F + +Count = 497 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD2011B6D5E37780566617 + +Count = 498 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A225FFB120634585A9F + +Count = 499 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F28E762450FD936374 + +Count = 500 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E261451262BFD7B7C + +Count = 501 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7D1AFA6C1EEDFC8A8 + +Count = 502 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F5E82C1DF3A2268F1 + +Count = 503 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F92964DCEDC6BE3F8AD + +Count = 504 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8BEDE50B72C63B919C + +Count = 505 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D86D1EC39ECCA543CD + +Count = 506 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FA1C3089934E3BD3DE + +Count = 507 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957E1D6E6413831ECF4 + +Count = 508 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F32BA53352D8EB3C15 + +Count = 509 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AE7DFE47E8C41E723 + +Count = 510 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332F4AA18223DC32186 + +Count = 511 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B48B55424EB6CA544 + +Count = 512 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F78DCFA9CA4B70C68F + +Count = 513 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D4030237DCB981C1AC8A9ED + +Count = 514 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA93BAD4880265ADAE1 + +Count = 515 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306FA990AC75F268D0D + +Count = 516 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094FD124E30CDE300BEF + +Count = 517 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D864292237ED69D6FD0B7CD35 + +Count = 518 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536B85FB19027886757 + +Count = 519 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB28B1008C56C62E3AE + +Count = 520 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F10080705EF333DBDCCDCFA + +Count = 521 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF9942A32C806CEBA4 + +Count = 522 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB444999276BDBE24A17B30D0DD + +Count = 523 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657307443CA61512755D + +Count = 524 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F19783B2669B78003087 + +Count = 525 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62148F64CC9B1901EA + +Count = 526 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830650617D5DF7A29BE + +Count = 527 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09272FC74C0AE7261E24 + +Count = 528 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373BA51896A185511560 + +Count = 529 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = +CT = 0F100748039646FB86A69E9CBCAB4023DE6691495106D12C + +Count = 530 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FEE2A34FEF586DC59 + +Count = 531 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A184339D58E51F0BB1 + +Count = 532 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F291F605E654AF15FB76 + +Count = 533 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B2F03CADB88627244 + +Count = 534 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7AC99736969DFB69EBE + +Count = 535 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9B94009DEEC84D6EC9 + +Count = 536 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A324C8CE5FAB5BE26 + +Count = 537 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AA2A4AB90C0DADFBD + +Count = 538 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808B96FAD4189844527 + +Count = 539 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD00D4DB513521BA23 + +Count = 540 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D6D149056C63D950FA + +Count = 541 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393D2FA021340FB88FB + +Count = 542 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFADEDDE4DBC59EC89A + +Count = 543 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332980F99DF9930028BEB + +Count = 544 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3EA633026F4930DEAC + +Count = 545 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E27B9E516D4BF4BB1F + +Count = 546 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F50D84D5DFD1B1DC5B + +Count = 547 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D7BD83A00E8544C82 + +Count = 548 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306010047CE3478C0EB06 + +Count = 549 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F605BEE4C5C2F42BDD3 + +Count = 550 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D4EDE545C708C57FD8 + +Count = 551 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A133AEC4F458357175 + +Count = 552 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24BD8B492194BC84984 + +Count = 553 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D6FB3286B795D45E67 + +Count = 554 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D01E10C0044BEF64F + +Count = 555 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB44499927607016E7FDA447CDC37 + +Count = 556 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD6573156190FA54DB599FE3 + +Count = 557 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A17B587F350264B34F + +Count = 558 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E0C01E3B435DD81828 + +Count = 559 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BD6F9CA939E582CE23 + +Count = 560 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F66994D616F6AA6F2 + +Count = 561 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B99BC5D40218A8E21E0 + +Count = 562 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236FC69D252567A24A60 + +Count = 563 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF7FED7DAEA01E7581D + +Count = 564 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A11546EBA33DA1AF92B4 + +Count = 565 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137A1010A2007036C97 + +Count = 566 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7CD6334E04488C4512 + +Count = 567 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4BA657EA74039CF31 + +Count = 568 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC00E01E3BBB9FFE65 + +Count = 569 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F8DBEFD27D6BF6738 + +Count = 570 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4E3A400697FC95E0E + +Count = 571 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C39468CFDDBC1D0030 + +Count = 572 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D310979DA25C87F17 + +Count = 573 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A22FAF24BD8446E5E + +Count = 574 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F3937522C6CF52CCED26D3 + +Count = 575 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB28EBFEC74F931236 + +Count = 576 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E333298856B85CA53E6804CEC + +Count = 577 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4D0A133F87586184A1 + +Count = 578 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CC3D7827C6BBC04960 + +Count = 579 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FACBFCC2057AC05954 + +Count = 580 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4E9BDB6925CC78E7C9 + +Count = 581 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD30601776C9CC7029243DA78 + +Count = 582 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F6060B984D5510B9CAD4D + +Count = 583 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47EEFFF54A24B61DB75 + +Count = 584 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E0EDF6D0ADCD2C1E5E + +Count = 585 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B19F1AD68FC69CDC893 + +Count = 586 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600E1610FD61C82DCE3 + +Count = 587 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84837F8811D5B8C70F + +Count = 588 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB44499927607798A59E9A49099EBAF + +Count = 589 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3DE332E2F6EB8D293 + +Count = 590 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147620E5CDC93AAC3ED + +Count = 591 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037C034C1E613AD765E + +Count = 592 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBEEF9A7BB03B5279A3 + +Count = 593 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F40422D00E890467571 + +Count = 594 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B9972EC19B4FCC386C983 + +Count = 595 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40578FB7F924F2B33B + +Count = 596 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF7415856021F5BFB7BF7 + +Count = 597 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F29861B6106F078D4 + +Count = 598 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA1979541ED31007FE + +Count = 599 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C280FD330ABA5994A63 + +Count = 600 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F1E2ABE3936C8FAC7A + +Count = 601 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34DB79B142D9222548 + +Count = 602 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F225F28E83BCFEB97A9 + +Count = 603 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F05346C8CAE361AF88 + +Count = 604 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E7B03DB21BE6B48D4 + +Count = 605 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D96539BCBC552D1A213 + +Count = 606 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C1AB819F780C7D434 + +Count = 607 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E7EA7537B77D883E7 + +Count = 608 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB06508AA2D8A0213A9B + +Count = 609 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E333298855821A6616B78728FA9 + +Count = 610 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63DED2E6FD54BC661 + +Count = 611 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC3F2061CFF429C9B1 + +Count = 612 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55BBE5858668E9DB28 + +Count = 613 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE76C9CECB380C3D969 + +Count = 614 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD3060177838A11A679889E15DA + +Count = 615 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F60601997899AAA2D69D8D5 + +Count = 616 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E102488EE8E37259192 + +Count = 617 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065FC00ED745680003D + +Count = 618 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B19462544EC1FAD9B4CB2 + +Count = 619 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D60027B7D0983FE728D18C + +Count = 620 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F66637A78B7A98C57C + +Count = 621 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F69C1AC2AB7FB0DE79 + +Count = 622 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C343454DBEC38CC6BFB0 + +Count = 623 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE79E20F5718062891 + +Count = 624 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F3E0E16F3DB9A692FB + +Count = 625 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE2318330A78713FDFEE + +Count = 626 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F9B1B3ABBDA0DB44F + +Count = 627 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247A4AC1E77649EC024 + +Count = 628 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F4019581697DFF3979112 + +Count = 629 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A07AF44CA41F2E621D + +Count = 630 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8D6A06B9A536A5A6DE + +Count = 631 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA46795FAABF7501688F + +Count = 632 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28547C1D546D740B8934 + +Count = 633 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F13462CD0FF1BAEA8A90 + +Count = 634 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1CC0358CEA9B56BEE + +Count = 635 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E7E38334DE311C62FA + +Count = 636 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E2B53C1B55F2B25C06 + +Count = 637 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E211BE83B7BC86A1A6A + +Count = 638 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966094D42DEAFE857FBB + +Count = 639 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2BE511CA19DABC7D25 + +Count = 640 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E933D6E44A5D3F0B345 + +Count = 641 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A0BD9738E3CC21548 + +Count = 642 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3F390F9147E378EB7 + +Count = 643 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63CECB756378A1941C0 + +Count = 644 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8FFE21097C5699AE30 + +Count = 645 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C51098A2D5C49719D2 + +Count = 646 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700FD0E2FD469B88EA6 + +Count = 647 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3AD61658A87DB2F93 + +Count = 648 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CD9E407F48BFD3490A + +Count = 649 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109DDB052DB166CC2C07 + +Count = 650 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C5D187370908C0C650 + +Count = 651 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B194694F771C9E87B1881AE + +Count = 652 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D95F39D83F3C07EBA + +Count = 653 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F616B2AE6B4939099487 + +Count = 654 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647499E10DD6965917D + +Count = 655 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438FC2FFFB15C7C921CF + +Count = 656 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE504CC2B0BA184DFA41 + +Count = 657 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F3301151A560E6F83427 + +Count = 658 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E921A6FE17D2FF5B68 + +Count = 659 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F30D8B6BB0DCBC7F3FD + +Count = 660 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA16E281786E7A6829 + +Count = 661 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F1AAA3BB9934ED9EA + +Count = 662 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6609FEE194CEB6BCE + +Count = 663 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC5D76A03BAFF540E67 + +Count = 664 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA46912A8C8F51C8DD222D + +Count = 665 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C285483981430655F6DEA00 + +Count = 666 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E2348873D2AFF12FA8 + +Count = 667 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F4E36FFDADAA67C954 + +Count = 668 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76A25BE1D7E8AC9A592 + +Count = 669 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26E56081B40790C661D + +Count = 670 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECB05DF9127F28AC0D + +Count = 671 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D9660883551650422516AF3 + +Count = 672 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F927A3C7E4C000D29 + +Count = 673 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C2A9DEF5596714E376 + +Count = 674 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A092DA56D8BB67B3BAB + +Count = 675 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC4966C1D31AF4F90 + +Count = 676 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C197B09B94B582B613C + +Count = 677 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3EF9D69A5EFC36D40E + +Count = 678 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518F1F16337B5FD61CD + +Count = 679 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E15358246CBEDD69AE + +Count = 680 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3005954F324CC5B64AE + +Count = 681 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9DC4348CCEB9204E5 + +Count = 682 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D79DFB644150973E749 + +Count = 683 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568164E28DFFDD0E8F0 + +Count = 684 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940DEDAEF7867EDB4FB5 + +Count = 685 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D353945B9C84B25DAFD + +Count = 686 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646F88F6AF6A9D6C5B6 + +Count = 687 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2C58C199B75198DF0 + +Count = 688 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F9427FCAE95941E69AC + +Count = 689 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F71C8273484867EAEF + +Count = 690 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E551405F21BA3F8AF2 + +Count = 691 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F244A152EDC54B495F + +Count = 692 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C911D2A597E05D123 + +Count = 693 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3A74F303FF9D5ABA55 + +Count = 694 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F033020081A761B0474 + +Count = 695 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F773AFE8C3C2DF15DD + +Count = 696 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56DE67127FA06213BDA + +Count = 697 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DEFF26E375A3680B84 + +Count = 698 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C2854833020C16E4455D4083D + +Count = 699 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29EF0572ABDEE862126 + +Count = 700 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453F304CCA07A2779E6 + +Count = 701 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD930F34B2834CE6A2A + +Count = 702 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE5075976EAAB75F93 + +Count = 703 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCF69D8FC5D4F3D0099 + +Count = 704 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D96608801B4D689A4AD4C674B + +Count = 705 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26E58FAB017936778D + +Count = 706 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25DEC0E45A191DF7BB2 + +Count = 707 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A0934FABAF7A6BC921D9B + +Count = 708 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC05B0A9A1633B1DA90 + +Count = 709 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F9AB0032C9473E5 + +Count = 710 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E75D048EEE5D5B9439B + +Count = 711 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C48962BCEF70781C75 + +Count = 712 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14AEE9A79A992F51332 + +Count = 713 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F30036B033B71BF4786493 + +Count = 714 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA989C32ADE7D2D218C47 + +Count = 715 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793D1197F7D2433D0741 + +Count = 716 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C56889C492585464141B23 + +Count = 717 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D58EE69413DCD77E9DE + +Count = 718 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35962CF7C08645D2088C + +Count = 719 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF9C7179438DC4EDCB + +Count = 720 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E201F18A5D13070AB1D7 + +Count = 721 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A004667EA85CAED4B6 + +Count = 722 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73DFAE67A8999C9F926 + +Count = 723 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E51359CCA6B7DF60F005 + +Count = 724 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F2887D71328214A138EB + +Count = 725 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D096B7EE0F35E18A + +Count = 726 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD5A5FCC3E326DD540A + +Count = 727 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030FBCD8EA24E9379BA8 + +Count = 728 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F345B13DCE454BB320 + +Count = 729 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D73A23220CA7293E52B + +Count = 730 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1D1FC8FEE133E04902 + +Count = 731 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D78E4BB5B83D6F6752 + +Count = 732 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B7CF8304BFA36668E + +Count = 733 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD12BAE5B24755A562 + +Count = 734 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D42D9132845A3AB355 + +Count = 735 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4DD606F49F65D1D213 + +Count = 736 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE7A6295BED54213AE1 + +Count = 737 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018617F2A919AF27C50E + +Count = 738 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD9703B0C4150C0821 + +Count = 739 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20782D015949B79A1A + +Count = 740 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348AD17A770C947F7D36 + +Count = 741 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC069AAAD74F3D8B1F1A4 + +Count = 742 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F84D58C8ED75F7F36 + +Count = 743 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F8EF3C50C0AD9C109 + +Count = 744 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C3B37A63E6155F2B37 + +Count = 745 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A55155757EE1E074A + +Count = 746 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F30036103D1315C1DA117A44 + +Count = 747 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA989271EA54AAB6A5B7631 + +Count = 748 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDC810665808A695908 + +Count = 749 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A5B19294DF2366A04 + +Count = 750 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F2755727727B5E75F + +Count = 751 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F151611BDC94FB3BA + +Count = 752 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF92D0368F69E891A298 + +Count = 753 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B4E9E63F492777625 + +Count = 754 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012AEA0099378801B01 + +Count = 755 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D7450A58F079F3F7074 + +Count = 756 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E51378CB5763943B12CBB4 + +Count = 757 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F288522260E5AE7907F5B2 + +Count = 758 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D449845C61B5ADB443 + +Count = 759 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513A1A30316855BB7CA + +Count = 760 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97F47F9753935CC4DE + +Count = 761 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CC47DCDD41181641 + +Count = 762 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E0FF8E54F7242C974 + +Count = 763 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE774E2C99AA7CF835D + +Count = 764 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E4785D802756B03B0E + +Count = 765 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B10512827B5C7D22876 + +Count = 766 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D5F03EF7B1178087A + +Count = 767 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D400BFE36143CCD6DF0E + +Count = 768 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4850552E154385D903 + +Count = 769 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70BA23301E4C71ADD53 + +Count = 770 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D9660880186190A27D633F452EF43 + +Count = 771 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD2894887023B3EEA1D9 + +Count = 772 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E194149DB85AE3177C + +Count = 773 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29BA77E724D15518F8 + +Count = 774 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC069400B64A555737E9E80 + +Count = 775 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B5054E7B37543A14D + +Count = 776 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19D83F19C5C21D6490 + +Count = 777 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C312BFD5D8FA489E5585 + +Count = 778 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A511231424C19E12C8C + +Count = 779 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F3003610679C6430205682021D + +Count = 780 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA98927861AD40A8E591CA61A + +Count = 781 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF14BAD346AF8AC5DBF + +Count = 782 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1714D399C483CBA4E0 + +Count = 783 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F1572F2822594179260 + +Count = 784 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2E6EB3BE91848A7681 + +Count = 785 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BF3F545A9CD7CDFE1 + +Count = 786 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1D0301550CAC708248 + +Count = 787 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B948B6C0CC84146096 + +Count = 788 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2AF16C15F3DAC4B43 + +Count = 789 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E513787630D80920CC8FF680 + +Count = 790 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BA3BC71A4124C31308 + +Count = 791 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DE5E0C0B6BED783FF + +Count = 792 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AA8513EA8C621FFD + +Count = 793 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BC500DBD0096552B5D + +Count = 794 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB1285B57935E13FD2 + +Count = 795 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D03704125F3E28546 + +Count = 796 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F64348CD49C2D2FF9E + +Count = 797 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45318A57A78F59F661D + +Count = 798 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088D52AAFFAC1CB1716 + +Count = 799 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D10DCF3C12E6AE79238 + +Count = 800 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038467FAC14FB337C89 + +Count = 801 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D48604D091A71B589E332 + +Count = 802 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B972282EC65195C9022 + +Count = 803 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F3C84360520DE8A648 + +Count = 804 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2C316F0E9A8F6095F + +Count = 805 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16AEC0B8B1535B09C82 + +Count = 806 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2576A800D90CA07B0 + +Count = 807 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4BC0452D525897013 + +Count = 808 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1535435F041AE5644B + +Count = 809 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA208CB3949B882DEA + +Count = 810 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C312968974D7CAF149AB3B + +Count = 811 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A5187F94E1EFBEE71BC19 + +Count = 812 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CF8D99898B61C295C4 + +Count = 813 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EAF89CF74F8F1FFC9B + +Count = 814 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F066DD8D5E85378253 + +Count = 815 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739BF102CD50083E2A6 + +Count = 816 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D2296CE1ADB445F8EE + +Count = 817 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDACAABFCC12ECE913 + +Count = 818 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA885D2D690B3E6D4CC + +Count = 819 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFEFB5289408CE89AA + +Count = 820 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B9943D9F3845867C04DB + +Count = 821 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B51E7A67AAEB5D2978 + +Count = 822 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAB9352CF105E6BBBC + +Count = 823 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACB9F0DF06E49EC540C + +Count = 824 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF09EA1B5880C331E78 + +Count = 825 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F1011121314151617 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE1E8D5EA4713298D4 + +Count = 826 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB3CE31434D1329B20 + +Count = 827 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42F32F9D381A23DA94 + +Count = 828 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D4922AE729074988A8F + +Count = 829 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6565503503D1DA35213 + +Count = 830 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E453803C9E3644E2F3FA01 + +Count = 831 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB80A3F95C530358CB + +Count = 832 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D1069E55E4E3D6CEF4D20 + +Count = 833 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BAEE808A7C6CF45DD6 + +Count = 834 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E57F921F89850AA198 + +Count = 835 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B97424BD52A58C4084395 + +Count = 836 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F3754D482F0A939CBE0D + +Count = 837 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD3BD07DB05C517625 + +Count = 838 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53EBB5B9C8B17A6CE2 + +Count = 839 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CC2236DF2D5DF1ADB3 + +Count = 840 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A46820EEC7DFF4B9A372 + +Count = 841 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B15036D3B7BA1B9DBE123 + +Count = 842 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DF772AA105896CC04 + +Count = 843 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296ED38159876CAA02112 + +Count = 844 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A51873502E2717361B37B79 + +Count = 845 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD687E445F54E6A082D + +Count = 846 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4ABE38751D87F15DF9 + +Count = 847 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0ADA2980C18B509B84B + +Count = 848 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBCA132E1BBD92C78C + +Count = 849 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258D749AFB3795F33F8 + +Count = 850 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFD1AC1C36CAA74918 + +Count = 851 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF5F95A6496213F3C1 + +Count = 852 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDBCD295355BFD5AF1A + +Count = 853 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2084533FAF34E5476 + +Count = 854 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F4001B5D784BDC6633 + +Count = 855 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF2FA65C582BE1F90D0 + +Count = 856 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8EB3A4CD0CC27752A + +Count = 857 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF0899EEE98CD2294B8FD + +Count = 858 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34A850B4C33C0AC835 + +Count = 859 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB724D8910B7BA768E73 + +Count = 860 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232FD206577F8F4AD3C + +Count = 861 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D4964A0F4987DBE6FF007 + +Count = 862 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566FC684BF9D4084EC60 + +Count = 863 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B62141ED5166709123 + +Count = 864 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B19123F7E5F7FCECF + +Count = 865 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D1069277602D852A6F376E3 + +Count = 866 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FA4DF041FE70A21C + +Count = 867 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E24FDD5300B227697B + +Count = 868 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C8D7A8420AD826C806 + +Count = 869 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F454A3C45EA77B96CF + +Count = 870 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD51D5C610EBA4647573 + +Count = 871 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53166323C88DD74C4275 + +Count = 872 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD03DDFA02EF4CCFBC3 + +Count = 873 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F7C1502485C9627A4 + +Count = 874 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FBB1DFF94FBF7AB270 + +Count = 875 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD6855D2C1454474F8C + +Count = 876 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC01286A79ADA5400D0 + +Count = 877 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D2E511BF33FF524210 + +Count = 878 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D35CAC793E82980D53 + +Count = 879 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37775B3B5C89036755 + +Count = 880 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD034487F392ED9748CD + +Count = 881 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBCE5093114FCA7D68E + +Count = 882 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A36FC03F9CEDBFA77F + +Count = 883 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB04179DA99F8F2927 + +Count = 884 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF491367ED90F816D56A + +Count = 885 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79D5CFB2FED9DE4382 + +Count = 886 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A13EC565533CD311F0 + +Count = 887 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45032E4B021B4C09188 + +Count = 888 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244C621AE49479BDAA9 + +Count = 889 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2A47CDF2959907B6A + +Count = 890 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996562F303CB09939E6 + +Count = 891 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F10111213141516171819 +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE3486C8BA2E8F1A63CD72 + +Count = 892 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A2250A9EEDA1AD756 + +Count = 893 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232901C332E210D9E1094 + +Count = 894 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430A1DCF2269A48A90F + +Count = 895 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F2097A7E1BCE97C86AE + +Count = 896 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B6213210F57A91B06CA1 + +Count = 897 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B1138F2EF1345387F61 + +Count = 898 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C5696EFE35E9E1896A + +Count = 899 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB02584DF964EF5F01 + +Count = 900 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E2536BE287CF1DA14848 + +Count = 901 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82D2FAF07993AC5A7F7 + +Count = 902 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41EEB1CA230A592D0CF + +Count = 903 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A090C2F66908F24ED + +Count = 904 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169FEA7E35A24C607281 + +Count = 905 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040452492ED3696DF45 + +Count = 906 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F869B3B0FA0F52E5C4C + +Count = 907 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9667D98BFB96E85285 + +Count = 908 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD623E9B190503926B3CD + +Count = 909 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C768ED7BE1445D7B5 + +Count = 910 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D2760F9E1087CD3B6B14 + +Count = 911 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D3651B4A41D564D3C038 + +Count = 912 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37244906442A5713954B + +Count = 913 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314DF5A834054E98CBE + +Count = 914 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC14DC03B9E7CEDE7C0A + +Count = 915 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DBF49FF0F5E369A72C + +Count = 916 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6FE656F6BC61F66405 + +Count = 917 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490DAACE9CDD5BC0FF0B + +Count = 918 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCF9DC4D0E3E62533F + +Count = 919 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A129B91052111E7ECE52 + +Count = 920 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087FB7FBE9CD9C849C6 + +Count = 921 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244364529C5C27FB01BC5 + +Count = 922 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C26963EACCE9E4B03D47 + +Count = 923 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7375434035F7C6C95 + +Count = 924 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863FC6E3A843557EF7CB + +Count = 925 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ABCEE258EA906DA71 + +Count = 926 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42329054BA599318AAD91B62 + +Count = 927 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C95C281910DD822609 + +Count = 928 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F34636975609CA175 + +Count = 929 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B1D3675EE2A34EE448 + +Count = 930 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DA164994B965BAB92 + +Count = 931 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519F42193A83F632512 + +Count = 932 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB9028585FD92BCB55E5 + +Count = 933 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253519DC6E2DA94F90E00 + +Count = 934 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB856A8B053A764E995 + +Count = 935 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DB4F403BF3884B3C6 + +Count = 936 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C4A233DC8F99739AE + +Count = 937 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F928148249962D7520A + +Count = 938 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F50F5BB6DDE6C24AA1 + +Count = 939 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F867057601527F87410AF + +Count = 940 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB96228262160A3CD52EB5 + +Count = 941 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD6231191E9A09AC001BEF8 + +Count = 942 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C93404788FC26E055E9 + +Count = 943 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CDF793F03727D02701 + +Count = 944 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D561D3412CF2428C44 + +Count = 945 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C57E9670A1069FA52 + +Count = 946 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314AD264FA201C8BBF536 + +Count = 947 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC143866DB8C6961EF25DD + +Count = 948 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1010E5F67734A220DD + +Count = 949 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87D4976B5CCC6BEF40 + +Count = 950 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4DEC56358E1A041CEE + +Count = 951 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BBCB951B0F3B28FB + +Count = 952 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A6B939CCFD0D5BF6B + +Count = 953 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F450873730AF94FFF8CC276D + +Count = 954 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F0AECEFCB9859D67A + +Count = 955 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FB736461FA6B8AB11 + +Count = 956 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0E8994BFD66F248D7 + +Count = 957 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F0393BC69FED0BA89CC + +Count = 958 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA0B7D4047B15AAD6F + +Count = 959 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB42329054316ABBAFB9E4974EE7 + +Count = 960 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C9418DF611ACA8983115 + +Count = 961 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F910DF2A6B6C760AC45 + +Count = 962 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18D39A7EBBB280F1606 + +Count = 963 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDE9BA142A4025D7100 + +Count = 964 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C5193074F377A16ECA9B4D + +Count = 965 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A59B7492E1EB30AC11 + +Count = 966 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516ECA3B633E83D60ECE + +Count = 967 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83BF4A147A583349395 + +Count = 968 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBAE25958C81B169E11 + +Count = 969 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C8533289C13B63DAD31 + +Count = 970 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F9205A595C5631C7FD2DF + +Count = 971 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F41C8A2D0A5733B90 + +Count = 972 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700EBDF385A1D9EAEA77 + +Count = 973 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622420D7F9E7A0534BE97 + +Count = 974 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311975F5E0514F9B6B807 + +Count = 975 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935D7A7573943468CBF4 + +Count = 976 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29082912405E3FD0E3 + +Count = 977 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D508B50ED23A0A87A7B7 + +Count = 978 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3BEA674E1C034FEE41 + +Count = 979 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB008308C2454CAE149 + +Count = 980 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC14386093A51C79B14E2317 + +Count = 981 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023738A28DAE01200E1 + +Count = 982 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BFC05537298A33E0E1 + +Count = 983 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D881E4829FC24149CAD + +Count = 984 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BAF97AC6787AE481BE + +Count = 985 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A97A0B58088F23805E5 + +Count = 986 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F450873780CF2316BEF20722EA + +Count = 987 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F75E19421AA01EA0E8A + +Count = 988 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA7ED1E5CE64B773ECA + +Count = 989 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0440AECD1B3586BB301 + +Count = 990 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EAFBE9709E0C1A0938 + +Count = 991 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6B143B0AEF84328F81 + +Count = 992 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E462AD039A5AD19A83 + +Count = 993 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA8792685028591D01 + +Count = 994 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917CC6C79D53C9A1BB6F + +Count = 995 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC1B8381F197E89FF3 + +Count = 996 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB0B79955F41804F8D2 + +Count = 997 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F86DE0B756796B4A1 + +Count = 998 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F0CA6EA7E9BAEECB74 + +Count = 999 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3DCC2764921D6931E3 + +Count = 1000 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2EE24B6027001324AB + +Count = 1001 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA444DA91F946F413C22 + +Count = 1002 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C858261C5D099A8EB1140 + +Count = 1003 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F92053494DBCB03854C1245 + +Count = 1004 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F064A30AB949E987C1C + +Count = 1005 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2CCBF38676A53AED3D + +Count = 1006 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FFCB836DA52C3D92B + +Count = 1007 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AE14B17ADCC679EE2 + +Count = 1008 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA385136D7AC737593F + +Count = 1009 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BAAFF4B7F0B56C093B + +Count = 1010 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D508336D9D599C02D1659E + +Count = 1011 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39E699C09EEA254C76 + +Count = 1012 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E4D809AAD1038F1EC + +Count = 1013 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603D1DBCA61EACF9D4FA + +Count = 1014 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC6DFD63392AF61A13 + +Count = 1015 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D2AFD449557A4CC33 + +Count = 1016 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872FC59D10E2700E048 + +Count = 1017 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA906FE1F1897E2EC8F2 + +Count = 1018 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978BDEF3EF6CBC7C5352 + +Count = 1019 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F4508737804939477EBAAD33A322 + +Count = 1020 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F750995D728A1F05A0415 + +Count = 1021 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA7909598CA0AE405F3F7 + +Count = 1022 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BECB59D81B49BEDFF + +Count = 1023 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA74C94657D342F518 + +Count = 1024 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6BD738040A94DBE6F683 + +Count = 1025 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E48B1E1FCBA710F58646 + +Count = 1026 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA9B868E88FD2FD9C3EB + +Count = 1027 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917C34D9BD7E168834010A + +Count = 1028 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC65903DD27920663C9D + +Count = 1029 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB04326D779C2F20CB9B5 + +Count = 1030 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F72EAE0BAF5504C71F9 + +Count = 1031 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F070142D4DE733FE8EA9 + +Count = 1032 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3D99C7E6E2610AD1390B + +Count = 1033 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2E567FEBBC61CEA25164 + +Count = 1034 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA448D5A41FB8899F65CFE + +Count = 1035 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C85824BE68469789500120A + +Count = 1036 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F920534B3503B401FEDCFC12C + +Count = 1037 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F064911CC128B3AEDC5EA + +Count = 1038 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2C374EE18FA3986279BA + +Count = 1039 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FEA46DCBCEBC215745D + +Count = 1040 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AF97A56D838FC4F5C7B + +Count = 1041 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA3E00AC0F835B6EBB0FF + +Count = 1042 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BADF3C0A8B47F38463C0 + +Count = 1043 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D50833C89DC18F915F801488 + +Count = 1044 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39A458EED32A0FE5DED1 + +Count = 1045 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E5F1FEA39A5FF9E9E19 + +Count = 1046 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603DF0E52F97A4291B521E + +Count = 1047 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC42CFFBAF6CD2277684 + +Count = 1048 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D5DEE3C130BF18B7A70 + +Count = 1049 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872A5DF58A473D233DA86 + +Count = 1050 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA90002163D163FD8ED0AD + +Count = 1051 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978B360869B1DCC51E0F51 + +Count = 1052 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087378049FEB8C77D04B0D532BE + +Count = 1053 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F7509EF8675EA7CBEB083D7 + +Count = 1054 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA790A58D535EE2C64EA11F + +Count = 1055 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BA559E7A54670CCCB7A + +Count = 1056 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA21A84D85352EC7CFCF + +Count = 1057 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = +CT = 0F100748039646FB86A69E9CBCAB40236F40194F030F97BCAB727A9ACA6BD743D699983303890EB7 + +Count = 1058 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00 +CT = 205E499F3C9CBFE0043337A3CD20118FF741A0B6F7F3F6CB4232905431E48B5A09161FDA4734B439 + +Count = 1059 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001 +CT = A6510C620A477073C19FB7AEA51A22A1154F8DC56D738E6D496430C941CA9BAE1A444025616E1BD6 + +Count = 1060 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102 +CT = B016869D49402B1AC77A5B5244E3F29137EA4691DE1DE7F6566F207F917C349E36583337C30D7E94 + +Count = 1061 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203 +CT = 02436555E615B6F7BC6773D1B5210E3B7C28548330D7E45380B621B18DFC65AA30E70B427C2437AE + +Count = 1062 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304 +CT = 9E821E2FBD3AA32831178AC74FA3C7ACE4F134E29E2B1088BB4B116DDEB043F95604E4CC0B6C71DB + +Count = 1063 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405 +CT = 6AB222DB94E65B1A9DFC067F2A650F9BCC34B1F453BD5D106927C519303F7291C529EDB492B30D57 + +Count = 1064 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506 +CT = 72DAE4B2E146FAE02D276BBB442F924A8F22E76AD9D40038BA95FB90A5F0705903C1DB1139F32A53 + +Count = 1065 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 0001020304050607 +CT = 5204EE553EFC4269D9E96E13CB6A8B4AC4F0E26EBE4D4860E5E253516E3D99423B447E8279690ADD + +Count = 1066 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708 +CT = 5BF7E60280536AC6AD7B63A623C2D808C35E21ECCFE70B9742C82DB83B2E56DFC9AF7D62F0306DBE + +Count = 1067 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 00010203040506070809 +CT = 34660D5ED378B6AB48342ADFA660FADD9D966088018619F375F41E0DBA448DF663DA804C4B09343F + +Count = 1068 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A +CT = C701B9E9E02D31286575F8F8B3C957D67A9C2B2F26FD28B2AD515A9C85824BCF900461DF10E094BC + +Count = 1069 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B +CT = 16A4179E9442E1F24E04015061E0F393753E93C25D20E16A53169F920534B3BFA38A450C66E979B2 + +Count = 1070 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C +CT = DCC52F22BEF01D6A7944124DFA194AFABB063A09348A29D2CCD040F56F0649819C00B92F01B424D5 + +Count = 1071 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D +CT = EAA0699049C18B6053583B644E3332988558C3BBC06940A4684F86700E2C377BE8FEC58C75A47F28 + +Count = 1072 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E +CT = 0E8683360C64F7FD95D29BD9CDE45B3E4DE63C194C0F6B1503FB9622423FEA5D8EC4E2E501BD6FBC + +Count = 1073 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F +CT = 6A05E9F1EE4CC7857E80E1EB60F5F7E2CCAC8F3E751F19FA0DD62311971AF9A376E20BC87B39E464 + +Count = 1074 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10 +CT = 94F8F93083F2D451617A305D403023F5FA55C518C4C31296EDC06C935DA3E0665468B0F679912FCE + +Count = 1075 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011 +CT = E4A1D9FC8EE5523DB58CC09C569BA96D4EE700E14A1A518735D276CD29BADFD4477EE4C491D46434 + +Count = 1076 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112 +CT = ADB1F076D6F61B8105E9F1CF9AD306017783F300361067CFD6D365D50833C8846270F53316E8851E + +Count = 1077 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213 +CT = 4E4BF0FC0FB70D5A796E9F67FC094F606019CDA9892786EA4A37247C3B39A4E74814EBDD448D00CF + +Count = 1078 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314 +CT = 109FD1ABC138DF9510635D86429223D47E109D793DDCF1F0AD0314ADB06E5FBD7048941C680CC7CC + +Count = 1079 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415 +CT = 694C82D55EB1ED83F94A4DAFE25536A1E065C568893A1739FBBC1438603DF0462565092F0C307009 + +Count = 1080 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516 +CT = DFF16CFDEEB68EEE820CB6A3DB8EB24B1946940D581F15D258A3DB1023CC4250677244490885DB92 + +Count = 1081 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F1011121314151617 +CT = FD429BAEEDDE93ADFF44CB7F100807D600275D35961F2EDDDFDB6F87BF5D5D99D441AE08D4410987 + +Count = 1082 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718 +CT = 051F4879B1CC2F0723493B13FC58AF5D84F61646DF925BA8EF490D4D8872A511FEEE8EA4B36B42F3 + +Count = 1083 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 +CT = AF01A8102134CE2DD5ABB4449992760779F647E2017B1DFFDB79DCD5BA90007D97D707696F56A765 + +Count = 1084 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A +CT = BFE7295A2E6E4417B2569B00CD657315C3438F94A012B994F2A1299A978B364C9289384827ED2BC6 + +Count = 1085 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +CT = 233497E54E9893FCB895DC9D19F197A147BE50F73D74F2B5F45087378049FE3EF9914808464DFA2E + +Count = 1086 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +CT = E601EE70194A916D0FC2747C6EEB62E037F330E5137876CAF244361F7509EFF3C523D43BFE946663 + +Count = 1087 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +CT = 211302DECD3D963839BCD257438830BDBE23E9F28852BACBC8C2691FA790A51C949AEC36B55C0508 + +Count = 1088 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +CT = 8D577F5339BD0574A756D951AC09278F405F305C40D45DF08996D7E0445BA56CD12AD5F04F9AE05A + +Count = 1089 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +CT = A5628DF713D43162E824E6202B373B997247DA3AD513B2AE34863F03EABA21545FB318EE9CACC3BB + diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.c b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.h b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/api.h b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/api.h new file mode 100644 index 0000000..fd4ff9f --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 32 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 12 +#define CRYPTO_ABYTES 8 +#define CRYPTO_NOOVERLAP 1 diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/encrypt.c b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/encrypt.c new file mode 100644 index 0000000..357b9fe --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "tinyjambu.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_256_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return tiny_jambu_256_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu-avr.S b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu-avr.S new file mode 100644 index 0000000..c7f2d1c --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu-avr.S @@ -0,0 +1,471 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global tiny_jambu_permutation + .type tiny_jambu_permutation, @function +tiny_jambu_permutation: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + movw r26,r24 + movw r30,r22 +.L__stack_usage = 18 + ld r22,X+ + ld r23,X+ + ld r28,X+ + ld r29,X+ + ld r2,X+ + ld r3,X+ + ld r4,X+ + ld r5,X+ + ld r6,X+ + ld r7,X+ + ld r8,X+ + ld r9,X+ + ld r10,X+ + ld r11,X+ + ld r12,X+ + ld r13,X+ + lsl r20 + lsl r20 + mov r19,r1 +19: + movw r24,r4 + movw r16,r6 + mov r15,r3 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r22,r24 + eor r23,r25 + eor r28,r16 + eor r29,r17 + mov r14,r7 + mov r15,r8 + mov r24,r9 + mov r25,r10 + mov r0,r6 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r9 + mov r0,r8 + mov r17,r10 + mov r21,r11 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r11 + mov r17,r12 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r10 + movw r16,r12 + mov r15,r9 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r22,r15 + eor r23,r24 + eor r28,r25 + eor r29,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r22,r14 + eor r23,r15 + eor r28,r24 + eor r29,r25 + movw r24,r8 + movw r16,r10 + mov r15,r7 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r2,r24 + eor r3,r25 + eor r4,r16 + eor r5,r17 + mov r14,r11 + mov r15,r12 + mov r24,r13 + mov r25,r22 + mov r0,r10 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r13 + mov r0,r12 + mov r17,r22 + mov r21,r23 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r23 + mov r17,r28 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r22 + movw r16,r28 + mov r15,r13 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r2,r15 + eor r3,r24 + eor r4,r25 + eor r5,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r2,r14 + eor r3,r15 + eor r4,r24 + eor r5,r25 + movw r24,r12 + movw r16,r22 + mov r15,r11 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r6,r24 + eor r7,r25 + eor r8,r16 + eor r9,r17 + mov r14,r23 + mov r15,r28 + mov r24,r29 + mov r25,r2 + mov r0,r22 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r29 + mov r0,r28 + mov r17,r2 + mov r21,r3 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r3 + mov r17,r4 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r2 + movw r16,r4 + mov r15,r29 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r6,r15 + eor r7,r24 + eor r8,r25 + eor r9,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r6,r14 + eor r7,r15 + eor r8,r24 + eor r9,r25 + movw r24,r28 + movw r16,r2 + mov r15,r23 + lsl r15 + rol r24 + rol r25 + rol r16 + rol r17 + eor r10,r24 + eor r11,r25 + eor r12,r16 + eor r13,r17 + mov r14,r3 + mov r15,r4 + mov r24,r5 + mov r25,r6 + mov r0,r2 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + lsl r0 + rol r14 + rol r15 + rol r24 + rol r25 + mov r16,r5 + mov r0,r4 + mov r17,r6 + mov r21,r7 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + lsl r0 + rol r16 + rol r17 + rol r21 + and r14,r16 + and r15,r17 + and r24,r21 + mov r16,r7 + mov r17,r8 + lsl r16 + rol r17 + lsl r16 + rol r17 + lsl r16 + rol r17 + and r25,r17 + com r14 + com r15 + com r24 + com r25 + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + movw r24,r6 + movw r16,r8 + mov r15,r5 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + lsr r17 + ror r16 + ror r25 + ror r24 + ror r15 + eor r10,r15 + eor r11,r24 + eor r12,r25 + eor r13,r16 + ld r14,Z+ + ld r15,Z+ + ld r24,Z+ + ld r25,Z+ + eor r10,r14 + eor r11,r15 + eor r12,r24 + eor r13,r25 + dec r18 + breq 401f + subi r19,240 + cp r19,r20 + breq 5396f + rjmp 19b +5396: + sub r30,r20 + sbc r31,r1 + mov r19,r1 + rjmp 19b +401: + st -X,r13 + st -X,r12 + st -X,r11 + st -X,r10 + st -X,r9 + st -X,r8 + st -X,r7 + st -X,r6 + st -X,r5 + st -X,r4 + st -X,r3 + st -X,r2 + st -X,r29 + st -X,r28 + st -X,r23 + st -X,r22 + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size tiny_jambu_permutation, .-tiny_jambu_permutation + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.c new file mode 100644 index 0000000..7f6fcf2 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.c @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-tinyjambu.h" + +#if !defined(__AVR__) + +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds) +{ + uint32_t t1, t2, t3, t4; + unsigned round; + + /* Load the state into local variables */ + uint32_t s0 = state[0]; + uint32_t s1 = state[1]; + uint32_t s2 = state[2]; + uint32_t s3 = state[3]; + + /* Perform all permutation rounds. Each round consists of 128 steps, + * which can be performed 32 at a time plus a rotation. After four + * sets of 32 steps, the rotation order returns to the original position. + * So we can hide the rotations by doing 128 steps each round */ + for (round = 0; round < rounds; ++round) { + /* Get the key words to use during this round */ + const uint32_t *k = &(key[(round * 4) % key_words]); + + /* Perform the 128 steps of this round in groups of 32 */ + #define tiny_jambu_steps_32(s0, s1, s2, s3, offset) \ + do { \ + t1 = (s1 >> 15) | (s2 << 17); \ + t2 = (s2 >> 6) | (s3 << 26); \ + t3 = (s2 >> 21) | (s3 << 11); \ + t4 = (s2 >> 27) | (s3 << 5); \ + s0 ^= t1 ^ (~(t2 & t3)) ^ t4 ^ k[offset]; \ + } while (0) + tiny_jambu_steps_32(s0, s1, s2, s3, 0); + tiny_jambu_steps_32(s1, s2, s3, s0, 1); + tiny_jambu_steps_32(s2, s3, s0, s1, 2); + tiny_jambu_steps_32(s3, s0, s1, s2, 3); + } + + /* Store the local variables back to the state */ + state[0] = s0; + state[1] = s1; + state[2] = s2; + state[3] = s3; +} + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.h new file mode 100644 index 0000000..f3bc599 --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-tinyjambu.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_TINYJAMBU_H +#define LW_INTERNAL_TINYJAMBU_H + +#include "internal-util.h" + +/** + * \file internal-tinyjambu.h + * \brief Internal implementation of the TinyJAMBU permutation. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the TinyJAMBU state in 32-bit words. + */ +#define TINY_JAMBU_STATE_SIZE 4 + +/** + * \brief Converts a number of steps into a number of rounds, where each + * round consists of 128 steps. + * + * \param steps The number of steps to perform; 384, 1024, 1152, or 1280. + * + * \return The number of rounds corresponding to \a steps. + */ +#define TINYJAMBU_ROUNDS(steps) ((steps) / 128) + +/** + * \brief Perform the TinyJAMBU permutation. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform. + * + * The number of key words should be 4 for TinyJAMBU-128, 12 for TinyJAMBU-192, + * and 8 for TinuJAMBU-256. The TinyJAMBU-192 key is duplicated so that the + * \a key_words parameter is a multiple of 4. + */ +void tiny_jambu_permutation + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-util.h b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.c b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.c new file mode 100644 index 0000000..09fc41d --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.c @@ -0,0 +1,487 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "tinyjambu.h" +#include "internal-tinyjambu.h" +#include + +aead_cipher_t const tiny_jambu_128_cipher = { + "TinyJAMBU-128", + TINY_JAMBU_128_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_128_aead_encrypt, + tiny_jambu_128_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_192_cipher = { + "TinyJAMBU-192", + TINY_JAMBU_192_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_192_aead_encrypt, + tiny_jambu_192_aead_decrypt +}; + +aead_cipher_t const tiny_jambu_256_cipher = { + "TinyJAMBU-256", + TINY_JAMBU_256_KEY_SIZE, + TINY_JAMBU_NONCE_SIZE, + TINY_JAMBU_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + tiny_jambu_256_aead_encrypt, + tiny_jambu_256_aead_decrypt +}; + +/** + * \brief Set up the TinyJAMBU state with the key and the nonce. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to absorb the key. + * \param nonce Points to the nonce. + * + * \sa tiny_jambu_permutation() + */ +static void tiny_jambu_setup + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, const unsigned char *nonce) +{ + /* Initialize the state with the key */ + memset(state, 0, TINY_JAMBU_STATE_SIZE * sizeof(uint32_t)); + tiny_jambu_permutation(state, key, key_words, rounds); + + /* Absorb the three 32-bit words of the 96-bit nonce */ + state[1] ^= 0x10; /* Domain separator for the nonce */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 4); + state[1] ^= 0x10; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(nonce + 8); +} + +/** + * \brief Processes the associated data for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param ad Points to the associated data. + * \param adlen Length of the associated data in bytes. + */ +static void tiny_jambu_process_ad + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, const unsigned char *ad, unsigned long long adlen) +{ + /* Process as many full 32-bit words as we can */ + while (adlen >= 4) { + state[1] ^= 0x30; /* Domain separator for associated data */ + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word32(ad); + ad += 4; + adlen -= 4; + } + + /* Handle the left-over associated data bytes, if any */ + if (adlen == 1) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= ad[0]; + state[1] ^= 0x01; + } else if (adlen == 2) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad); + state[1] ^= 0x02; + } else if (adlen == 3) { + state[1] ^= 0x30; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + state[3] ^= le_load_word16(ad) | (((uint32_t)(ad[2])) << 16); + state[1] ^= 0x03; + } +} + +/** + * \brief Encrypts the plaintext with TinyJAMBU to produce the ciphertext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the plaintext. + * \param c Points to the ciphertext output buffer. + * \param m Points to the plaintext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_encrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *c, + const unsigned char *m, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(m); + state[3] ^= data; + data ^= state[2]; + le_store_word32(c, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over plaintext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = m[0]; + state[3] ^= data; + state[1] ^= 0x01; + c[0] = (uint8_t)(state[2] ^ data); + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m); + state[3] ^= data; + state[1] ^= 0x02; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(m) | (((uint32_t)(m[2])) << 16); + state[3] ^= data; + state[1] ^= 0x03; + data ^= state[2]; + c[0] = (uint8_t)data; + c[1] = (uint8_t)(data >> 8); + c[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Decrypts the ciphertext with TinyJAMBU to produce the plaintext. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to process the ciphertext. + * \param m Points to the plaintext output buffer. + * \param c Points to the ciphertext input buffer. + * \param mlen Length of the plaintext in bytes. + */ +static void tiny_jambu_decrypt + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *m, + const unsigned char *c, unsigned long long mlen) +{ + uint32_t data; + + /* Process as many full 32-bit words as we can */ + while (mlen >= 4) { + state[1] ^= 0x50; /* Domain separator for message data */ + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word32(c) ^ state[2]; + state[3] ^= data; + le_store_word32(m, data); + c += 4; + m += 4; + mlen -= 4; + } + + /* Handle the left-over ciphertext data bytes, if any */ + if (mlen == 1) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (c[0] ^ state[2]) & 0xFFU; + state[3] ^= data; + state[1] ^= 0x01; + m[0] = (uint8_t)data; + } else if (mlen == 2) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = (le_load_word16(c) ^ state[2]) & 0xFFFFU; + state[3] ^= data; + state[1] ^= 0x02; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + } else if (mlen == 3) { + state[1] ^= 0x50; + tiny_jambu_permutation(state, key, key_words, rounds); + data = le_load_word16(c) | (((uint32_t)(c[2])) << 16); + data = (data ^ state[2]) & 0xFFFFFFU; + state[3] ^= data; + state[1] ^= 0x03; + m[0] = (uint8_t)data; + m[1] = (uint8_t)(data >> 8); + m[2] = (uint8_t)(data >> 16); + } +} + +/** + * \brief Generates the final authentication tag for TinyJAMBU. + * + * \param state TinyJAMBU state to be permuted. + * \param key Points to the key words. + * \param key_words The number of words in the key. + * \param rounds The number of rounds to perform to generate the tag. + * \param tag Buffer to receive the tag. + */ +static void tiny_jambu_generate_tag + (uint32_t state[TINY_JAMBU_STATE_SIZE], const uint32_t *key, + unsigned key_words, unsigned rounds, unsigned char *tag) +{ + state[1] ^= 0x70; /* Domain separator for finalization */ + tiny_jambu_permutation(state, key, key_words, rounds); + le_store_word32(tag, state[2]); + state[1] ^= 0x70; + tiny_jambu_permutation(state, key, key_words, TINYJAMBU_ROUNDS(384)); + le_store_word32(tag + 4, state[2]); +} + +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), c + mlen); + return 0; +} + +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[4]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 4, TINYJAMBU_ROUNDS(1024), npub); + tiny_jambu_process_ad(state, key, 4, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 4, TINYJAMBU_ROUNDS(1024), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 4, TINYJAMBU_ROUNDS(1024), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), c + mlen); + return 0; +} + +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[12]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key and duplicate it to make the length a multiple of 4 */ + key[6] = key[0] = le_load_word32(k); + key[7] = key[1] = le_load_word32(k + 4); + key[8] = key[2] = le_load_word32(k + 8); + key[9] = key[3] = le_load_word32(k + 12); + key[10] = key[4] = le_load_word32(k + 16); + key[11] = key[5] = le_load_word32(k + 20); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 12, TINYJAMBU_ROUNDS(1152), npub); + tiny_jambu_process_ad(state, key, 12, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 12, TINYJAMBU_ROUNDS(1152), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 12, TINYJAMBU_ROUNDS(1152), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} + +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + tiny_jambu_encrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), c, m, mlen); + + /* Generate the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), c + mlen); + return 0; +} + +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + uint32_t state[TINY_JAMBU_STATE_SIZE]; + uint32_t key[8]; + unsigned char tag[TINY_JAMBU_TAG_SIZE]; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < TINY_JAMBU_TAG_SIZE) + return -1; + *mlen = clen - TINY_JAMBU_TAG_SIZE; + + /* Unpack the key */ + key[0] = le_load_word32(k); + key[1] = le_load_word32(k + 4); + key[2] = le_load_word32(k + 8); + key[3] = le_load_word32(k + 12); + key[4] = le_load_word32(k + 16); + key[5] = le_load_word32(k + 20); + key[6] = le_load_word32(k + 24); + key[7] = le_load_word32(k + 28); + + /* Set up the TinyJAMBU state with the key, nonce, and associated data */ + tiny_jambu_setup(state, key, 8, TINYJAMBU_ROUNDS(1280), npub); + tiny_jambu_process_ad(state, key, 8, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + tiny_jambu_decrypt(state, key, 8, TINYJAMBU_ROUNDS(1280), m, c, *mlen); + + /* Check the authentication tag */ + tiny_jambu_generate_tag(state, key, 8, TINYJAMBU_ROUNDS(1280), tag); + return aead_check_tag(m, *mlen, tag, c + *mlen, TINY_JAMBU_TAG_SIZE); +} diff --git a/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.h b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.h new file mode 100644 index 0000000..cb304ff --- /dev/null +++ b/tinyjambu/Implementations/crypto_aead/tinyjambu256/rhys-avr/tinyjambu.h @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_TINYJAMBU_H +#define LWCRYPTO_TINYJAMBU_H + +#include "aead-common.h" + +/** + * \file tinyjambu.h + * \brief TinyJAMBU authenticated encryption algorithm. + * + * TinyJAMBU is a family of encryption algorithms that are built around a + * lightweight 128-bit permutation. There are three variants of TinyJAMBU + * with different key sizes: + * + * \li TinyJAMBU-128 with a 128-bit key, a 96-bit nonce, and a 64-bit tag. + * This is the primary member of the family. + * \li TinyJAMBU-192 with a 192-bit key, a 96-bit nonce, and a 64-bit tag. + * \li TinyJAMBU-256 with a 256-bit key, a 96-bit nonce, and a 64-bit tag. + * + * TinyJAMBU has one of the smallest RAM and flash memory footprints + * out of all the algorithms in this library. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for TinyJAMBU-128. + */ +#define TINY_JAMBU_128_KEY_SIZE 16 + +/** + * \brief Size of the key for TinyJAMBU-192. + */ +#define TINY_JAMBU_192_KEY_SIZE 24 + +/** + * \brief Size of the key for TinyJAMBU-256. + */ +#define TINY_JAMBU_256_KEY_SIZE 32 + +/** + * \brief Size of the authentication tag for all TinyJAMBU variants. + */ +#define TINY_JAMBU_TAG_SIZE 8 + +/** + * \brief Size of the nonce for all TinyJAMBU variants. + */ +#define TINY_JAMBU_NONCE_SIZE 12 + +/** + * \brief Meta-information block for the TinyJAMBU-128 cipher. + */ +extern aead_cipher_t const tiny_jambu_128_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-192 cipher. + */ +extern aead_cipher_t const tiny_jambu_192_cipher; + +/** + * \brief Meta-information block for the TinyJAMBU-256 cipher. + */ +extern aead_cipher_t const tiny_jambu_256_cipher; + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-128. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_128_aead_decrypt() + */ +int tiny_jambu_128_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-128. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_128_aead_encrypt() + */ +int tiny_jambu_128_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-192. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_192_aead_decrypt() + */ +int tiny_jambu_192_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-192. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 24 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_192_aead_encrypt() + */ +int tiny_jambu_192_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Encrypts and authenticates a packet with TinyJAMBU-256. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 8 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa tiny_jambu_256_aead_decrypt() + */ +int tiny_jambu_256_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with TinyJAMBU-256. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 8 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 12 bytes in length. + * \param k Points to the 32 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa tiny_jambu_256_aead_encrypt() + */ +int tiny_jambu_256_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.c b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.h b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/api.h b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/encrypt.c b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/encrypt.c new file mode 100644 index 0000000..0ed30f7 --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "wage.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return wage_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return wage_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-util.h b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.c b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.c new file mode 100644 index 0000000..e9528c9 --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.c @@ -0,0 +1,512 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-wage.h" + +/** + * \brief Number of rounds for the WAGE permutation. + */ +#define WAGE_NUM_ROUNDS 111 + +/** + * \brief Define WAGE_64BIT to use the 64-bit version of the WAGE core + * permutation. Undefine to use the 8-bit version instead. + */ +#define WAGE_64BIT 1 + +/** + * \brief RC0 and RC1 round constants for WAGE, interleaved with each other. + */ +static unsigned char const wage_rc[WAGE_NUM_ROUNDS * 2] = { + 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x41, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x43, 0x21, 0x50, 0x28, 0x14, + 0x0a, 0x45, 0x62, 0x71, 0x78, 0x3c, 0x1e, 0x4f, 0x27, 0x13, 0x09, 0x44, + 0x22, 0x51, 0x68, 0x34, 0x1a, 0x4d, 0x66, 0x73, 0x39, 0x5c, 0x2e, 0x57, + 0x2b, 0x15, 0x4a, 0x65, 0x72, 0x79, 0x7c, 0x3e, 0x5f, 0x2f, 0x17, 0x0b, + 0x05, 0x42, 0x61, 0x70, 0x38, 0x1c, 0x0e, 0x47, 0x23, 0x11, 0x48, 0x24, + 0x12, 0x49, 0x64, 0x32, 0x59, 0x6c, 0x36, 0x5b, 0x2d, 0x56, 0x6b, 0x35, + 0x5a, 0x6d, 0x76, 0x7b, 0x3d, 0x5e, 0x6f, 0x37, 0x1b, 0x0d, 0x46, 0x63, + 0x31, 0x58, 0x2c, 0x16, 0x4b, 0x25, 0x52, 0x69, 0x74, 0x3a, 0x5d, 0x6e, + 0x77, 0x3b, 0x1d, 0x4e, 0x67, 0x33, 0x19, 0x4c, 0x26, 0x53, 0x29, 0x54, + 0x2a, 0x55, 0x6a, 0x75, 0x7a, 0x7d, 0x7e, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, + 0x03, 0x01, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x41, 0x60, 0x30, 0x18, + 0x0c, 0x06, 0x43, 0x21, 0x50, 0x28, 0x14, 0x0a, 0x45, 0x62, 0x71, 0x78, + 0x3c, 0x1e, 0x4f, 0x27, 0x13, 0x09, 0x44, 0x22, 0x51, 0x68, 0x34, 0x1a, + 0x4d, 0x66, 0x73, 0x39, 0x5c, 0x2e, 0x57, 0x2b, 0x15, 0x4a, 0x65, 0x72, + 0x79, 0x7c, 0x3e, 0x5f, 0x2f, 0x17, 0x0b, 0x05, 0x42, 0x61, 0x70, 0x38, + 0x1c, 0x0e, 0x47, 0x23, 0x11, 0x48, 0x24, 0x12, 0x49, 0x64, 0x32, 0x59, + 0x6c, 0x36, 0x5b, 0x2d, 0x56, 0x6b, 0x35, 0x5a, 0x6d, 0x76, 0x7b, 0x3d, + 0x5e, 0x6f, 0x37, 0x1b, 0x0d, 0x46 +}; + +/** + * \brief Apply the WGP permutation to a 7-bit component. + * + * Warning: This is not constant cache. + */ +static unsigned char const wage_wgp[128] = { + 0x00, 0x12, 0x0a, 0x4b, 0x66, 0x0c, 0x48, 0x73, 0x79, 0x3e, 0x61, 0x51, + 0x01, 0x15, 0x17, 0x0e, 0x7e, 0x33, 0x68, 0x36, 0x42, 0x35, 0x37, 0x5e, + 0x53, 0x4c, 0x3f, 0x54, 0x58, 0x6e, 0x56, 0x2a, 0x1d, 0x25, 0x6d, 0x65, + 0x5b, 0x71, 0x2f, 0x20, 0x06, 0x18, 0x29, 0x3a, 0x0d, 0x7a, 0x6c, 0x1b, + 0x19, 0x43, 0x70, 0x41, 0x49, 0x22, 0x77, 0x60, 0x4f, 0x45, 0x55, 0x02, + 0x63, 0x47, 0x75, 0x2d, 0x40, 0x46, 0x7d, 0x5c, 0x7c, 0x59, 0x26, 0x0b, + 0x09, 0x03, 0x57, 0x5d, 0x27, 0x78, 0x30, 0x2e, 0x44, 0x52, 0x3b, 0x08, + 0x67, 0x2c, 0x05, 0x6b, 0x2b, 0x1a, 0x21, 0x38, 0x07, 0x0f, 0x4a, 0x11, + 0x50, 0x6a, 0x28, 0x31, 0x10, 0x4d, 0x5f, 0x72, 0x39, 0x16, 0x5a, 0x13, + 0x04, 0x3c, 0x34, 0x1f, 0x76, 0x1e, 0x14, 0x23, 0x1c, 0x32, 0x4e, 0x7b, + 0x24, 0x74, 0x7f, 0x3d, 0x69, 0x64, 0x62, 0x6f +}; + +/** + * \brief Evaluate the WAGE S-box three times in parallel. + * + * \param x6 The input values to the S-box. + * \return The output values from the S-box. + * + * This function directly evaluates the S-box in bit-sliced form + * using the algorithm from the specification. + */ +STATIC_INLINE uint32_t wage_sbox_parallel_3(uint32_t x6) +{ + uint32_t x0 = x6 >> 6; + uint32_t x1 = x6 >> 5; + uint32_t x2 = x6 >> 4; + uint32_t x3 = x6 >> 3; + uint32_t x4 = x6 >> 2; + uint32_t x5 = x6 >> 1; + x0 ^= (x2 & x3); x3 = ~x3; x3 ^= (x5 & x6); x5 = ~x5; x5 ^= (x2 & x4); + x6 ^= (x0 & x4); x4 = ~x4; x4 ^= (x5 & x1); x5 = ~x5; x5 ^= (x0 & x2); + x1 ^= (x6 & x2); x2 = ~x2; x2 ^= (x5 & x3); x5 = ~x5; x5 ^= (x6 & x0); + x3 ^= (x1 & x0); x0 = ~x0; x0 ^= (x5 & x4); x5 = ~x5; x5 ^= (x1 & x6); + x4 ^= (x3 & x6); x6 = ~x6; x6 ^= (x5 & x2); x5 = ~x5; x5 ^= (x3 & x1); + x2 ^= (x4 & x1); x1 = ~x1; x1 ^= (x5 & x0); x5 = ~x5; x5 ^= (x4 & x3); + x2 = ~x2; x4 = ~x4; + return ((x2 & 0x00010101U) << 6) ^ + ((x6 & 0x00010101U) << 5) ^ + ((x4 & 0x00010101U) << 4) ^ + ((x1 & 0x00010101U) << 3) ^ + ((x3 & 0x00010101U) << 2) ^ + ((x5 & 0x00010101U) << 1) ^ + (x0 & 0x00010101U); +} + +void wage_permute(unsigned char s[WAGE_STATE_SIZE]) +{ +#if defined(WAGE_64BIT) + const unsigned char *rc = wage_rc; + unsigned char round; + uint64_t x0, x1, x2, x3, x4; + uint32_t fb, temp; + + /* Load the state into 64-bit words. Each word will have up to eight + * 7-bit components with the MSB of each component fixed at zero. + * + * x0 = s[0] .. s[7] + * x1 = s[8] .. s[15] + * x2 = s[16] .. s[23] + * x3 = s[24] .. s[31] + * x4 = s[32] .. s[36] + */ + x0 = le_load_word64(s); + x1 = le_load_word64(s + 8); + x2 = le_load_word64(s + 16); + x3 = le_load_word64(s + 24); + x4 = le_load_word32(s + 32) | (((uint64_t)(s[36])) << 32); + + /* Perform all rounds 3 at a time to reduce the state rotation overhead */ + for (round = 0; round < (WAGE_NUM_ROUNDS / 3); ++round, rc += 6) { + /* Calculate the feedback value for the LFSR. + * + * fb = omega(s[0]) ^ s[6] ^ s[8] ^ s[12] ^ s[13] ^ s[19] ^ + * s[24] ^ s[26] ^ s[30] ^ s[31] ^ WGP(s[36]) ^ RC1[round] + * + * where omega(x) is (x >> 1) if the low bit of x is zero and + * (x >> 1) ^ 0x78 if the low bit of x is one. + */ + /* fb0 = omega(s[0]), fb1 = omega(s[1]), fb2 = omega(s[2]) */ + temp = (uint32_t)x0; + fb = (temp & 0x00010101U) << 6; + fb ^= (fb >> 1); + fb ^= (fb >> 2); + fb ^= (temp >> 1) & 0x003F3F3FU; + /* fb0 ^= s[6], fb1 ^= s[7], fb2 ^= s[8] */ + fb ^= (uint32_t)(x0 >> 48); + fb ^= ((uint32_t)x1) << 16; + /* fb0 ^= s[8], fb1 ^= s[9], fb2 ^= s[10] */ + fb ^= (uint32_t)x1; + /* fb0 ^= s[12], fb1 ^= s[13], fb2 ^= s[14] */ + fb ^= (uint32_t)(x1 >> 32); + /* fb0 ^= s[13], fb1 ^= s[14], fb2 ^= s[15] */ + fb ^= (uint32_t)(x1 >> 40); + /* fb0 ^= s[19], fb1 ^= s[20], fb2 ^= s[21] */ + fb ^= (uint32_t)(x2 >> 24); + /* fb0 ^= s[24], fb1 ^= s[25], fb2 ^= s[26] */ + fb ^= (uint32_t)x3; + /* fb0 ^= s[26], fb1 ^= s[27], fb2 ^= s[28] */ + fb ^= (uint32_t)(x3 >> 16); + /* fb0 ^= s[30], fb1 ^= s[31], fb2 ^= s[32] */ + fb ^= (uint32_t)(x3 >> 48); + fb ^= ((uint32_t)x4) << 16; + /* fb0 ^= s[31], fb1 ^= s[32], fb2 ^= s[33] */ + fb ^= (uint32_t)(x3 >> 56); + fb ^= ((uint32_t)x4) << 8; + /* fb0,1,2 ^= RC1 */ + temp = rc[1] | (((uint32_t)(rc[3])) << 8) | (((uint32_t)(rc[5])) << 16); + fb ^= temp; + /* fb0 ^= WGP(s[36]) */ + fb ^= wage_wgp[(uint8_t)(x4 >> 32)]; + /* fb1 ^= WGP(fb0) */ + fb ^= ((uint32_t)(wage_wgp[fb & 0xFF])) << 8; + /* fb2 ^= WGP(fb1) */ + fb ^= ((uint32_t)(wage_wgp[(fb >> 8) & 0xFF])) << 16; + + /* Apply the S-box and WGP permutation to certain components */ + /* s[5] ^= sbox[s[8]], s[6] ^= sbox[s[9]], s[7] ^= sbox[s[10]] */ + x0 ^= ((uint64_t)wage_sbox_parallel_3((uint32_t)x1)) << 40; + /* s[11] ^= sbox[s[15]], s[12] ^= sbox[s[16]], s[13] ^= sbox[s[17]] */ + x1 ^= ((uint64_t)wage_sbox_parallel_3 + ((uint32_t)((x1 >> 56) | (x2 << 8)))) << 24; + /* s[24] ^= sbox[s[27]], s[25] ^= sbox[s[28]], s[26] ^= sbox[s[29]] */ + x3 ^= (uint64_t)wage_sbox_parallel_3((uint32_t)(x3 >> 24)); + /* s[30] ^= sbox[s[34]], s[31] ^= sbox[s[35]], s[32] ^= sbox[s[36]] */ + temp = wage_sbox_parallel_3((uint32_t)(x4 >> 16)); + x3 ^= ((uint64_t)temp) << 48; + x4 ^= temp >> 16; + /* s[19] ^= WGP[s[18]] ^ RC0 */ + temp = (uint32_t)(x2 >> 16); /* s[18..21] */ + temp ^= ((uint32_t)(wage_wgp[temp & 0x7F])) << 8; + temp ^= ((uint32_t)(rc[0])) << 8; + /* s[20] ^= WGP[s[19]] ^ RC0 */ + temp ^= ((uint32_t)(wage_wgp[(temp >> 8) & 0x7F])) << 16; + temp ^= ((uint32_t)(rc[2])) << 16; + /* s[21] ^= WGP[s[20]] ^ RC0 */ + temp ^= ((uint32_t)(wage_wgp[(temp >> 16) & 0x7F])) << 24; + temp ^= ((uint32_t)(rc[4])) << 24; + temp &= 0x7F7F7F00U; + x2 = (x2 & 0xFFFF000000FFFFFFULL) | (((uint64_t)temp) << 16); + + /* Rotate the components of the state by 3 positions */ + x0 = (x0 >> 24) | (x1 << 40); + x1 = (x1 >> 24) | (x2 << 40); + x2 = (x2 >> 24) | (x3 << 40); + x3 = (x3 >> 24) | (x4 << 40); + x4 = (x4 >> 24) | (((uint64_t)(fb & 0x00FFFFFFU)) << 16); + } + + /* Save the words back to the state */ + le_store_word64(s, x0); + le_store_word64(s + 8, x1); + le_store_word64(s + 16, x2); + le_store_word64(s + 24, x3); + le_store_word32(s + 32, (uint32_t)x4); + s[36] = (unsigned char)(x4 >> 32); +#else /* 8-bit version of WAGE */ + const unsigned char *rc = wage_rc; + unsigned char round, index; + unsigned char fb0, fb1, fb2; + uint32_t temp; + + /* Perform all rounds 3 at a time to reduce the state rotation overhead */ + for (round = 0; round < (WAGE_NUM_ROUNDS / 3); ++round, rc += 6) { + /* Calculate the feedback value for the LFSR. + * + * fb = omega(s[0]) ^ s[6] ^ s[8] ^ s[12] ^ s[13] ^ s[19] ^ + * s[24] ^ s[26] ^ s[30] ^ s[31] ^ WGP(s[36]) ^ RC1[round] + * + * where omega(x) is (x >> 1) if the low bit of x is zero and + * (x >> 1) ^ 0x78 if the low bit of x is one. + */ + fb0 = (s[0] >> 1) ^ (0x78 & -(s[0] & 0x01)); + fb0 ^= s[6] ^ s[8] ^ s[12] ^ s[13] ^ s[19] ^ + s[24] ^ s[26] ^ s[30] ^ s[31] ^ rc[1]; + fb0 ^= wage_wgp[s[36]]; + fb1 = (s[1] >> 1) ^ (0x78 & -(s[1] & 0x01)); + fb1 ^= s[7] ^ s[9] ^ s[13] ^ s[14] ^ s[20] ^ + s[25] ^ s[27] ^ s[31] ^ s[32] ^ rc[3]; + fb1 ^= wage_wgp[fb0]; + fb2 = (s[2] >> 1) ^ (0x78 & -(s[2] & 0x01)); + fb2 ^= s[8] ^ s[10] ^ s[14] ^ s[15] ^ s[21] ^ + s[26] ^ s[28] ^ s[32] ^ s[33] ^ rc[5]; + fb2 ^= wage_wgp[fb1]; + + /* Apply the S-box and WGP permutation to certain components */ + temp = s[8] | (((uint32_t)(s[9])) << 8) | (((uint32_t)(s[10])) << 16); + temp = wage_sbox_parallel_3(temp); + s[5] ^= (unsigned char)temp; + s[6] ^= (unsigned char)(temp >> 8); + s[7] ^= (unsigned char)(temp >> 16); + temp = s[15] | (((uint32_t)(s[16])) << 8) | (((uint32_t)(s[17])) << 16); + temp = wage_sbox_parallel_3(temp); + s[11] ^= (unsigned char)temp; + s[12] ^= (unsigned char)(temp >> 8); + s[13] ^= (unsigned char)(temp >> 16); + s[19] ^= wage_wgp[s[18]] ^ rc[0]; + s[20] ^= wage_wgp[s[19]] ^ rc[2]; + s[21] ^= wage_wgp[s[20]] ^ rc[4]; + temp = s[27] | (((uint32_t)(s[28])) << 8) | (((uint32_t)(s[29])) << 16); + temp = wage_sbox_parallel_3(temp); + s[24] ^= (unsigned char)temp; + s[25] ^= (unsigned char)(temp >> 8); + s[26] ^= (unsigned char)(temp >> 16); + temp = s[34] | (((uint32_t)(s[35])) << 8) | (((uint32_t)(s[36])) << 16); + temp = wage_sbox_parallel_3(temp); + s[30] ^= (unsigned char)temp; + s[31] ^= (unsigned char)(temp >> 8); + s[32] ^= (unsigned char)(temp >> 16); + + /* Rotate the components of the state by 3 positions */ + for (index = 0; index < WAGE_STATE_SIZE - 3; ++index) + s[index] = s[index + 3]; + s[WAGE_STATE_SIZE - 3] = fb0; + s[WAGE_STATE_SIZE - 2] = fb1; + s[WAGE_STATE_SIZE - 1] = fb2; + } +#endif +} + +/* 7-bit components for the rate: 8, 9, 15, 16, 18, 27, 28, 34, 35, 36 */ + +void wage_absorb + (unsigned char s[WAGE_STATE_SIZE], const unsigned char data[8], + unsigned char domain) +{ + uint32_t temp; + temp = be_load_word32(data); + s[8] ^= (unsigned char)(temp >> 25); + s[9] ^= (unsigned char)((temp >> 18) & 0x7F); + s[15] ^= (unsigned char)((temp >> 11) & 0x7F); + s[16] ^= (unsigned char)((temp >> 4) & 0x7F); + s[18] ^= (unsigned char)((temp << 3) & 0x7F); + temp = be_load_word32(data + 4); + s[18] ^= (unsigned char)(temp >> 29); + s[27] ^= (unsigned char)((temp >> 22) & 0x7F); + s[28] ^= (unsigned char)((temp >> 15) & 0x7F); + s[34] ^= (unsigned char)((temp >> 8) & 0x7F); + s[35] ^= (unsigned char)((temp >> 1) & 0x7F); + s[36] ^= (unsigned char)((temp << 6) & 0x7F); + s[0] ^= domain; +} + +void wage_get_rate + (const unsigned char s[WAGE_STATE_SIZE], unsigned char data[8]) +{ + uint32_t temp; + temp = ((uint32_t)(s[8])) << 25; + temp |= ((uint32_t)(s[9])) << 18; + temp |= ((uint32_t)(s[15])) << 11; + temp |= ((uint32_t)(s[16])) << 4; + temp |= ((uint32_t)(s[18])) >> 3; + be_store_word32(data, temp); + temp = ((uint32_t)(s[18])) << 29; + temp |= ((uint32_t)(s[27])) << 22; + temp |= ((uint32_t)(s[28])) << 15; + temp |= ((uint32_t)(s[34])) << 8; + temp |= ((uint32_t)(s[35])) << 1; + temp |= ((uint32_t)(s[36])) >> 6; + be_store_word32(data + 4, temp); +} + +void wage_set_rate + (unsigned char s[WAGE_STATE_SIZE], const unsigned char data[8], + unsigned char domain) +{ + uint32_t temp; + temp = be_load_word32(data); + s[8] = (unsigned char)(temp >> 25); + s[9] = (unsigned char)((temp >> 18) & 0x7F); + s[15] = (unsigned char)((temp >> 11) & 0x7F); + s[16] = (unsigned char)((temp >> 4) & 0x7F); + s[18] = (unsigned char)((temp << 3) & 0x7F); + temp = be_load_word32(data + 4); + s[18] ^= (unsigned char)(temp >> 29); + s[27] = (unsigned char)((temp >> 22) & 0x7F); + s[28] = (unsigned char)((temp >> 15) & 0x7F); + s[34] = (unsigned char)((temp >> 8) & 0x7F); + s[35] = (unsigned char)((temp >> 1) & 0x7F); + s[36] = (unsigned char)(((temp << 6) & 0x40) ^ (s[36] & 0x3F)); + s[0] ^= domain; +} + +/** + * \brief Converts a 128-bit value into an array of 7-bit components. + * + * \param out Points to the output array of 7-bit components. + * \param in Points to the 128-bit value to convert. + */ +static void wage_128bit_to_components + (unsigned char out[19], const unsigned char *in) +{ + uint32_t temp; + temp = be_load_word32(in); + out[0] = (unsigned char)(temp >> 25); + out[1] = (unsigned char)((temp >> 18) & 0x7F); + out[2] = (unsigned char)((temp >> 11) & 0x7F); + out[3] = (unsigned char)((temp >> 4) & 0x7F); + out[4] = (unsigned char)((temp << 3) & 0x7F); + temp = be_load_word32(in + 4); + out[4] ^= (unsigned char)(temp >> 29); + out[5] = (unsigned char)((temp >> 22) & 0x7F); + out[6] = (unsigned char)((temp >> 15) & 0x7F); + out[7] = (unsigned char)((temp >> 8) & 0x7F); + out[8] = (unsigned char)((temp >> 1) & 0x7F); + out[18] = (unsigned char)((temp << 6) & 0x7F); + temp = be_load_word32(in + 8); + out[9] = (unsigned char)(temp >> 25); + out[10] = (unsigned char)((temp >> 18) & 0x7F); + out[11] = (unsigned char)((temp >> 11) & 0x7F); + out[12] = (unsigned char)((temp >> 4) & 0x7F); + out[13] = (unsigned char)((temp << 3) & 0x7F); + temp = be_load_word32(in + 12); + out[13] ^= (unsigned char)(temp >> 29); + out[14] = (unsigned char)((temp >> 22) & 0x7F); + out[15] = (unsigned char)((temp >> 15) & 0x7F); + out[16] = (unsigned char)((temp >> 8) & 0x7F); + out[17] = (unsigned char)((temp >> 1) & 0x7F); + out[18] ^= (unsigned char)((temp << 5) & 0x20); +} + +void wage_absorb_key + (unsigned char s[WAGE_STATE_SIZE], const unsigned char *key) +{ + unsigned char components[19]; + wage_128bit_to_components(components, key); + s[8] ^= components[0]; + s[9] ^= components[1]; + s[15] ^= components[2]; + s[16] ^= components[3]; + s[18] ^= components[4]; + s[27] ^= components[5]; + s[28] ^= components[6]; + s[34] ^= components[7]; + s[35] ^= components[8]; + s[36] ^= components[18] & 0x40; + wage_permute(s); + s[8] ^= components[9]; + s[9] ^= components[10]; + s[15] ^= components[11]; + s[16] ^= components[12]; + s[18] ^= components[13]; + s[27] ^= components[14]; + s[28] ^= components[15]; + s[34] ^= components[16]; + s[35] ^= components[17]; + s[36] ^= (components[18] << 1) & 0x40; + wage_permute(s); +} + +void wage_init + (unsigned char s[WAGE_STATE_SIZE], + const unsigned char *key, const unsigned char *nonce) +{ + unsigned char components[19]; + + /* Initialize the state with the key and nonce */ + wage_128bit_to_components(components, key); + s[0] = components[0]; + s[1] = components[2]; + s[2] = components[4]; + s[3] = components[6]; + s[4] = components[8]; + s[5] = components[10]; + s[6] = components[12]; + s[7] = components[14]; + s[8] = components[16]; + s[18] = components[18]; + s[19] = components[1]; + s[20] = components[3]; + s[21] = components[5]; + s[22] = components[7]; + s[23] = components[9]; + s[24] = components[11]; + s[25] = components[13]; + s[26] = components[15]; + s[27] = components[17]; + wage_128bit_to_components(components, nonce); + s[9] = components[1]; + s[10] = components[3]; + s[11] = components[5]; + s[12] = components[7]; + s[13] = components[9]; + s[14] = components[11]; + s[15] = components[13]; + s[16] = components[17]; + s[17] = components[15]; + s[18] ^= (components[18] >> 2); + s[28] = components[0]; + s[29] = components[2]; + s[30] = components[4]; + s[31] = components[6]; + s[32] = components[8]; + s[33] = components[10]; + s[34] = components[12]; + s[35] = components[14]; + s[36] = components[16]; + + /* Permute the state to absorb the key and nonce */ + wage_permute(s); + + /* Absorb the key again and permute the state */ + wage_absorb_key(s, key); +} + +void wage_extract_tag + (const unsigned char s[WAGE_STATE_SIZE], unsigned char tag[16]) +{ + unsigned char components[19]; + uint32_t temp; + + /* Extract the 7-bit components that make up the tag */ + for (temp = 0; temp < 9; ++temp) { + components[temp * 2] = s[28 + temp]; + components[temp * 2 + 1] = s[ 9 + temp]; + } + components[18] = (s[18] << 2) & 0x60; + + /* Convert from 7-bit component form back into bytes */ + temp = ((uint32_t)(components[0])) << 25; + temp |= ((uint32_t)(components[1])) << 18; + temp |= ((uint32_t)(components[2])) << 11; + temp |= ((uint32_t)(components[3])) << 4; + temp |= ((uint32_t)(components[4])) >> 3; + be_store_word32(tag, temp); + temp = ((uint32_t)(components[4])) << 29; + temp |= ((uint32_t)(components[5])) << 22; + temp |= ((uint32_t)(components[6])) << 15; + temp |= ((uint32_t)(components[7])) << 8; + temp |= ((uint32_t)(components[8])) << 1; + temp |= ((uint32_t)(components[9])) >> 6; + be_store_word32(tag + 4, temp); + temp = ((uint32_t)(components[9])) << 26; + temp |= ((uint32_t)(components[10])) << 19; + temp |= ((uint32_t)(components[11])) << 12; + temp |= ((uint32_t)(components[12])) << 5; + temp |= ((uint32_t)(components[13])) >> 2; + be_store_word32(tag + 8, temp); + temp = ((uint32_t)(components[13])) << 30; + temp |= ((uint32_t)(components[14])) << 23; + temp |= ((uint32_t)(components[15])) << 16; + temp |= ((uint32_t)(components[16])) << 9; + temp |= ((uint32_t)(components[17])) << 2; + temp |= ((uint32_t)(components[18])) >> 5; + be_store_word32(tag + 12, temp); +} diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.h b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.h new file mode 100644 index 0000000..a0d23d7 --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/internal-wage.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_WAGE_H +#define LW_INTERNAL_WAGE_H + +#include "internal-util.h" + +/** + * \file internal-wage.h + * \brief Internal implementation of the WAGE permutation. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/wage + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the WAGE state in bytes. + * + * The state is 259 bits, divided into 37 7-bit components, one per byte. + */ +#define WAGE_STATE_SIZE 37 + +/** + * \brief Permutes the WAGE state. + * + * \param s The WAGE state to be permuted. + */ +void wage_permute(unsigned char s[WAGE_STATE_SIZE]); + +/** + * \brief Absorbs 8 bytes into the WAGE state. + * + * \param s The WAGE state to be permuted. + * \param data The data to be absorbed. + * \param domain The domain separator for the absorbed data. + */ +void wage_absorb + (unsigned char s[WAGE_STATE_SIZE], const unsigned char data[8], + unsigned char domain); + +/** + * \brief Gets the 8 bytes of the rate from the WAGE state. + * + * \param s The WAGE state to get the bytes from. + * \param data Points to the buffer to receive the extracted bytes. + */ +void wage_get_rate + (const unsigned char s[WAGE_STATE_SIZE], unsigned char data[8]); + +/** + * \brief Sets the 8 bytes of the rate in the WAGE state. + * + * \param s The WAGE state to set the rate in. + * \param data Points to the bytes to set into the rate. + * \param domain The domain separator for the rate data. + */ +void wage_set_rate + (unsigned char s[WAGE_STATE_SIZE], const unsigned char data[8], + unsigned char domain); + +/** + * \brief Absorbs 16 key bytes into the WAGE state. + * + * \param s The WAGE state to be permuted. + * \param key Points to the key data to be absorbed. + */ +void wage_absorb_key + (unsigned char s[WAGE_STATE_SIZE], const unsigned char *key); + +/** + * \brief Initializes the WAGE state with a key and nonce. + * + * \param s The WAGE state to be initialized. + * \param key Points to the 128-bit key. + * \param nonce Points to the 128-bit nonce. + */ +void wage_init + (unsigned char s[WAGE_STATE_SIZE], + const unsigned char *key, const unsigned char *nonce); + +/** + * \brief Extracts the 128-bit authentication tag from the WAGE state. + * + * \param s The WAGE state to extract the tag from. + * \param tag Points to the buffer to receive the extracted tag. + */ +void wage_extract_tag + (const unsigned char s[WAGE_STATE_SIZE], unsigned char tag[16]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.c b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.c new file mode 100644 index 0000000..374409b --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.c @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "wage.h" +#include "internal-wage.h" +#include + +aead_cipher_t const wage_cipher = { + "WAGE", + WAGE_KEY_SIZE, + WAGE_NONCE_SIZE, + WAGE_TAG_SIZE, + AEAD_FLAG_NONE, + wage_aead_encrypt, + wage_aead_decrypt +}; + +/** + * \brief Rate of absorbing data into the WAGE state in sponge mode. + */ +#define WAGE_RATE 8 + +/** + * \brief Processes associated data for WAGE. + * + * \param state Points to the WAGE state. + * \param pad Points to an 8-byte temporary buffer for handling padding. + * \param ad Points to the associated data. + * \param adlen Length of the associated data. + */ +static void wage_process_ad + (unsigned char state[WAGE_STATE_SIZE], unsigned char pad[WAGE_RATE], + const unsigned char *ad, unsigned long long adlen) +{ + unsigned temp; + + /* Process as many full blocks as possible */ + while (adlen >= WAGE_RATE) { + wage_absorb(state, ad, 0x40); + wage_permute(state); + ad += WAGE_RATE; + adlen -= WAGE_RATE; + } + + /* Pad and absorb the final block */ + temp = (unsigned)adlen; + memcpy(pad, ad, temp); + pad[temp] = 0x80; + memset(pad + temp + 1, 0, WAGE_RATE - temp - 1); + wage_absorb(state, pad, 0x40); + wage_permute(state); +} + +int wage_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[WAGE_STATE_SIZE]; + unsigned char block[WAGE_RATE]; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + WAGE_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + wage_init(state, k, npub); + if (adlen != 0) + wage_process_ad(state, block, ad, adlen); + + /* Encrypts the plaintext to produce the ciphertext */ + while (mlen >= WAGE_RATE) { + wage_get_rate(state, block); + lw_xor_block(block, m, WAGE_RATE); + wage_set_rate(state, block, 0x20); + wage_permute(state); + memcpy(c, block, WAGE_RATE); + c += WAGE_RATE; + m += WAGE_RATE; + mlen -= WAGE_RATE; + } + temp = (unsigned)mlen; + wage_get_rate(state, block); + lw_xor_block(block, m, temp); + block[temp] ^= 0x80; + wage_set_rate(state, block, 0x20); + wage_permute(state); + memcpy(c, block, temp); + + /* Generate and extract the authentication tag */ + wage_absorb_key(state, k); + wage_extract_tag(state, c + temp); + return 0; +} + +int wage_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + unsigned char state[WAGE_STATE_SIZE]; + unsigned char block[WAGE_TAG_SIZE]; + unsigned char *mtemp = m; + unsigned temp; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < WAGE_TAG_SIZE) + return -1; + *mlen = clen - WAGE_TAG_SIZE; + + /* Initialize the state and absorb the associated data */ + wage_init(state, k, npub); + if (adlen != 0) + wage_process_ad(state, block, ad, adlen); + + /* Decrypts the ciphertext to produce the plaintext */ + clen -= WAGE_TAG_SIZE; + while (clen >= WAGE_RATE) { + wage_get_rate(state, block); + lw_xor_block(block, c, WAGE_RATE); + wage_set_rate(state, c, 0x20); + wage_permute(state); + memcpy(m, block, WAGE_RATE); + c += WAGE_RATE; + m += WAGE_RATE; + clen -= WAGE_RATE; + } + temp = (unsigned)clen; + wage_get_rate(state, block); + lw_xor_block_2_src(block + 8, block, c, temp); + memcpy(block, c, temp); + block[temp] ^= 0x80; + wage_set_rate(state, block, 0x20); + wage_permute(state); + memcpy(m, block + 8, temp); + + /* Generate and check the authentication tag */ + wage_absorb_key(state, k); + wage_extract_tag(state, block); + return aead_check_tag(mtemp, *mlen, block, c + temp, WAGE_TAG_SIZE); +} diff --git a/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.h b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.h new file mode 100644 index 0000000..2a620c4 --- /dev/null +++ b/wage/Implementations/crypto_aead/wageae128v1/rhys-avr/wage.h @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_WAGE_H +#define LWCRYPTO_WAGE_H + +#include "aead-common.h" + +/** + * \file wage.h + * \brief WAGE authenticated encryption algorithm. + * + * WAGE is an authenticated encryption algorithm that is built around the + * 259-bit WAGE permutation. The algorithm has a 128-bit key, a 128-bit + * nonce, and a 128-bit authentication tag. It is an evolution of the + * WG series of stream ciphers. + * + * References: https://uwaterloo.ca/communications-security-lab/lwc/wage + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for WAGE. + */ +#define WAGE_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for WAGE. + */ +#define WAGE_TAG_SIZE 16 + +/** + * \brief Size of the nonce for WAGE. + */ +#define WAGE_NONCE_SIZE 16 + +/** + * \brief Meta-information block for the WAGE cipher. + */ +extern aead_cipher_t const wage_cipher; + +/** + * \brief Encrypts and authenticates a packet with WAGE. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa wage_aead_decrypt() + */ +int wage_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with WAGE. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa wage_aead_encrypt() + */ +int wage_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.c b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.h b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/api.h b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/api.h new file mode 100644 index 0000000..b2f8a36 --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/api.h @@ -0,0 +1,5 @@ +#define CRYPTO_KEYBYTES 16 +#define CRYPTO_NSECBYTES 0 +#define CRYPTO_NPUBBYTES 16 +#define CRYPTO_ABYTES 16 +#define CRYPTO_NOOVERLAP 1 diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/encrypt.c b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/encrypt.c new file mode 100644 index 0000000..f7bb1b4 --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/encrypt.c @@ -0,0 +1,26 @@ + +#include "xoodyak.h" + +int crypto_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + return xoodyak_aead_encrypt + (c, clen, m, mlen, ad, adlen, nsec, npub, k); +} + +int crypto_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + return xoodyak_aead_decrypt + (m, mlen, nsec, c, clen, ad, adlen, npub, k); +} diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-util.h b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo-avr.S b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo-avr.S new file mode 100644 index 0000000..629c19d --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo-avr.S @@ -0,0 +1,935 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global xoodoo_permute + .type xoodoo_permute, @function +xoodoo_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 +.L__stack_usage = 16 + ldi r18,88 + mov r19,r1 + rcall 34f + ldi r18,56 + rcall 34f + ldi r18,192 + ldi r19,3 + rcall 34f + ldi r18,208 + mov r19,r1 + rcall 34f + ldi r18,32 + ldi r19,1 + rcall 34f + ldi r18,20 + mov r19,r1 + rcall 34f + ldi r18,96 + rcall 34f + ldi r18,44 + rcall 34f + ldi r18,128 + ldi r19,3 + rcall 34f + ldi r18,240 + mov r19,r1 + rcall 34f + ldi r18,160 + ldi r19,1 + rcall 34f + ldi r18,18 + mov r19,r1 + rcall 34f + rjmp 888f +34: + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + ldd r0,Z+28 + eor r6,r0 + ldd r0,Z+29 + eor r7,r0 + ldd r0,Z+30 + eor r8,r0 + ldd r0,Z+31 + eor r9,r0 + ldd r0,Z+44 + eor r6,r0 + ldd r0,Z+45 + eor r7,r0 + ldd r0,Z+46 + eor r8,r0 + ldd r0,Z+47 + eor r9,r0 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + movw r10,r20 + movw r12,r22 + eor r10,r26 + eor r11,r27 + eor r12,r28 + eor r13,r29 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r9,r24 + eor r6,r25 + eor r7,r14 + eor r8,r15 + movw r14,r10 + movw r24,r12 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r13,r24 + eor r10,r25 + eor r11,r14 + eor r12,r15 + eor r20,r9 + eor r21,r6 + eor r22,r7 + eor r23,r8 + eor r26,r9 + eor r27,r6 + eor r28,r7 + eor r29,r8 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+16,r26 + std Z+17,r27 + std Z+18,r28 + std Z+19,r29 + std Z+32,r2 + std Z+33,r3 + std Z+34,r4 + std Z+35,r5 + ldd r20,Z+4 + ldd r21,Z+5 + ldd r22,Z+6 + ldd r23,Z+7 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r6,r20 + movw r8,r22 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r9,r24 + eor r6,r25 + eor r7,r14 + eor r8,r15 + eor r20,r13 + eor r21,r10 + eor r22,r11 + eor r23,r12 + eor r26,r13 + eor r27,r10 + eor r28,r11 + eor r29,r12 + eor r2,r13 + eor r3,r10 + eor r4,r11 + eor r5,r12 + std Z+4,r20 + std Z+5,r21 + std Z+6,r22 + std Z+7,r23 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + ldd r2,Z+40 + ldd r3,Z+41 + ldd r4,Z+42 + ldd r5,Z+43 + movw r10,r20 + movw r12,r22 + eor r10,r26 + eor r11,r27 + eor r12,r28 + eor r13,r29 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + movw r14,r10 + movw r24,r12 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r13,r24 + eor r10,r25 + eor r11,r14 + eor r12,r15 + eor r20,r9 + eor r21,r6 + eor r22,r7 + eor r23,r8 + eor r26,r9 + eor r27,r6 + eor r28,r7 + eor r29,r8 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r28 + std Z+27,r29 + std Z+40,r2 + std Z+41,r3 + std Z+42,r4 + std Z+43,r5 + ldd r0,Z+12 + eor r0,r13 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r10 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r11 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r12 + std Z+15,r0 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + eor r6,r13 + eor r7,r10 + eor r8,r11 + eor r9,r12 + ldd r14,Z+44 + ldd r15,Z+45 + ldd r24,Z+46 + ldd r25,Z+47 + eor r14,r13 + eor r15,r10 + eor r24,r11 + eor r25,r12 + ldd r10,Z+24 + ldd r11,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+28,r10 + std Z+29,r11 + std Z+30,r12 + std Z+31,r13 + ldd r10,Z+20 + ldd r11,Z+21 + ldd r12,Z+22 + ldd r13,Z+23 + std Z+24,r10 + std Z+25,r11 + std Z+26,r12 + std Z+27,r13 + ldd r10,Z+16 + ldd r11,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + std Z+20,r10 + std Z+21,r11 + std Z+22,r12 + std Z+23,r13 + std Z+16,r6 + std Z+17,r7 + std Z+18,r8 + std Z+19,r9 + ldd r6,Z+32 + ldd r7,Z+33 + ldd r8,Z+34 + ldd r9,Z+35 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+32,r6 + std Z+33,r7 + std Z+34,r8 + std Z+35,r9 + ldd r6,Z+36 + ldd r7,Z+37 + ldd r8,Z+38 + ldd r9,Z+39 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+36,r6 + std Z+37,r7 + std Z+38,r8 + std Z+39,r9 + ldd r6,Z+40 + ldd r7,Z+41 + ldd r8,Z+42 + ldd r9,Z+43 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+40,r6 + std Z+41,r7 + std Z+42,r8 + std Z+43,r9 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + std Z+44,r14 + std Z+45,r15 + std Z+46,r24 + std Z+47,r25 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + eor r20,r18 + eor r21,r19 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+16,r26 + std Z+17,r27 + std Z+18,r28 + std Z+19,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+32,r2 + std Z+33,r3 + std Z+34,r4 + std Z+35,r5 + ldd r20,Z+4 + ldd r21,Z+5 + ldd r22,Z+6 + ldd r23,Z+7 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+4,r20 + std Z+5,r21 + std Z+6,r22 + std Z+7,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + ldd r2,Z+40 + ldd r3,Z+41 + ldd r4,Z+42 + ldd r5,Z+43 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+24,r26 + std Z+25,r27 + std Z+26,r28 + std Z+27,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+40,r2 + std Z+41,r3 + std Z+42,r4 + std Z+43,r5 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r22,Z+14 + ldd r23,Z+15 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + ldd r2,Z+44 + ldd r3,Z+45 + ldd r4,Z+46 + ldd r5,Z+47 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+12,r20 + std Z+13,r21 + std Z+14,r22 + std Z+15,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+28,r26 + std Z+29,r27 + std Z+30,r28 + std Z+31,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+44,r2 + std Z+45,r3 + std Z+46,r4 + std Z+47,r5 + ldd r6,Z+16 + ldd r7,Z+17 + ldd r8,Z+18 + ldd r9,Z+19 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+16,r6 + std Z+17,r7 + std Z+18,r8 + std Z+19,r9 + ldd r6,Z+20 + ldd r7,Z+21 + ldd r8,Z+22 + ldd r9,Z+23 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+20,r6 + std Z+21,r7 + std Z+22,r8 + std Z+23,r9 + ldd r6,Z+24 + ldd r7,Z+25 + ldd r8,Z+26 + ldd r9,Z+27 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+24,r6 + std Z+25,r7 + std Z+26,r8 + std Z+27,r9 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + ldd r6,Z+40 + ldd r7,Z+41 + ldd r8,Z+42 + ldd r9,Z+43 + ldd r10,Z+44 + ldd r11,Z+45 + ldd r12,Z+46 + ldd r13,Z+47 + ldd r14,Z+32 + ldd r15,Z+33 + ldd r24,Z+34 + ldd r25,Z+35 + std Z+40,r25 + std Z+41,r14 + std Z+42,r15 + std Z+43,r24 + ldd r14,Z+36 + ldd r15,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + std Z+44,r25 + std Z+45,r14 + std Z+46,r15 + std Z+47,r24 + std Z+32,r9 + std Z+33,r6 + std Z+34,r7 + std Z+35,r8 + std Z+36,r13 + std Z+37,r10 + std Z+38,r11 + std Z+39,r12 + ret +888: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size xoodoo_permute, .-xoodoo_permute + +#endif diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.c b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.c new file mode 100644 index 0000000..59bb8bf --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.c @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-xoodoo.h" + +#if !defined(__AVR__) + +void xoodoo_permute(xoodoo_state_t *state) +{ + static uint16_t const rc[XOODOO_ROUNDS] = { + 0x0058, 0x0038, 0x03C0, 0x00D0, 0x0120, 0x0014, + 0x0060, 0x002C, 0x0380, 0x00F0, 0x01A0, 0x0012 + }; + uint8_t round; + uint32_t x00, x01, x02, x03; + uint32_t x10, x11, x12, x13; + uint32_t x20, x21, x22, x23; + uint32_t t1, t2; + + /* Load the state and convert from little-endian byte order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x00 = state->S[0][0]; + x01 = state->S[0][1]; + x02 = state->S[0][2]; + x03 = state->S[0][3]; + x10 = state->S[1][0]; + x11 = state->S[1][1]; + x12 = state->S[1][2]; + x13 = state->S[1][3]; + x20 = state->S[2][0]; + x21 = state->S[2][1]; + x22 = state->S[2][2]; + x23 = state->S[2][3]; +#else + x00 = le_load_word32(state->B); + x01 = le_load_word32(state->B + 4); + x02 = le_load_word32(state->B + 8); + x03 = le_load_word32(state->B + 12); + x10 = le_load_word32(state->B + 16); + x11 = le_load_word32(state->B + 20); + x12 = le_load_word32(state->B + 24); + x13 = le_load_word32(state->B + 28); + x20 = le_load_word32(state->B + 32); + x21 = le_load_word32(state->B + 36); + x22 = le_load_word32(state->B + 40); + x23 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (round = 0; round < XOODOO_ROUNDS; ++round) { + /* Optimization ideas from the Xoodoo implementation here: + * https://github.com/XKCP/XKCP/tree/master/lib/low/Xoodoo/Optimized */ + + /* Step theta: Mix column parity */ + t1 = x03 ^ x13 ^ x23; + t2 = x00 ^ x10 ^ x20; + t1 = leftRotate5(t1) ^ leftRotate14(t1); + t2 = leftRotate5(t2) ^ leftRotate14(t2); + x00 ^= t1; + x10 ^= t1; + x20 ^= t1; + t1 = x01 ^ x11 ^ x21; + t1 = leftRotate5(t1) ^ leftRotate14(t1); + x01 ^= t2; + x11 ^= t2; + x21 ^= t2; + t2 = x02 ^ x12 ^ x22; + t2 = leftRotate5(t2) ^ leftRotate14(t2); + x02 ^= t1; + x12 ^= t1; + x22 ^= t1; + x03 ^= t2; + x13 ^= t2; + x23 ^= t2; + + /* Step rho-west: Plane shift */ + t1 = x13; + x13 = x12; + x12 = x11; + x11 = x10; + x10 = t1; + x20 = leftRotate11(x20); + x21 = leftRotate11(x21); + x22 = leftRotate11(x22); + x23 = leftRotate11(x23); + + /* Step iota: Add the round constant to the state */ + x00 ^= rc[round]; + + /* Step chi: Non-linear layer */ + x00 ^= (~x10) & x20; + x10 ^= (~x20) & x00; + x20 ^= (~x00) & x10; + x01 ^= (~x11) & x21; + x11 ^= (~x21) & x01; + x21 ^= (~x01) & x11; + x02 ^= (~x12) & x22; + x12 ^= (~x22) & x02; + x22 ^= (~x02) & x12; + x03 ^= (~x13) & x23; + x13 ^= (~x23) & x03; + x23 ^= (~x03) & x13; + + /* Step rho-east: Plane shift */ + x10 = leftRotate1(x10); + x11 = leftRotate1(x11); + x12 = leftRotate1(x12); + x13 = leftRotate1(x13); + t1 = leftRotate8(x22); + t2 = leftRotate8(x23); + x22 = leftRotate8(x20); + x23 = leftRotate8(x21); + x20 = t1; + x21 = t2; + } + + /* Convert back into little-endian and store to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0][0] = x00; + state->S[0][1] = x01; + state->S[0][2] = x02; + state->S[0][3] = x03; + state->S[1][0] = x10; + state->S[1][1] = x11; + state->S[1][2] = x12; + state->S[1][3] = x13; + state->S[2][0] = x20; + state->S[2][1] = x21; + state->S[2][2] = x22; + state->S[2][3] = x23; +#else + le_store_word32(state->B, x00); + le_store_word32(state->B + 4, x01); + le_store_word32(state->B + 8, x02); + le_store_word32(state->B + 12, x03); + le_store_word32(state->B + 16, x10); + le_store_word32(state->B + 20, x11); + le_store_word32(state->B + 24, x12); + le_store_word32(state->B + 28, x13); + le_store_word32(state->B + 32, x20); + le_store_word32(state->B + 36, x21); + le_store_word32(state->B + 40, x22); + le_store_word32(state->B + 44, x23); +#endif +} + +#endif /* !__AVR__ */ diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.h b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.h new file mode 100644 index 0000000..f6eddd8 --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/internal-xoodoo.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_XOODOO_H +#define LW_INTERNAL_XOODOO_H + +#include "internal-util.h" + +/** + * \file internal-xoodoo.h + * \brief Internal implementation of the Xoodoo permutation. + * + * References: https://keccak.team/xoodyak.html + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Number of rows in the Xoodoo state. + */ +#define XOODOO_ROWS 3 + +/** + * \brief Number of columns in the Xoodoo state. + */ +#define XOODOO_COLS 4 + +/** + * \brief Number of rounds for the Xoodoo permutation. + */ +#define XOODOO_ROUNDS 12 + +/** + * \brief State information for the Xoodoo permutation. + */ +typedef union +{ + /** Words of the state */ + uint32_t S[XOODOO_ROWS][XOODOO_COLS]; + + /** Bytes of the state */ + uint8_t B[XOODOO_ROWS * XOODOO_COLS * sizeof(uint32_t)]; + +} xoodoo_state_t; + +/** + * \brief Permutes the Xoodoo state. + * + * \param state The Xoodoo state. + * + * The state will be in little-endian before and after the operation. + */ +void xoodoo_permute(xoodoo_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.c b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.c new file mode 100644 index 0000000..4ad4fce --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.c @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "xoodyak.h" +#include "internal-xoodoo.h" +#include + +aead_cipher_t const xoodyak_cipher = { + "Xoodyak", + XOODYAK_KEY_SIZE, + XOODYAK_NONCE_SIZE, + XOODYAK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + xoodyak_aead_encrypt, + xoodyak_aead_decrypt +}; + +aead_hash_algorithm_t const xoodyak_hash_algorithm = { + "Xoodyak-Hash", + sizeof(xoodyak_hash_state_t), + XOODYAK_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + xoodyak_hash, + (aead_hash_init_t)xoodyak_hash_init, + (aead_hash_update_t)xoodyak_hash_absorb, + (aead_hash_finalize_t)xoodyak_hash_finalize, + (aead_xof_absorb_t)xoodyak_hash_absorb, + (aead_xof_squeeze_t)xoodyak_hash_squeeze +}; + +/** + * \brief Rate for absorbing data into the sponge state. + */ +#define XOODYAK_ABSORB_RATE 44 + +/** + * \brief Rate for squeezing data out of the sponge. + */ +#define XOODYAK_SQUEEZE_RATE 24 + +/** + * \brief Rate for absorbing and squeezing in hashing mode. + */ +#define XOODYAK_HASH_RATE 16 + +/** + * \brief Phase identifier for "up" mode, which indicates that a block + * permutation has just been performed. + */ +#define XOODYAK_PHASE_UP 0 + +/** + * \brief Phase identifier for "down" mode, which indicates that data has + * been absorbed but that a block permutation has not been done yet. + */ +#define XOODYAK_PHASE_DOWN 1 + +/** + * \brief Absorbs data into the Xoodoo permutation state. + * + * \param state Xoodoo permutation state. + * \param phase Points to the current phase, up or down. + * \param data Points to the data to be absorbed. + * \param len Length of the data to be absorbed. + */ +static void xoodyak_absorb + (xoodoo_state_t *state, uint8_t *phase, + const unsigned char *data, unsigned long long len) +{ + uint8_t domain = 0x03; + unsigned temp; + while (len > XOODYAK_ABSORB_RATE) { + if (*phase != XOODYAK_PHASE_UP) + xoodoo_permute(state); + lw_xor_block(state->B, data, XOODYAK_ABSORB_RATE); + state->B[XOODYAK_ABSORB_RATE] ^= 0x01; /* Padding */ + state->B[sizeof(state->B) - 1] ^= domain; + data += XOODYAK_ABSORB_RATE; + len -= XOODYAK_ABSORB_RATE; + domain = 0x00; + *phase = XOODYAK_PHASE_DOWN; + } + temp = (unsigned)len; + if (*phase != XOODYAK_PHASE_UP) + xoodoo_permute(state); + lw_xor_block(state->B, data, temp); + state->B[temp] ^= 0x01; /* Padding */ + state->B[sizeof(state->B) - 1] ^= domain; + *phase = XOODYAK_PHASE_DOWN; +} + +int xoodyak_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + xoodoo_state_t state; + uint8_t phase, domain; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + XOODYAK_TAG_SIZE; + + /* Initialize the state with the key */ + memcpy(state.B, k, XOODYAK_KEY_SIZE); + memset(state.B + XOODYAK_KEY_SIZE, 0, sizeof(state.B) - XOODYAK_KEY_SIZE); + state.B[XOODYAK_KEY_SIZE + 1] = 0x01; /* Padding */ + state.B[sizeof(state.B) - 1] = 0x02; /* Domain separation */ + phase = XOODYAK_PHASE_DOWN; + + /* Absorb the nonce and associated data */ + xoodyak_absorb(&state, &phase, npub, XOODYAK_NONCE_SIZE); + xoodyak_absorb(&state, &phase, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + domain = 0x80; + while (mlen > XOODYAK_SQUEEZE_RATE) { + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + lw_xor_block_2_dest(c, state.B, m, XOODYAK_SQUEEZE_RATE); + state.B[XOODYAK_SQUEEZE_RATE] ^= 0x01; /* Padding */ + c += XOODYAK_SQUEEZE_RATE; + m += XOODYAK_SQUEEZE_RATE; + mlen -= XOODYAK_SQUEEZE_RATE; + domain = 0; + } + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state.B, m, temp); + state.B[temp] ^= 0x01; /* Padding */ + c += temp; + + /* Generate the authentication tag */ + state.B[sizeof(state.B) - 1] ^= 0x40; /* Domain separation */ + xoodoo_permute(&state); + memcpy(c, state.B, XOODYAK_TAG_SIZE); + return 0; +} + +int xoodyak_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + xoodoo_state_t state; + uint8_t phase, domain; + unsigned temp; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < XOODYAK_TAG_SIZE) + return -1; + *mlen = clen - XOODYAK_TAG_SIZE; + + /* Initialize the state with the key */ + memcpy(state.B, k, XOODYAK_KEY_SIZE); + memset(state.B + XOODYAK_KEY_SIZE, 0, sizeof(state.B) - XOODYAK_KEY_SIZE); + state.B[XOODYAK_KEY_SIZE + 1] = 0x01; /* Padding */ + state.B[sizeof(state.B) - 1] = 0x02; /* Domain separation */ + phase = XOODYAK_PHASE_DOWN; + + /* Absorb the nonce and associated data */ + xoodyak_absorb(&state, &phase, npub, XOODYAK_NONCE_SIZE); + xoodyak_absorb(&state, &phase, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + domain = 0x80; + clen -= XOODYAK_TAG_SIZE; + while (clen > XOODYAK_SQUEEZE_RATE) { + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + lw_xor_block_swap(m, state.B, c, XOODYAK_SQUEEZE_RATE); + state.B[XOODYAK_SQUEEZE_RATE] ^= 0x01; /* Padding */ + c += XOODYAK_SQUEEZE_RATE; + m += XOODYAK_SQUEEZE_RATE; + clen -= XOODYAK_SQUEEZE_RATE; + domain = 0; + } + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + temp = (unsigned)clen; + lw_xor_block_swap(m, state.B, c, temp); + state.B[temp] ^= 0x01; /* Padding */ + c += temp; + + /* Check the authentication tag */ + state.B[sizeof(state.B) - 1] ^= 0x40; /* Domain separation */ + xoodoo_permute(&state); + return aead_check_tag(mtemp, *mlen, state.B, c, XOODYAK_TAG_SIZE); +} + +int xoodyak_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + xoodyak_hash_state_t state; + xoodyak_hash_init(&state); + xoodyak_hash_absorb(&state, in, inlen); + xoodyak_hash_squeeze(&state, out, XOODYAK_HASH_SIZE); + return 0; +} + +#define XOODYAK_HASH_MODE_INIT_ABSORB 0 +#define XOODYAK_HASH_MODE_ABSORB 1 +#define XOODYAK_HASH_MODE_SQUEEZE 2 + +#define xoodoo_hash_permute(state) \ + xoodoo_permute((xoodoo_state_t *)((state)->s.state)) + +void xoodyak_hash_init(xoodyak_hash_state_t *state) +{ + memset(state, 0, sizeof(xoodyak_hash_state_t)); + state->s.mode = XOODYAK_HASH_MODE_INIT_ABSORB; +} + +void xoodyak_hash_absorb + (xoodyak_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + uint8_t domain; + unsigned temp; + + /* If we were squeezing, then restart the absorb phase */ + if (state->s.mode == XOODYAK_HASH_MODE_SQUEEZE) { + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_INIT_ABSORB; + state->s.count = 0; + } + + /* The first block needs a different domain separator to the others */ + domain = (state->s.mode == XOODYAK_HASH_MODE_INIT_ABSORB) ? 0x01 : 0x00; + + /* Absorb the input data into the state */ + while (inlen > 0) { + if (state->s.count >= XOODYAK_HASH_RATE) { + state->s.state[XOODYAK_HASH_RATE] ^= 0x01; /* Padding */ + state->s.state[sizeof(state->s.state) - 1] ^= domain; + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_ABSORB; + state->s.count = 0; + domain = 0x00; + } + temp = XOODYAK_HASH_RATE - state->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + lw_xor_block(state->s.state + state->s.count, in, temp); + state->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void xoodyak_hash_squeeze + (xoodyak_hash_state_t *state, unsigned char *out, + unsigned long long outlen) +{ + uint8_t domain; + unsigned temp; + + /* If we were absorbing, then terminate the absorb phase */ + if (state->s.mode != XOODYAK_HASH_MODE_SQUEEZE) { + domain = (state->s.mode == XOODYAK_HASH_MODE_INIT_ABSORB) ? 0x01 : 0x00; + state->s.state[state->s.count] ^= 0x01; /* Padding */ + state->s.state[sizeof(state->s.state) - 1] ^= domain; + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_SQUEEZE; + state->s.count = 0; + } + + /* Squeeze data out of the state */ + while (outlen > 0) { + if (state->s.count >= XOODYAK_HASH_RATE) { + /* Padding is always at index 0 for squeezing subsequent + * blocks because the number of bytes we have absorbed + * since the previous block was squeezed out is zero */ + state->s.state[0] ^= 0x01; + xoodoo_hash_permute(state); + state->s.count = 0; + } + temp = XOODYAK_HASH_RATE - state->s.count; + if (temp > outlen) + temp = (unsigned)outlen; + memcpy(out, state->s.state + state->s.count, temp); + state->s.count += temp; + out += temp; + outlen -= temp; + } +} + +void xoodyak_hash_finalize + (xoodyak_hash_state_t *state, unsigned char *out) +{ + xoodyak_hash_squeeze(state, out, XOODYAK_HASH_SIZE); +} diff --git a/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.h b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.h new file mode 100644 index 0000000..f4777d5 --- /dev/null +++ b/xoodyak/Implementations/crypto_aead/xoodyakv1/rhys-avr/xoodyak.h @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_XOODYAK_H +#define LWCRYPTO_XOODYAK_H + +#include "aead-common.h" + +/** + * \file xoodyak.h + * \brief Xoodyak authenticated encryption algorithm. + * + * Xoodyak is an authenticated encryption and hash algorithm pair based + * around the 384-bit Xoodoo permutation that is similar in structure to + * Keccak but is more efficient than Keccak on 32-bit embedded devices. + * The Cyclist mode of operation is used to convert the permutation + * into a sponge for the higher-level algorithms. + * + * The Xoodyak encryption mode has a 128-bit key, a 128-bit nonce, + * and a 128-bit authentication tag. The Xoodyak hashing mode has a + * 256-bit fixed hash output and can also be used as an extensible + * output function (XOF). + * + * The Xoodyak specification describes a re-keying mechanism where the + * key for one packet is used to derive the key to use on the next packet. + * This provides some resistance against side channel attacks by making + * the session key a moving target. This library does not currently + * implement re-keying. + * + * References: https://keccak.team/xoodyak.html + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Xoodyak. + */ +#define XOODYAK_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Xoodyak. + */ +#define XOODYAK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Xoodyak. + */ +#define XOODYAK_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for Xoodyak. + */ +#define XOODYAK_HASH_SIZE 32 + +/** + * \brief State information for Xoodyak incremental hashing modes. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: absorb or squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} xoodyak_hash_state_t; + +/** + * \brief Meta-information block for the Xoodyak cipher. + */ +extern aead_cipher_t const xoodyak_cipher; + +/** + * \brief Meta-information block for the Xoodyak hash algorithm. + */ +extern aead_hash_algorithm_t const xoodyak_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with Xoodyak. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa xoodyak_aead_decrypt() + */ +int xoodyak_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Xoodyak. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa xoodyak_aead_encrypt() + */ +int xoodyak_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Xoodyak to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * XOODYAK_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int xoodyak_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a Xoodyak hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa xoodyak_hash_absorb(), xoodyak_hash_squeeze(), xoodyak_hash() + */ +void xoodyak_hash_init(xoodyak_hash_state_t *state); + +/** + * \brief Aborbs more input data into a Xoodyak hashing state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa xoodyak_hash_init(), xoodyak_hash_squeeze() + */ +void xoodyak_hash_absorb + (xoodyak_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from a Xoodyak hashing state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa xoodyak_hash_init(), xoodyak_hash_absorb() + */ +void xoodyak_hash_squeeze + (xoodyak_hash_state_t *state, unsigned char *out, + unsigned long long outlen); + +/** + * \brief Returns the final hash value from a Xoodyak hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + * + * \note This is a wrapper around xoodyak_hash_squeeze() for a fixed length + * of XOODYAK_HASH_SIZE bytes. + * + * \sa xoodyak_hash_init(), xoodyak_hash_absorb() + */ +void xoodyak_hash_finalize + (xoodyak_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.c b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.c new file mode 100644 index 0000000..84fc53a --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "aead-common.h" + +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = (accum - 1) >> 8; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} + +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned size, int precheck) +{ + /* Set "accum" to -1 if the tags match, or 0 if they don't match */ + int accum = 0; + while (size > 0) { + accum |= (*tag1++ ^ *tag2++); + --size; + } + accum = ((accum - 1) >> 8) & precheck; + + /* Destroy the plaintext if the tag match failed */ + while (plaintext_len > 0) { + *plaintext++ &= accum; + --plaintext_len; + } + + /* If "accum" is 0, return -1, otherwise return 0 */ + return ~accum; +} diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.h b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.h new file mode 100644 index 0000000..2be95eb --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/aead-common.h @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_AEAD_COMMON_H +#define LWCRYPTO_AEAD_COMMON_H + +#include + +/** + * \file aead-common.h + * \brief Definitions that are common across AEAD schemes. + * + * AEAD stands for "Authenticated Encryption with Associated Data". + * It is a standard API pattern for securely encrypting and + * authenticating packets of data. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Encrypts and authenticates a packet with an AEAD scheme. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + */ +typedef int (*aead_cipher_encrypt_t) + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with an AEAD scheme. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - normally not used by AEAD schemes. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet. + * \param k Points to the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + */ +typedef int (*aead_cipher_decrypt_t) + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data. + * + * \param out Buffer to receive the hash output. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +typedef int (*aead_hash_t) + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a hashing operation. + * + * \param state Hash state to be initialized. + */ +typedef void (*aead_hash_init_t)(void *state); + +/** + * \brief Updates a hash state with more input data. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be incorporated into the state. + * \param inlen Length of the input data to be incorporated into the state. + */ +typedef void (*aead_hash_update_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Returns the final hash value from a hashing operation. + * + * \param Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + */ +typedef void (*aead_hash_finalize_t)(void *state, unsigned char *out); + +/** + * \brief Aborbs more input data into an XOF state. + * + * \param state XOF state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa ascon_xof_init(), ascon_xof_squeeze() + */ +typedef void (*aead_xof_absorb_t) + (void *state, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Squeezes output data from an XOF state. + * + * \param state XOF state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + */ +typedef void (*aead_xof_squeeze_t) + (void *state, unsigned char *out, unsigned long long outlen); + +/** + * \brief No special AEAD features. + */ +#define AEAD_FLAG_NONE 0x0000 + +/** + * \brief The natural byte order of the AEAD cipher is little-endian. + * + * If this flag is not present, then the natural byte order of the + * AEAD cipher should be assumed to be big-endian. + * + * The natural byte order may be useful when formatting packet sequence + * numbers as nonces. The application needs to know whether the sequence + * number should be packed into the leading or trailing bytes of the nonce. + */ +#define AEAD_FLAG_LITTLE_ENDIAN 0x0001 + +/** + * \brief Meta-information about an AEAD cipher. + */ +typedef struct +{ + const char *name; /**< Name of the cipher */ + unsigned key_len; /**< Length of the key in bytes */ + unsigned nonce_len; /**< Length of the nonce in bytes */ + unsigned tag_len; /**< Length of the tag in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_cipher_encrypt_t encrypt; /**< AEAD encryption function */ + aead_cipher_decrypt_t decrypt; /**< AEAD decryption function */ + +} aead_cipher_t; + +/** + * \brief Meta-information about a hash algorithm that is related to an AEAD. + * + * Regular hash algorithms should provide the "hash", "init", "update", + * and "finalize" functions. Extensible Output Functions (XOF's) should + * proivde the "hash", "init", "absorb", and "squeeze" functions. + */ +typedef struct +{ + const char *name; /**< Name of the hash algorithm */ + size_t state_size; /**< Size of the incremental state structure */ + unsigned hash_len; /**< Length of the hash in bytes */ + unsigned flags; /**< Flags for extra features */ + aead_hash_t hash; /**< All in one hashing function */ + aead_hash_init_t init; /**< Incremental hash/XOF init function */ + aead_hash_update_t update; /**< Incremental hash update function */ + aead_hash_finalize_t finalize; /**< Incremental hash finalize function */ + aead_xof_absorb_t absorb; /**< Incremental XOF absorb function */ + aead_xof_squeeze_t squeeze; /**< Incremental XOF squeeze function */ + +} aead_hash_algorithm_t; + +/** + * \brief Check an authentication tag in constant time. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + */ +int aead_check_tag + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len); + +/** + * \brief Check an authentication tag in constant time with a previous check. + * + * \param plaintext Points to the plaintext data. + * \param plaintext_len Length of the plaintext in bytes. + * \param tag1 First tag to compare. + * \param tag2 Second tag to compare. + * \param tag_len Length of the tags in bytes. + * \param precheck Set to -1 if previous check succeeded or 0 if it failed. + * + * \return Returns -1 if the tag check failed or 0 if the check succeeded. + * + * If the tag check fails, then the \a plaintext will also be zeroed to + * prevent it from being used accidentally by the application when the + * ciphertext was invalid. + * + * This version can be used to incorporate other information about the + * correctness of the plaintext into the final result. + */ +int aead_check_tag_precheck + (unsigned char *plaintext, unsigned long long plaintext_len, + const unsigned char *tag1, const unsigned char *tag2, + unsigned tag_len, int precheck); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/api.h b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/api.h new file mode 100644 index 0000000..ae8c7f6 --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/api.h @@ -0,0 +1 @@ +#define CRYPTO_BYTES 32 diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/hash.c b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/hash.c new file mode 100644 index 0000000..34d3b1c --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/hash.c @@ -0,0 +1,8 @@ + +#include "xoodyak.h" + +int crypto_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + return xoodyak_hash(out, in, inlen); +} diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-util.h b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-util.h new file mode 100644 index 0000000..e30166d --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-util.h @@ -0,0 +1,702 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_UTIL_H +#define LW_INTERNAL_UTIL_H + +#include + +/* Figure out how to inline functions using this C compiler */ +#if defined(__STDC__) && __STDC_VERSION__ >= 199901L +#define STATIC_INLINE static inline +#elif defined(__GNUC__) || defined(__clang__) +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + +/* Try to figure out whether the CPU is little-endian or big-endian. + * May need to modify this to include new compiler-specific defines. + * Alternatively, define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ in your + * compiler flags when you compile this library */ +#if defined(__x86_64) || defined(__x86_64__) || \ + defined(__i386) || defined(__i386__) || \ + defined(__AVR__) || defined(__arm) || defined(__arm__) || \ + defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86) || \ + defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM_FP) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 1234) || \ + defined(__LITTLE_ENDIAN__) +#define LW_UTIL_LITTLE_ENDIAN 1 +#elif (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == 4321) || \ + defined(__BIG_ENDIAN__) +/* Big endian */ +#else +#error "Cannot determine the endianess of this platform" +#endif + +/* Helper macros to load and store values while converting endian-ness */ + +/* Load a big-endian 32-bit word from a byte buffer */ +#define be_load_word32(ptr) \ + ((((uint32_t)((ptr)[0])) << 24) | \ + (((uint32_t)((ptr)[1])) << 16) | \ + (((uint32_t)((ptr)[2])) << 8) | \ + ((uint32_t)((ptr)[3]))) + +/* Store a big-endian 32-bit word into a byte buffer */ +#define be_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 24); \ + (ptr)[1] = (uint8_t)(_x >> 16); \ + (ptr)[2] = (uint8_t)(_x >> 8); \ + (ptr)[3] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 32-bit word from a byte buffer */ +#define le_load_word32(ptr) \ + ((((uint32_t)((ptr)[3])) << 24) | \ + (((uint32_t)((ptr)[2])) << 16) | \ + (((uint32_t)((ptr)[1])) << 8) | \ + ((uint32_t)((ptr)[0]))) + +/* Store a little-endian 32-bit word into a byte buffer */ +#define le_store_word32(ptr, x) \ + do { \ + uint32_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + } while (0) + +/* Load a big-endian 64-bit word from a byte buffer */ +#define be_load_word64(ptr) \ + ((((uint64_t)((ptr)[0])) << 56) | \ + (((uint64_t)((ptr)[1])) << 48) | \ + (((uint64_t)((ptr)[2])) << 40) | \ + (((uint64_t)((ptr)[3])) << 32) | \ + (((uint64_t)((ptr)[4])) << 24) | \ + (((uint64_t)((ptr)[5])) << 16) | \ + (((uint64_t)((ptr)[6])) << 8) | \ + ((uint64_t)((ptr)[7]))) + +/* Store a big-endian 64-bit word into a byte buffer */ +#define be_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 56); \ + (ptr)[1] = (uint8_t)(_x >> 48); \ + (ptr)[2] = (uint8_t)(_x >> 40); \ + (ptr)[3] = (uint8_t)(_x >> 32); \ + (ptr)[4] = (uint8_t)(_x >> 24); \ + (ptr)[5] = (uint8_t)(_x >> 16); \ + (ptr)[6] = (uint8_t)(_x >> 8); \ + (ptr)[7] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 64-bit word from a byte buffer */ +#define le_load_word64(ptr) \ + ((((uint64_t)((ptr)[7])) << 56) | \ + (((uint64_t)((ptr)[6])) << 48) | \ + (((uint64_t)((ptr)[5])) << 40) | \ + (((uint64_t)((ptr)[4])) << 32) | \ + (((uint64_t)((ptr)[3])) << 24) | \ + (((uint64_t)((ptr)[2])) << 16) | \ + (((uint64_t)((ptr)[1])) << 8) | \ + ((uint64_t)((ptr)[0]))) + +/* Store a little-endian 64-bit word into a byte buffer */ +#define le_store_word64(ptr, x) \ + do { \ + uint64_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + (ptr)[2] = (uint8_t)(_x >> 16); \ + (ptr)[3] = (uint8_t)(_x >> 24); \ + (ptr)[4] = (uint8_t)(_x >> 32); \ + (ptr)[5] = (uint8_t)(_x >> 40); \ + (ptr)[6] = (uint8_t)(_x >> 48); \ + (ptr)[7] = (uint8_t)(_x >> 56); \ + } while (0) + +/* Load a big-endian 16-bit word from a byte buffer */ +#define be_load_word16(ptr) \ + ((((uint16_t)((ptr)[0])) << 8) | \ + ((uint16_t)((ptr)[1]))) + +/* Store a big-endian 16-bit word into a byte buffer */ +#define be_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)(_x >> 8); \ + (ptr)[1] = (uint8_t)_x; \ + } while (0) + +/* Load a little-endian 16-bit word from a byte buffer */ +#define le_load_word16(ptr) \ + ((((uint16_t)((ptr)[1])) << 8) | \ + ((uint16_t)((ptr)[0]))) + +/* Store a little-endian 16-bit word into a byte buffer */ +#define le_store_word16(ptr, x) \ + do { \ + uint16_t _x = (x); \ + (ptr)[0] = (uint8_t)_x; \ + (ptr)[1] = (uint8_t)(_x >> 8); \ + } while (0) + +/* XOR a source byte buffer against a destination */ +#define lw_xor_block(dest, src, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ ^= *_src++; \ + --_len; \ + } \ + } while (0) + +/* XOR two source byte buffers and put the result in a destination buffer */ +#define lw_xor_block_2_src(dest, src1, src2, len) \ + do { \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest++ = *_src1++ ^ *_src2++; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time */ +#define lw_xor_block_2_dest(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + *_dest2++ = (*_dest++ ^= *_src++); \ + --_len; \ + } \ + } while (0) + +/* XOR two byte buffers and write to a destination which at the same + * time copying the contents of src2 to dest2 */ +#define lw_xor_block_copy_src(dest2, dest, src1, src2, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src1 = (src1); \ + const unsigned char *_src2 = (src2); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src2++; \ + *_dest2++ = _temp; \ + *_dest++ = *_src1++ ^ _temp; \ + --_len; \ + } \ + } while (0) + +/* XOR a source byte buffer against a destination and write to another + * destination at the same time. This version swaps the source value + * into the "dest" buffer */ +#define lw_xor_block_swap(dest2, dest, src, len) \ + do { \ + unsigned char *_dest2 = (dest2); \ + unsigned char *_dest = (dest); \ + const unsigned char *_src = (src); \ + unsigned _len = (len); \ + while (_len > 0) { \ + unsigned char _temp = *_src++; \ + *_dest2++ = *_dest ^ _temp; \ + *_dest++ = _temp; \ + --_len; \ + } \ + } while (0) + +/* Rotation functions need to be optimised for best performance on AVR. + * The most efficient rotations are where the number of bits is 1 or a + * multiple of 8, so we compose the efficient rotations to produce all + * other rotation counts of interest. */ + +#if defined(__AVR__) +#define LW_CRYPTO_ROTATE32_COMPOSED 1 +#else +#define LW_CRYPTO_ROTATE32_COMPOSED 0 +#endif + +/* Rotation macros for 32-bit arguments */ + +/* Generic left rotate */ +#define leftRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (32 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate(a, bits) \ + (__extension__ ({ \ + uint32_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (32 - (bits))); \ + })) + +#if !LW_CRYPTO_ROTATE32_COMPOSED + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1(a) (leftRotate((a), 1)) +#define leftRotate2(a) (leftRotate((a), 2)) +#define leftRotate3(a) (leftRotate((a), 3)) +#define leftRotate4(a) (leftRotate((a), 4)) +#define leftRotate5(a) (leftRotate((a), 5)) +#define leftRotate6(a) (leftRotate((a), 6)) +#define leftRotate7(a) (leftRotate((a), 7)) +#define leftRotate8(a) (leftRotate((a), 8)) +#define leftRotate9(a) (leftRotate((a), 9)) +#define leftRotate10(a) (leftRotate((a), 10)) +#define leftRotate11(a) (leftRotate((a), 11)) +#define leftRotate12(a) (leftRotate((a), 12)) +#define leftRotate13(a) (leftRotate((a), 13)) +#define leftRotate14(a) (leftRotate((a), 14)) +#define leftRotate15(a) (leftRotate((a), 15)) +#define leftRotate16(a) (leftRotate((a), 16)) +#define leftRotate17(a) (leftRotate((a), 17)) +#define leftRotate18(a) (leftRotate((a), 18)) +#define leftRotate19(a) (leftRotate((a), 19)) +#define leftRotate20(a) (leftRotate((a), 20)) +#define leftRotate21(a) (leftRotate((a), 21)) +#define leftRotate22(a) (leftRotate((a), 22)) +#define leftRotate23(a) (leftRotate((a), 23)) +#define leftRotate24(a) (leftRotate((a), 24)) +#define leftRotate25(a) (leftRotate((a), 25)) +#define leftRotate26(a) (leftRotate((a), 26)) +#define leftRotate27(a) (leftRotate((a), 27)) +#define leftRotate28(a) (leftRotate((a), 28)) +#define leftRotate29(a) (leftRotate((a), 29)) +#define leftRotate30(a) (leftRotate((a), 30)) +#define leftRotate31(a) (leftRotate((a), 31)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1(a) (rightRotate((a), 1)) +#define rightRotate2(a) (rightRotate((a), 2)) +#define rightRotate3(a) (rightRotate((a), 3)) +#define rightRotate4(a) (rightRotate((a), 4)) +#define rightRotate5(a) (rightRotate((a), 5)) +#define rightRotate6(a) (rightRotate((a), 6)) +#define rightRotate7(a) (rightRotate((a), 7)) +#define rightRotate8(a) (rightRotate((a), 8)) +#define rightRotate9(a) (rightRotate((a), 9)) +#define rightRotate10(a) (rightRotate((a), 10)) +#define rightRotate11(a) (rightRotate((a), 11)) +#define rightRotate12(a) (rightRotate((a), 12)) +#define rightRotate13(a) (rightRotate((a), 13)) +#define rightRotate14(a) (rightRotate((a), 14)) +#define rightRotate15(a) (rightRotate((a), 15)) +#define rightRotate16(a) (rightRotate((a), 16)) +#define rightRotate17(a) (rightRotate((a), 17)) +#define rightRotate18(a) (rightRotate((a), 18)) +#define rightRotate19(a) (rightRotate((a), 19)) +#define rightRotate20(a) (rightRotate((a), 20)) +#define rightRotate21(a) (rightRotate((a), 21)) +#define rightRotate22(a) (rightRotate((a), 22)) +#define rightRotate23(a) (rightRotate((a), 23)) +#define rightRotate24(a) (rightRotate((a), 24)) +#define rightRotate25(a) (rightRotate((a), 25)) +#define rightRotate26(a) (rightRotate((a), 26)) +#define rightRotate27(a) (rightRotate((a), 27)) +#define rightRotate28(a) (rightRotate((a), 28)) +#define rightRotate29(a) (rightRotate((a), 29)) +#define rightRotate30(a) (rightRotate((a), 30)) +#define rightRotate31(a) (rightRotate((a), 31)) + +#else /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Composed rotation macros where 1 and 8 are fast, but others are slow */ + +/* Left rotate by 1 */ +#define leftRotate1(a) (leftRotate((a), 1)) + +/* Left rotate by 2 */ +#define leftRotate2(a) (leftRotate(leftRotate((a), 1), 1)) + +/* Left rotate by 3 */ +#define leftRotate3(a) (leftRotate(leftRotate(leftRotate((a), 1), 1), 1)) + +/* Left rotate by 4 */ +#define leftRotate4(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 5: Rotate left by 8, then right by 3 */ +#define leftRotate5(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 6: Rotate left by 8, then right by 2 */ +#define leftRotate6(a) (rightRotate(rightRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 7: Rotate left by 8, then right by 1 */ +#define leftRotate7(a) (rightRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 8 */ +#define leftRotate8(a) (leftRotate((a), 8)) + +/* Left rotate by 9: Rotate left by 8, then left by 1 */ +#define leftRotate9(a) (leftRotate(leftRotate((a), 8), 1)) + +/* Left rotate by 10: Rotate left by 8, then left by 2 */ +#define leftRotate10(a) (leftRotate(leftRotate(leftRotate((a), 8), 1), 1)) + +/* Left rotate by 11: Rotate left by 8, then left by 3 */ +#define leftRotate11(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 8), 1), 1), 1)) + +/* Left rotate by 12: Rotate left by 16, then right by 4 */ +#define leftRotate12(a) (rightRotate(rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 13: Rotate left by 16, then right by 3 */ +#define leftRotate13(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 14: Rotate left by 16, then right by 2 */ +#define leftRotate14(a) (rightRotate(rightRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 15: Rotate left by 16, then right by 1 */ +#define leftRotate15(a) (rightRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 16 */ +#define leftRotate16(a) (leftRotate((a), 16)) + +/* Left rotate by 17: Rotate left by 16, then left by 1 */ +#define leftRotate17(a) (leftRotate(leftRotate((a), 16), 1)) + +/* Left rotate by 18: Rotate left by 16, then left by 2 */ +#define leftRotate18(a) (leftRotate(leftRotate(leftRotate((a), 16), 1), 1)) + +/* Left rotate by 19: Rotate left by 16, then left by 3 */ +#define leftRotate19(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1)) + +/* Left rotate by 20: Rotate left by 16, then left by 4 */ +#define leftRotate20(a) (leftRotate(leftRotate(leftRotate(leftRotate(leftRotate((a), 16), 1), 1), 1), 1)) + +/* Left rotate by 21: Rotate left by 24, then right by 3 */ +#define leftRotate21(a) (rightRotate(rightRotate(rightRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 22: Rotate left by 24, then right by 2 */ +#define leftRotate22(a) (rightRotate(rightRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 23: Rotate left by 24, then right by 1 */ +#define leftRotate23(a) (rightRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 24 */ +#define leftRotate24(a) (leftRotate((a), 24)) + +/* Left rotate by 25: Rotate left by 24, then left by 1 */ +#define leftRotate25(a) (leftRotate(leftRotate((a), 24), 1)) + +/* Left rotate by 26: Rotate left by 24, then left by 2 */ +#define leftRotate26(a) (leftRotate(leftRotate(leftRotate((a), 24), 1), 1)) + +/* Left rotate by 27: Rotate left by 24, then left by 3 */ +#define leftRotate27(a) (leftRotate(leftRotate(leftRotate(leftRotate((a), 24), 1), 1), 1)) + +/* Left rotate by 28: Rotate right by 4 */ +#define leftRotate28(a) (rightRotate(rightRotate(rightRotate(rightRotate((a), 1), 1), 1), 1)) + +/* Left rotate by 29: Rotate right by 3 */ +#define leftRotate29(a) (rightRotate(rightRotate(rightRotate((a), 1), 1), 1)) + +/* Left rotate by 30: Rotate right by 2 */ +#define leftRotate30(a) (rightRotate(rightRotate((a), 1), 1)) + +/* Left rotate by 31: Rotate right by 1 */ +#define leftRotate31(a) (rightRotate((a), 1)) + +/* Define the 32-bit right rotations in terms of left rotations */ +#define rightRotate1(a) (leftRotate31((a))) +#define rightRotate2(a) (leftRotate30((a))) +#define rightRotate3(a) (leftRotate29((a))) +#define rightRotate4(a) (leftRotate28((a))) +#define rightRotate5(a) (leftRotate27((a))) +#define rightRotate6(a) (leftRotate26((a))) +#define rightRotate7(a) (leftRotate25((a))) +#define rightRotate8(a) (leftRotate24((a))) +#define rightRotate9(a) (leftRotate23((a))) +#define rightRotate10(a) (leftRotate22((a))) +#define rightRotate11(a) (leftRotate21((a))) +#define rightRotate12(a) (leftRotate20((a))) +#define rightRotate13(a) (leftRotate19((a))) +#define rightRotate14(a) (leftRotate18((a))) +#define rightRotate15(a) (leftRotate17((a))) +#define rightRotate16(a) (leftRotate16((a))) +#define rightRotate17(a) (leftRotate15((a))) +#define rightRotate18(a) (leftRotate14((a))) +#define rightRotate19(a) (leftRotate13((a))) +#define rightRotate20(a) (leftRotate12((a))) +#define rightRotate21(a) (leftRotate11((a))) +#define rightRotate22(a) (leftRotate10((a))) +#define rightRotate23(a) (leftRotate9((a))) +#define rightRotate24(a) (leftRotate8((a))) +#define rightRotate25(a) (leftRotate7((a))) +#define rightRotate26(a) (leftRotate6((a))) +#define rightRotate27(a) (leftRotate5((a))) +#define rightRotate28(a) (leftRotate4((a))) +#define rightRotate29(a) (leftRotate3((a))) +#define rightRotate30(a) (leftRotate2((a))) +#define rightRotate31(a) (leftRotate1((a))) + +#endif /* LW_CRYPTO_ROTATE32_COMPOSED */ + +/* Rotation macros for 64-bit arguments */ + +/* Generic left rotate */ +#define leftRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (64 - (bits))); \ + })) + +/* Generic right rotate */ +#define rightRotate_64(a, bits) \ + (__extension__ ({ \ + uint64_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (64 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_64(a) (leftRotate_64((a), 1)) +#define leftRotate2_64(a) (leftRotate_64((a), 2)) +#define leftRotate3_64(a) (leftRotate_64((a), 3)) +#define leftRotate4_64(a) (leftRotate_64((a), 4)) +#define leftRotate5_64(a) (leftRotate_64((a), 5)) +#define leftRotate6_64(a) (leftRotate_64((a), 6)) +#define leftRotate7_64(a) (leftRotate_64((a), 7)) +#define leftRotate8_64(a) (leftRotate_64((a), 8)) +#define leftRotate9_64(a) (leftRotate_64((a), 9)) +#define leftRotate10_64(a) (leftRotate_64((a), 10)) +#define leftRotate11_64(a) (leftRotate_64((a), 11)) +#define leftRotate12_64(a) (leftRotate_64((a), 12)) +#define leftRotate13_64(a) (leftRotate_64((a), 13)) +#define leftRotate14_64(a) (leftRotate_64((a), 14)) +#define leftRotate15_64(a) (leftRotate_64((a), 15)) +#define leftRotate16_64(a) (leftRotate_64((a), 16)) +#define leftRotate17_64(a) (leftRotate_64((a), 17)) +#define leftRotate18_64(a) (leftRotate_64((a), 18)) +#define leftRotate19_64(a) (leftRotate_64((a), 19)) +#define leftRotate20_64(a) (leftRotate_64((a), 20)) +#define leftRotate21_64(a) (leftRotate_64((a), 21)) +#define leftRotate22_64(a) (leftRotate_64((a), 22)) +#define leftRotate23_64(a) (leftRotate_64((a), 23)) +#define leftRotate24_64(a) (leftRotate_64((a), 24)) +#define leftRotate25_64(a) (leftRotate_64((a), 25)) +#define leftRotate26_64(a) (leftRotate_64((a), 26)) +#define leftRotate27_64(a) (leftRotate_64((a), 27)) +#define leftRotate28_64(a) (leftRotate_64((a), 28)) +#define leftRotate29_64(a) (leftRotate_64((a), 29)) +#define leftRotate30_64(a) (leftRotate_64((a), 30)) +#define leftRotate31_64(a) (leftRotate_64((a), 31)) +#define leftRotate32_64(a) (leftRotate_64((a), 32)) +#define leftRotate33_64(a) (leftRotate_64((a), 33)) +#define leftRotate34_64(a) (leftRotate_64((a), 34)) +#define leftRotate35_64(a) (leftRotate_64((a), 35)) +#define leftRotate36_64(a) (leftRotate_64((a), 36)) +#define leftRotate37_64(a) (leftRotate_64((a), 37)) +#define leftRotate38_64(a) (leftRotate_64((a), 38)) +#define leftRotate39_64(a) (leftRotate_64((a), 39)) +#define leftRotate40_64(a) (leftRotate_64((a), 40)) +#define leftRotate41_64(a) (leftRotate_64((a), 41)) +#define leftRotate42_64(a) (leftRotate_64((a), 42)) +#define leftRotate43_64(a) (leftRotate_64((a), 43)) +#define leftRotate44_64(a) (leftRotate_64((a), 44)) +#define leftRotate45_64(a) (leftRotate_64((a), 45)) +#define leftRotate46_64(a) (leftRotate_64((a), 46)) +#define leftRotate47_64(a) (leftRotate_64((a), 47)) +#define leftRotate48_64(a) (leftRotate_64((a), 48)) +#define leftRotate49_64(a) (leftRotate_64((a), 49)) +#define leftRotate50_64(a) (leftRotate_64((a), 50)) +#define leftRotate51_64(a) (leftRotate_64((a), 51)) +#define leftRotate52_64(a) (leftRotate_64((a), 52)) +#define leftRotate53_64(a) (leftRotate_64((a), 53)) +#define leftRotate54_64(a) (leftRotate_64((a), 54)) +#define leftRotate55_64(a) (leftRotate_64((a), 55)) +#define leftRotate56_64(a) (leftRotate_64((a), 56)) +#define leftRotate57_64(a) (leftRotate_64((a), 57)) +#define leftRotate58_64(a) (leftRotate_64((a), 58)) +#define leftRotate59_64(a) (leftRotate_64((a), 59)) +#define leftRotate60_64(a) (leftRotate_64((a), 60)) +#define leftRotate61_64(a) (leftRotate_64((a), 61)) +#define leftRotate62_64(a) (leftRotate_64((a), 62)) +#define leftRotate63_64(a) (leftRotate_64((a), 63)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_64(a) (rightRotate_64((a), 1)) +#define rightRotate2_64(a) (rightRotate_64((a), 2)) +#define rightRotate3_64(a) (rightRotate_64((a), 3)) +#define rightRotate4_64(a) (rightRotate_64((a), 4)) +#define rightRotate5_64(a) (rightRotate_64((a), 5)) +#define rightRotate6_64(a) (rightRotate_64((a), 6)) +#define rightRotate7_64(a) (rightRotate_64((a), 7)) +#define rightRotate8_64(a) (rightRotate_64((a), 8)) +#define rightRotate9_64(a) (rightRotate_64((a), 9)) +#define rightRotate10_64(a) (rightRotate_64((a), 10)) +#define rightRotate11_64(a) (rightRotate_64((a), 11)) +#define rightRotate12_64(a) (rightRotate_64((a), 12)) +#define rightRotate13_64(a) (rightRotate_64((a), 13)) +#define rightRotate14_64(a) (rightRotate_64((a), 14)) +#define rightRotate15_64(a) (rightRotate_64((a), 15)) +#define rightRotate16_64(a) (rightRotate_64((a), 16)) +#define rightRotate17_64(a) (rightRotate_64((a), 17)) +#define rightRotate18_64(a) (rightRotate_64((a), 18)) +#define rightRotate19_64(a) (rightRotate_64((a), 19)) +#define rightRotate20_64(a) (rightRotate_64((a), 20)) +#define rightRotate21_64(a) (rightRotate_64((a), 21)) +#define rightRotate22_64(a) (rightRotate_64((a), 22)) +#define rightRotate23_64(a) (rightRotate_64((a), 23)) +#define rightRotate24_64(a) (rightRotate_64((a), 24)) +#define rightRotate25_64(a) (rightRotate_64((a), 25)) +#define rightRotate26_64(a) (rightRotate_64((a), 26)) +#define rightRotate27_64(a) (rightRotate_64((a), 27)) +#define rightRotate28_64(a) (rightRotate_64((a), 28)) +#define rightRotate29_64(a) (rightRotate_64((a), 29)) +#define rightRotate30_64(a) (rightRotate_64((a), 30)) +#define rightRotate31_64(a) (rightRotate_64((a), 31)) +#define rightRotate32_64(a) (rightRotate_64((a), 32)) +#define rightRotate33_64(a) (rightRotate_64((a), 33)) +#define rightRotate34_64(a) (rightRotate_64((a), 34)) +#define rightRotate35_64(a) (rightRotate_64((a), 35)) +#define rightRotate36_64(a) (rightRotate_64((a), 36)) +#define rightRotate37_64(a) (rightRotate_64((a), 37)) +#define rightRotate38_64(a) (rightRotate_64((a), 38)) +#define rightRotate39_64(a) (rightRotate_64((a), 39)) +#define rightRotate40_64(a) (rightRotate_64((a), 40)) +#define rightRotate41_64(a) (rightRotate_64((a), 41)) +#define rightRotate42_64(a) (rightRotate_64((a), 42)) +#define rightRotate43_64(a) (rightRotate_64((a), 43)) +#define rightRotate44_64(a) (rightRotate_64((a), 44)) +#define rightRotate45_64(a) (rightRotate_64((a), 45)) +#define rightRotate46_64(a) (rightRotate_64((a), 46)) +#define rightRotate47_64(a) (rightRotate_64((a), 47)) +#define rightRotate48_64(a) (rightRotate_64((a), 48)) +#define rightRotate49_64(a) (rightRotate_64((a), 49)) +#define rightRotate50_64(a) (rightRotate_64((a), 50)) +#define rightRotate51_64(a) (rightRotate_64((a), 51)) +#define rightRotate52_64(a) (rightRotate_64((a), 52)) +#define rightRotate53_64(a) (rightRotate_64((a), 53)) +#define rightRotate54_64(a) (rightRotate_64((a), 54)) +#define rightRotate55_64(a) (rightRotate_64((a), 55)) +#define rightRotate56_64(a) (rightRotate_64((a), 56)) +#define rightRotate57_64(a) (rightRotate_64((a), 57)) +#define rightRotate58_64(a) (rightRotate_64((a), 58)) +#define rightRotate59_64(a) (rightRotate_64((a), 59)) +#define rightRotate60_64(a) (rightRotate_64((a), 60)) +#define rightRotate61_64(a) (rightRotate_64((a), 61)) +#define rightRotate62_64(a) (rightRotate_64((a), 62)) +#define rightRotate63_64(a) (rightRotate_64((a), 63)) + +/* Rotate a 16-bit value left by a number of bits */ +#define leftRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (16 - (bits))); \ + })) + +/* Rotate a 16-bit value right by a number of bits */ +#define rightRotate_16(a, bits) \ + (__extension__ ({ \ + uint16_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (16 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_16(a) (leftRotate_16((a), 1)) +#define leftRotate2_16(a) (leftRotate_16((a), 2)) +#define leftRotate3_16(a) (leftRotate_16((a), 3)) +#define leftRotate4_16(a) (leftRotate_16((a), 4)) +#define leftRotate5_16(a) (leftRotate_16((a), 5)) +#define leftRotate6_16(a) (leftRotate_16((a), 6)) +#define leftRotate7_16(a) (leftRotate_16((a), 7)) +#define leftRotate8_16(a) (leftRotate_16((a), 8)) +#define leftRotate9_16(a) (leftRotate_16((a), 9)) +#define leftRotate10_16(a) (leftRotate_16((a), 10)) +#define leftRotate11_16(a) (leftRotate_16((a), 11)) +#define leftRotate12_16(a) (leftRotate_16((a), 12)) +#define leftRotate13_16(a) (leftRotate_16((a), 13)) +#define leftRotate14_16(a) (leftRotate_16((a), 14)) +#define leftRotate15_16(a) (leftRotate_16((a), 15)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_16(a) (rightRotate_16((a), 1)) +#define rightRotate2_16(a) (rightRotate_16((a), 2)) +#define rightRotate3_16(a) (rightRotate_16((a), 3)) +#define rightRotate4_16(a) (rightRotate_16((a), 4)) +#define rightRotate5_16(a) (rightRotate_16((a), 5)) +#define rightRotate6_16(a) (rightRotate_16((a), 6)) +#define rightRotate7_16(a) (rightRotate_16((a), 7)) +#define rightRotate8_16(a) (rightRotate_16((a), 8)) +#define rightRotate9_16(a) (rightRotate_16((a), 9)) +#define rightRotate10_16(a) (rightRotate_16((a), 10)) +#define rightRotate11_16(a) (rightRotate_16((a), 11)) +#define rightRotate12_16(a) (rightRotate_16((a), 12)) +#define rightRotate13_16(a) (rightRotate_16((a), 13)) +#define rightRotate14_16(a) (rightRotate_16((a), 14)) +#define rightRotate15_16(a) (rightRotate_16((a), 15)) + +/* Rotate an 8-bit value left by a number of bits */ +#define leftRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp << (bits)) | (_temp >> (8 - (bits))); \ + })) + +/* Rotate an 8-bit value right by a number of bits */ +#define rightRotate_8(a, bits) \ + (__extension__ ({ \ + uint8_t _temp = (a); \ + (_temp >> (bits)) | (_temp << (8 - (bits))); \ + })) + +/* Left rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define leftRotate1_8(a) (leftRotate_8((a), 1)) +#define leftRotate2_8(a) (leftRotate_8((a), 2)) +#define leftRotate3_8(a) (leftRotate_8((a), 3)) +#define leftRotate4_8(a) (leftRotate_8((a), 4)) +#define leftRotate5_8(a) (leftRotate_8((a), 5)) +#define leftRotate6_8(a) (leftRotate_8((a), 6)) +#define leftRotate7_8(a) (leftRotate_8((a), 7)) + +/* Right rotate by a specific number of bits. These macros may be replaced + * with more efficient ones on platforms that lack a barrel shifter */ +#define rightRotate1_8(a) (rightRotate_8((a), 1)) +#define rightRotate2_8(a) (rightRotate_8((a), 2)) +#define rightRotate3_8(a) (rightRotate_8((a), 3)) +#define rightRotate4_8(a) (rightRotate_8((a), 4)) +#define rightRotate5_8(a) (rightRotate_8((a), 5)) +#define rightRotate6_8(a) (rightRotate_8((a), 6)) +#define rightRotate7_8(a) (rightRotate_8((a), 7)) + +#endif diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo-avr.S b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo-avr.S new file mode 100644 index 0000000..629c19d --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo-avr.S @@ -0,0 +1,935 @@ +#if defined(__AVR__) +#include +/* Automatically generated - do not edit */ + + .text +.global xoodoo_permute + .type xoodoo_permute, @function +xoodoo_permute: + push r28 + push r29 + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + movw r30,r24 +.L__stack_usage = 16 + ldi r18,88 + mov r19,r1 + rcall 34f + ldi r18,56 + rcall 34f + ldi r18,192 + ldi r19,3 + rcall 34f + ldi r18,208 + mov r19,r1 + rcall 34f + ldi r18,32 + ldi r19,1 + rcall 34f + ldi r18,20 + mov r19,r1 + rcall 34f + ldi r18,96 + rcall 34f + ldi r18,44 + rcall 34f + ldi r18,128 + ldi r19,3 + rcall 34f + ldi r18,240 + mov r19,r1 + rcall 34f + ldi r18,160 + ldi r19,1 + rcall 34f + ldi r18,18 + mov r19,r1 + rcall 34f + rjmp 888f +34: + ldd r6,Z+12 + ldd r7,Z+13 + ldd r8,Z+14 + ldd r9,Z+15 + ldd r0,Z+28 + eor r6,r0 + ldd r0,Z+29 + eor r7,r0 + ldd r0,Z+30 + eor r8,r0 + ldd r0,Z+31 + eor r9,r0 + ldd r0,Z+44 + eor r6,r0 + ldd r0,Z+45 + eor r7,r0 + ldd r0,Z+46 + eor r8,r0 + ldd r0,Z+47 + eor r9,r0 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + movw r10,r20 + movw r12,r22 + eor r10,r26 + eor r11,r27 + eor r12,r28 + eor r13,r29 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r9,r24 + eor r6,r25 + eor r7,r14 + eor r8,r15 + movw r14,r10 + movw r24,r12 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r13,r24 + eor r10,r25 + eor r11,r14 + eor r12,r15 + eor r20,r9 + eor r21,r6 + eor r22,r7 + eor r23,r8 + eor r26,r9 + eor r27,r6 + eor r28,r7 + eor r29,r8 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + std Z+16,r26 + std Z+17,r27 + std Z+18,r28 + std Z+19,r29 + std Z+32,r2 + std Z+33,r3 + std Z+34,r4 + std Z+35,r5 + ldd r20,Z+4 + ldd r21,Z+5 + ldd r22,Z+6 + ldd r23,Z+7 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r6,r20 + movw r8,r22 + eor r6,r26 + eor r7,r27 + eor r8,r28 + eor r9,r29 + eor r6,r2 + eor r7,r3 + eor r8,r4 + eor r9,r5 + movw r14,r6 + movw r24,r8 + mov r0,r1 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + lsr r9 + ror r8 + ror r7 + ror r6 + ror r0 + or r9,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r9,r24 + eor r6,r25 + eor r7,r14 + eor r8,r15 + eor r20,r13 + eor r21,r10 + eor r22,r11 + eor r23,r12 + eor r26,r13 + eor r27,r10 + eor r28,r11 + eor r29,r12 + eor r2,r13 + eor r3,r10 + eor r4,r11 + eor r5,r12 + std Z+4,r20 + std Z+5,r21 + std Z+6,r22 + std Z+7,r23 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + ldd r2,Z+40 + ldd r3,Z+41 + ldd r4,Z+42 + ldd r5,Z+43 + movw r10,r20 + movw r12,r22 + eor r10,r26 + eor r11,r27 + eor r12,r28 + eor r13,r29 + eor r10,r2 + eor r11,r3 + eor r12,r4 + eor r13,r5 + movw r14,r10 + movw r24,r12 + mov r0,r1 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + lsr r13 + ror r12 + ror r11 + ror r10 + ror r0 + or r13,r0 + mov r0,r1 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + lsr r25 + ror r24 + ror r15 + ror r14 + ror r0 + or r25,r0 + eor r13,r24 + eor r10,r25 + eor r11,r14 + eor r12,r15 + eor r20,r9 + eor r21,r6 + eor r22,r7 + eor r23,r8 + eor r26,r9 + eor r27,r6 + eor r28,r7 + eor r29,r8 + eor r2,r9 + eor r3,r6 + eor r4,r7 + eor r5,r8 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + std Z+24,r26 + std Z+25,r27 + std Z+26,r28 + std Z+27,r29 + std Z+40,r2 + std Z+41,r3 + std Z+42,r4 + std Z+43,r5 + ldd r0,Z+12 + eor r0,r13 + std Z+12,r0 + ldd r0,Z+13 + eor r0,r10 + std Z+13,r0 + ldd r0,Z+14 + eor r0,r11 + std Z+14,r0 + ldd r0,Z+15 + eor r0,r12 + std Z+15,r0 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + eor r6,r13 + eor r7,r10 + eor r8,r11 + eor r9,r12 + ldd r14,Z+44 + ldd r15,Z+45 + ldd r24,Z+46 + ldd r25,Z+47 + eor r14,r13 + eor r15,r10 + eor r24,r11 + eor r25,r12 + ldd r10,Z+24 + ldd r11,Z+25 + ldd r12,Z+26 + ldd r13,Z+27 + std Z+28,r10 + std Z+29,r11 + std Z+30,r12 + std Z+31,r13 + ldd r10,Z+20 + ldd r11,Z+21 + ldd r12,Z+22 + ldd r13,Z+23 + std Z+24,r10 + std Z+25,r11 + std Z+26,r12 + std Z+27,r13 + ldd r10,Z+16 + ldd r11,Z+17 + ldd r12,Z+18 + ldd r13,Z+19 + std Z+20,r10 + std Z+21,r11 + std Z+22,r12 + std Z+23,r13 + std Z+16,r6 + std Z+17,r7 + std Z+18,r8 + std Z+19,r9 + ldd r6,Z+32 + ldd r7,Z+33 + ldd r8,Z+34 + ldd r9,Z+35 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+32,r6 + std Z+33,r7 + std Z+34,r8 + std Z+35,r9 + ldd r6,Z+36 + ldd r7,Z+37 + ldd r8,Z+38 + ldd r9,Z+39 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+36,r6 + std Z+37,r7 + std Z+38,r8 + std Z+39,r9 + ldd r6,Z+40 + ldd r7,Z+41 + ldd r8,Z+42 + ldd r9,Z+43 + mov r0,r9 + mov r9,r8 + mov r8,r7 + mov r7,r6 + mov r6,r0 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+40,r6 + std Z+41,r7 + std Z+42,r8 + std Z+43,r9 + mov r0,r25 + mov r25,r24 + mov r24,r15 + mov r15,r14 + mov r14,r0 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + lsl r14 + rol r15 + rol r24 + rol r25 + adc r14,r1 + std Z+44,r14 + std Z+45,r15 + std Z+46,r24 + std Z+47,r25 + ld r20,Z + ldd r21,Z+1 + ldd r22,Z+2 + ldd r23,Z+3 + eor r20,r18 + eor r21,r19 + ldd r26,Z+16 + ldd r27,Z+17 + ldd r28,Z+18 + ldd r29,Z+19 + ldd r2,Z+32 + ldd r3,Z+33 + ldd r4,Z+34 + ldd r5,Z+35 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + st Z,r20 + std Z+1,r21 + std Z+2,r22 + std Z+3,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+16,r26 + std Z+17,r27 + std Z+18,r28 + std Z+19,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+32,r2 + std Z+33,r3 + std Z+34,r4 + std Z+35,r5 + ldd r20,Z+4 + ldd r21,Z+5 + ldd r22,Z+6 + ldd r23,Z+7 + ldd r26,Z+20 + ldd r27,Z+21 + ldd r28,Z+22 + ldd r29,Z+23 + ldd r2,Z+36 + ldd r3,Z+37 + ldd r4,Z+38 + ldd r5,Z+39 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+4,r20 + std Z+5,r21 + std Z+6,r22 + std Z+7,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+20,r26 + std Z+21,r27 + std Z+22,r28 + std Z+23,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+36,r2 + std Z+37,r3 + std Z+38,r4 + std Z+39,r5 + ldd r20,Z+8 + ldd r21,Z+9 + ldd r22,Z+10 + ldd r23,Z+11 + ldd r26,Z+24 + ldd r27,Z+25 + ldd r28,Z+26 + ldd r29,Z+27 + ldd r2,Z+40 + ldd r3,Z+41 + ldd r4,Z+42 + ldd r5,Z+43 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+8,r20 + std Z+9,r21 + std Z+10,r22 + std Z+11,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+24,r26 + std Z+25,r27 + std Z+26,r28 + std Z+27,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+40,r2 + std Z+41,r3 + std Z+42,r4 + std Z+43,r5 + ldd r20,Z+12 + ldd r21,Z+13 + ldd r22,Z+14 + ldd r23,Z+15 + ldd r26,Z+28 + ldd r27,Z+29 + ldd r28,Z+30 + ldd r29,Z+31 + ldd r2,Z+44 + ldd r3,Z+45 + ldd r4,Z+46 + ldd r5,Z+47 + movw r6,r2 + movw r8,r4 + mov r0,r26 + com r0 + and r6,r0 + mov r0,r27 + com r0 + and r7,r0 + mov r0,r28 + com r0 + and r8,r0 + mov r0,r29 + com r0 + and r9,r0 + eor r20,r6 + eor r21,r7 + eor r22,r8 + eor r23,r9 + std Z+12,r20 + std Z+13,r21 + std Z+14,r22 + std Z+15,r23 + movw r6,r20 + movw r8,r22 + mov r0,r2 + com r0 + and r6,r0 + mov r0,r3 + com r0 + and r7,r0 + mov r0,r4 + com r0 + and r8,r0 + mov r0,r5 + com r0 + and r9,r0 + eor r26,r6 + eor r27,r7 + eor r28,r8 + eor r29,r9 + std Z+28,r26 + std Z+29,r27 + std Z+30,r28 + std Z+31,r29 + mov r0,r20 + com r0 + and r26,r0 + mov r0,r21 + com r0 + and r27,r0 + mov r0,r22 + com r0 + and r28,r0 + mov r0,r23 + com r0 + and r29,r0 + eor r2,r26 + eor r3,r27 + eor r4,r28 + eor r5,r29 + std Z+44,r2 + std Z+45,r3 + std Z+46,r4 + std Z+47,r5 + ldd r6,Z+16 + ldd r7,Z+17 + ldd r8,Z+18 + ldd r9,Z+19 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+16,r6 + std Z+17,r7 + std Z+18,r8 + std Z+19,r9 + ldd r6,Z+20 + ldd r7,Z+21 + ldd r8,Z+22 + ldd r9,Z+23 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+20,r6 + std Z+21,r7 + std Z+22,r8 + std Z+23,r9 + ldd r6,Z+24 + ldd r7,Z+25 + ldd r8,Z+26 + ldd r9,Z+27 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+24,r6 + std Z+25,r7 + std Z+26,r8 + std Z+27,r9 + ldd r6,Z+28 + ldd r7,Z+29 + ldd r8,Z+30 + ldd r9,Z+31 + lsl r6 + rol r7 + rol r8 + rol r9 + adc r6,r1 + std Z+28,r6 + std Z+29,r7 + std Z+30,r8 + std Z+31,r9 + ldd r6,Z+40 + ldd r7,Z+41 + ldd r8,Z+42 + ldd r9,Z+43 + ldd r10,Z+44 + ldd r11,Z+45 + ldd r12,Z+46 + ldd r13,Z+47 + ldd r14,Z+32 + ldd r15,Z+33 + ldd r24,Z+34 + ldd r25,Z+35 + std Z+40,r25 + std Z+41,r14 + std Z+42,r15 + std Z+43,r24 + ldd r14,Z+36 + ldd r15,Z+37 + ldd r24,Z+38 + ldd r25,Z+39 + std Z+44,r25 + std Z+45,r14 + std Z+46,r15 + std Z+47,r24 + std Z+32,r9 + std Z+33,r6 + std Z+34,r7 + std Z+35,r8 + std Z+36,r13 + std Z+37,r10 + std Z+38,r11 + std Z+39,r12 + ret +888: + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + pop r29 + pop r28 + ret + .size xoodoo_permute, .-xoodoo_permute + +#endif diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.c b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.c new file mode 100644 index 0000000..59bb8bf --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.c @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "internal-xoodoo.h" + +#if !defined(__AVR__) + +void xoodoo_permute(xoodoo_state_t *state) +{ + static uint16_t const rc[XOODOO_ROUNDS] = { + 0x0058, 0x0038, 0x03C0, 0x00D0, 0x0120, 0x0014, + 0x0060, 0x002C, 0x0380, 0x00F0, 0x01A0, 0x0012 + }; + uint8_t round; + uint32_t x00, x01, x02, x03; + uint32_t x10, x11, x12, x13; + uint32_t x20, x21, x22, x23; + uint32_t t1, t2; + + /* Load the state and convert from little-endian byte order */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + x00 = state->S[0][0]; + x01 = state->S[0][1]; + x02 = state->S[0][2]; + x03 = state->S[0][3]; + x10 = state->S[1][0]; + x11 = state->S[1][1]; + x12 = state->S[1][2]; + x13 = state->S[1][3]; + x20 = state->S[2][0]; + x21 = state->S[2][1]; + x22 = state->S[2][2]; + x23 = state->S[2][3]; +#else + x00 = le_load_word32(state->B); + x01 = le_load_word32(state->B + 4); + x02 = le_load_word32(state->B + 8); + x03 = le_load_word32(state->B + 12); + x10 = le_load_word32(state->B + 16); + x11 = le_load_word32(state->B + 20); + x12 = le_load_word32(state->B + 24); + x13 = le_load_word32(state->B + 28); + x20 = le_load_word32(state->B + 32); + x21 = le_load_word32(state->B + 36); + x22 = le_load_word32(state->B + 40); + x23 = le_load_word32(state->B + 44); +#endif + + /* Perform all permutation rounds */ + for (round = 0; round < XOODOO_ROUNDS; ++round) { + /* Optimization ideas from the Xoodoo implementation here: + * https://github.com/XKCP/XKCP/tree/master/lib/low/Xoodoo/Optimized */ + + /* Step theta: Mix column parity */ + t1 = x03 ^ x13 ^ x23; + t2 = x00 ^ x10 ^ x20; + t1 = leftRotate5(t1) ^ leftRotate14(t1); + t2 = leftRotate5(t2) ^ leftRotate14(t2); + x00 ^= t1; + x10 ^= t1; + x20 ^= t1; + t1 = x01 ^ x11 ^ x21; + t1 = leftRotate5(t1) ^ leftRotate14(t1); + x01 ^= t2; + x11 ^= t2; + x21 ^= t2; + t2 = x02 ^ x12 ^ x22; + t2 = leftRotate5(t2) ^ leftRotate14(t2); + x02 ^= t1; + x12 ^= t1; + x22 ^= t1; + x03 ^= t2; + x13 ^= t2; + x23 ^= t2; + + /* Step rho-west: Plane shift */ + t1 = x13; + x13 = x12; + x12 = x11; + x11 = x10; + x10 = t1; + x20 = leftRotate11(x20); + x21 = leftRotate11(x21); + x22 = leftRotate11(x22); + x23 = leftRotate11(x23); + + /* Step iota: Add the round constant to the state */ + x00 ^= rc[round]; + + /* Step chi: Non-linear layer */ + x00 ^= (~x10) & x20; + x10 ^= (~x20) & x00; + x20 ^= (~x00) & x10; + x01 ^= (~x11) & x21; + x11 ^= (~x21) & x01; + x21 ^= (~x01) & x11; + x02 ^= (~x12) & x22; + x12 ^= (~x22) & x02; + x22 ^= (~x02) & x12; + x03 ^= (~x13) & x23; + x13 ^= (~x23) & x03; + x23 ^= (~x03) & x13; + + /* Step rho-east: Plane shift */ + x10 = leftRotate1(x10); + x11 = leftRotate1(x11); + x12 = leftRotate1(x12); + x13 = leftRotate1(x13); + t1 = leftRotate8(x22); + t2 = leftRotate8(x23); + x22 = leftRotate8(x20); + x23 = leftRotate8(x21); + x20 = t1; + x21 = t2; + } + + /* Convert back into little-endian and store to the output state */ +#if defined(LW_UTIL_LITTLE_ENDIAN) + state->S[0][0] = x00; + state->S[0][1] = x01; + state->S[0][2] = x02; + state->S[0][3] = x03; + state->S[1][0] = x10; + state->S[1][1] = x11; + state->S[1][2] = x12; + state->S[1][3] = x13; + state->S[2][0] = x20; + state->S[2][1] = x21; + state->S[2][2] = x22; + state->S[2][3] = x23; +#else + le_store_word32(state->B, x00); + le_store_word32(state->B + 4, x01); + le_store_word32(state->B + 8, x02); + le_store_word32(state->B + 12, x03); + le_store_word32(state->B + 16, x10); + le_store_word32(state->B + 20, x11); + le_store_word32(state->B + 24, x12); + le_store_word32(state->B + 28, x13); + le_store_word32(state->B + 32, x20); + le_store_word32(state->B + 36, x21); + le_store_word32(state->B + 40, x22); + le_store_word32(state->B + 44, x23); +#endif +} + +#endif /* !__AVR__ */ diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.h b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.h new file mode 100644 index 0000000..f6eddd8 --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/internal-xoodoo.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LW_INTERNAL_XOODOO_H +#define LW_INTERNAL_XOODOO_H + +#include "internal-util.h" + +/** + * \file internal-xoodoo.h + * \brief Internal implementation of the Xoodoo permutation. + * + * References: https://keccak.team/xoodyak.html + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Number of rows in the Xoodoo state. + */ +#define XOODOO_ROWS 3 + +/** + * \brief Number of columns in the Xoodoo state. + */ +#define XOODOO_COLS 4 + +/** + * \brief Number of rounds for the Xoodoo permutation. + */ +#define XOODOO_ROUNDS 12 + +/** + * \brief State information for the Xoodoo permutation. + */ +typedef union +{ + /** Words of the state */ + uint32_t S[XOODOO_ROWS][XOODOO_COLS]; + + /** Bytes of the state */ + uint8_t B[XOODOO_ROWS * XOODOO_COLS * sizeof(uint32_t)]; + +} xoodoo_state_t; + +/** + * \brief Permutes the Xoodoo state. + * + * \param state The Xoodoo state. + * + * The state will be in little-endian before and after the operation. + */ +void xoodoo_permute(xoodoo_state_t *state); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.c b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.c new file mode 100644 index 0000000..4ad4fce --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.c @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include "xoodyak.h" +#include "internal-xoodoo.h" +#include + +aead_cipher_t const xoodyak_cipher = { + "Xoodyak", + XOODYAK_KEY_SIZE, + XOODYAK_NONCE_SIZE, + XOODYAK_TAG_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + xoodyak_aead_encrypt, + xoodyak_aead_decrypt +}; + +aead_hash_algorithm_t const xoodyak_hash_algorithm = { + "Xoodyak-Hash", + sizeof(xoodyak_hash_state_t), + XOODYAK_HASH_SIZE, + AEAD_FLAG_LITTLE_ENDIAN, + xoodyak_hash, + (aead_hash_init_t)xoodyak_hash_init, + (aead_hash_update_t)xoodyak_hash_absorb, + (aead_hash_finalize_t)xoodyak_hash_finalize, + (aead_xof_absorb_t)xoodyak_hash_absorb, + (aead_xof_squeeze_t)xoodyak_hash_squeeze +}; + +/** + * \brief Rate for absorbing data into the sponge state. + */ +#define XOODYAK_ABSORB_RATE 44 + +/** + * \brief Rate for squeezing data out of the sponge. + */ +#define XOODYAK_SQUEEZE_RATE 24 + +/** + * \brief Rate for absorbing and squeezing in hashing mode. + */ +#define XOODYAK_HASH_RATE 16 + +/** + * \brief Phase identifier for "up" mode, which indicates that a block + * permutation has just been performed. + */ +#define XOODYAK_PHASE_UP 0 + +/** + * \brief Phase identifier for "down" mode, which indicates that data has + * been absorbed but that a block permutation has not been done yet. + */ +#define XOODYAK_PHASE_DOWN 1 + +/** + * \brief Absorbs data into the Xoodoo permutation state. + * + * \param state Xoodoo permutation state. + * \param phase Points to the current phase, up or down. + * \param data Points to the data to be absorbed. + * \param len Length of the data to be absorbed. + */ +static void xoodyak_absorb + (xoodoo_state_t *state, uint8_t *phase, + const unsigned char *data, unsigned long long len) +{ + uint8_t domain = 0x03; + unsigned temp; + while (len > XOODYAK_ABSORB_RATE) { + if (*phase != XOODYAK_PHASE_UP) + xoodoo_permute(state); + lw_xor_block(state->B, data, XOODYAK_ABSORB_RATE); + state->B[XOODYAK_ABSORB_RATE] ^= 0x01; /* Padding */ + state->B[sizeof(state->B) - 1] ^= domain; + data += XOODYAK_ABSORB_RATE; + len -= XOODYAK_ABSORB_RATE; + domain = 0x00; + *phase = XOODYAK_PHASE_DOWN; + } + temp = (unsigned)len; + if (*phase != XOODYAK_PHASE_UP) + xoodoo_permute(state); + lw_xor_block(state->B, data, temp); + state->B[temp] ^= 0x01; /* Padding */ + state->B[sizeof(state->B) - 1] ^= domain; + *phase = XOODYAK_PHASE_DOWN; +} + +int xoodyak_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k) +{ + xoodoo_state_t state; + uint8_t phase, domain; + unsigned temp; + (void)nsec; + + /* Set the length of the returned ciphertext */ + *clen = mlen + XOODYAK_TAG_SIZE; + + /* Initialize the state with the key */ + memcpy(state.B, k, XOODYAK_KEY_SIZE); + memset(state.B + XOODYAK_KEY_SIZE, 0, sizeof(state.B) - XOODYAK_KEY_SIZE); + state.B[XOODYAK_KEY_SIZE + 1] = 0x01; /* Padding */ + state.B[sizeof(state.B) - 1] = 0x02; /* Domain separation */ + phase = XOODYAK_PHASE_DOWN; + + /* Absorb the nonce and associated data */ + xoodyak_absorb(&state, &phase, npub, XOODYAK_NONCE_SIZE); + xoodyak_absorb(&state, &phase, ad, adlen); + + /* Encrypt the plaintext to produce the ciphertext */ + domain = 0x80; + while (mlen > XOODYAK_SQUEEZE_RATE) { + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + lw_xor_block_2_dest(c, state.B, m, XOODYAK_SQUEEZE_RATE); + state.B[XOODYAK_SQUEEZE_RATE] ^= 0x01; /* Padding */ + c += XOODYAK_SQUEEZE_RATE; + m += XOODYAK_SQUEEZE_RATE; + mlen -= XOODYAK_SQUEEZE_RATE; + domain = 0; + } + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + temp = (unsigned)mlen; + lw_xor_block_2_dest(c, state.B, m, temp); + state.B[temp] ^= 0x01; /* Padding */ + c += temp; + + /* Generate the authentication tag */ + state.B[sizeof(state.B) - 1] ^= 0x40; /* Domain separation */ + xoodoo_permute(&state); + memcpy(c, state.B, XOODYAK_TAG_SIZE); + return 0; +} + +int xoodyak_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k) +{ + xoodoo_state_t state; + uint8_t phase, domain; + unsigned temp; + unsigned char *mtemp = m; + (void)nsec; + + /* Validate the ciphertext length and set the return "mlen" value */ + if (clen < XOODYAK_TAG_SIZE) + return -1; + *mlen = clen - XOODYAK_TAG_SIZE; + + /* Initialize the state with the key */ + memcpy(state.B, k, XOODYAK_KEY_SIZE); + memset(state.B + XOODYAK_KEY_SIZE, 0, sizeof(state.B) - XOODYAK_KEY_SIZE); + state.B[XOODYAK_KEY_SIZE + 1] = 0x01; /* Padding */ + state.B[sizeof(state.B) - 1] = 0x02; /* Domain separation */ + phase = XOODYAK_PHASE_DOWN; + + /* Absorb the nonce and associated data */ + xoodyak_absorb(&state, &phase, npub, XOODYAK_NONCE_SIZE); + xoodyak_absorb(&state, &phase, ad, adlen); + + /* Decrypt the ciphertext to produce the plaintext */ + domain = 0x80; + clen -= XOODYAK_TAG_SIZE; + while (clen > XOODYAK_SQUEEZE_RATE) { + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + lw_xor_block_swap(m, state.B, c, XOODYAK_SQUEEZE_RATE); + state.B[XOODYAK_SQUEEZE_RATE] ^= 0x01; /* Padding */ + c += XOODYAK_SQUEEZE_RATE; + m += XOODYAK_SQUEEZE_RATE; + clen -= XOODYAK_SQUEEZE_RATE; + domain = 0; + } + state.B[sizeof(state.B) - 1] ^= domain; + xoodoo_permute(&state); + temp = (unsigned)clen; + lw_xor_block_swap(m, state.B, c, temp); + state.B[temp] ^= 0x01; /* Padding */ + c += temp; + + /* Check the authentication tag */ + state.B[sizeof(state.B) - 1] ^= 0x40; /* Domain separation */ + xoodoo_permute(&state); + return aead_check_tag(mtemp, *mlen, state.B, c, XOODYAK_TAG_SIZE); +} + +int xoodyak_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen) +{ + xoodyak_hash_state_t state; + xoodyak_hash_init(&state); + xoodyak_hash_absorb(&state, in, inlen); + xoodyak_hash_squeeze(&state, out, XOODYAK_HASH_SIZE); + return 0; +} + +#define XOODYAK_HASH_MODE_INIT_ABSORB 0 +#define XOODYAK_HASH_MODE_ABSORB 1 +#define XOODYAK_HASH_MODE_SQUEEZE 2 + +#define xoodoo_hash_permute(state) \ + xoodoo_permute((xoodoo_state_t *)((state)->s.state)) + +void xoodyak_hash_init(xoodyak_hash_state_t *state) +{ + memset(state, 0, sizeof(xoodyak_hash_state_t)); + state->s.mode = XOODYAK_HASH_MODE_INIT_ABSORB; +} + +void xoodyak_hash_absorb + (xoodyak_hash_state_t *state, const unsigned char *in, + unsigned long long inlen) +{ + uint8_t domain; + unsigned temp; + + /* If we were squeezing, then restart the absorb phase */ + if (state->s.mode == XOODYAK_HASH_MODE_SQUEEZE) { + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_INIT_ABSORB; + state->s.count = 0; + } + + /* The first block needs a different domain separator to the others */ + domain = (state->s.mode == XOODYAK_HASH_MODE_INIT_ABSORB) ? 0x01 : 0x00; + + /* Absorb the input data into the state */ + while (inlen > 0) { + if (state->s.count >= XOODYAK_HASH_RATE) { + state->s.state[XOODYAK_HASH_RATE] ^= 0x01; /* Padding */ + state->s.state[sizeof(state->s.state) - 1] ^= domain; + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_ABSORB; + state->s.count = 0; + domain = 0x00; + } + temp = XOODYAK_HASH_RATE - state->s.count; + if (temp > inlen) + temp = (unsigned)inlen; + lw_xor_block(state->s.state + state->s.count, in, temp); + state->s.count += temp; + in += temp; + inlen -= temp; + } +} + +void xoodyak_hash_squeeze + (xoodyak_hash_state_t *state, unsigned char *out, + unsigned long long outlen) +{ + uint8_t domain; + unsigned temp; + + /* If we were absorbing, then terminate the absorb phase */ + if (state->s.mode != XOODYAK_HASH_MODE_SQUEEZE) { + domain = (state->s.mode == XOODYAK_HASH_MODE_INIT_ABSORB) ? 0x01 : 0x00; + state->s.state[state->s.count] ^= 0x01; /* Padding */ + state->s.state[sizeof(state->s.state) - 1] ^= domain; + xoodoo_hash_permute(state); + state->s.mode = XOODYAK_HASH_MODE_SQUEEZE; + state->s.count = 0; + } + + /* Squeeze data out of the state */ + while (outlen > 0) { + if (state->s.count >= XOODYAK_HASH_RATE) { + /* Padding is always at index 0 for squeezing subsequent + * blocks because the number of bytes we have absorbed + * since the previous block was squeezed out is zero */ + state->s.state[0] ^= 0x01; + xoodoo_hash_permute(state); + state->s.count = 0; + } + temp = XOODYAK_HASH_RATE - state->s.count; + if (temp > outlen) + temp = (unsigned)outlen; + memcpy(out, state->s.state + state->s.count, temp); + state->s.count += temp; + out += temp; + outlen -= temp; + } +} + +void xoodyak_hash_finalize + (xoodyak_hash_state_t *state, unsigned char *out) +{ + xoodyak_hash_squeeze(state, out, XOODYAK_HASH_SIZE); +} diff --git a/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.h b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.h new file mode 100644 index 0000000..f4777d5 --- /dev/null +++ b/xoodyak/Implementations/crypto_hash/xoodyakv1/rhys-avr/xoodyak.h @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2020 Southern Storm Software, Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef LWCRYPTO_XOODYAK_H +#define LWCRYPTO_XOODYAK_H + +#include "aead-common.h" + +/** + * \file xoodyak.h + * \brief Xoodyak authenticated encryption algorithm. + * + * Xoodyak is an authenticated encryption and hash algorithm pair based + * around the 384-bit Xoodoo permutation that is similar in structure to + * Keccak but is more efficient than Keccak on 32-bit embedded devices. + * The Cyclist mode of operation is used to convert the permutation + * into a sponge for the higher-level algorithms. + * + * The Xoodyak encryption mode has a 128-bit key, a 128-bit nonce, + * and a 128-bit authentication tag. The Xoodyak hashing mode has a + * 256-bit fixed hash output and can also be used as an extensible + * output function (XOF). + * + * The Xoodyak specification describes a re-keying mechanism where the + * key for one packet is used to derive the key to use on the next packet. + * This provides some resistance against side channel attacks by making + * the session key a moving target. This library does not currently + * implement re-keying. + * + * References: https://keccak.team/xoodyak.html + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Size of the key for Xoodyak. + */ +#define XOODYAK_KEY_SIZE 16 + +/** + * \brief Size of the authentication tag for Xoodyak. + */ +#define XOODYAK_TAG_SIZE 16 + +/** + * \brief Size of the nonce for Xoodyak. + */ +#define XOODYAK_NONCE_SIZE 16 + +/** + * \brief Size of the hash output for Xoodyak. + */ +#define XOODYAK_HASH_SIZE 32 + +/** + * \brief State information for Xoodyak incremental hashing modes. + */ +typedef union +{ + struct { + unsigned char state[48]; /**< Current hash state */ + unsigned char count; /**< Number of bytes in the current block */ + unsigned char mode; /**< Hash mode: absorb or squeeze */ + } s; /**< State */ + unsigned long long align; /**< For alignment of this structure */ + +} xoodyak_hash_state_t; + +/** + * \brief Meta-information block for the Xoodyak cipher. + */ +extern aead_cipher_t const xoodyak_cipher; + +/** + * \brief Meta-information block for the Xoodyak hash algorithm. + */ +extern aead_hash_algorithm_t const xoodyak_hash_algorithm; + +/** + * \brief Encrypts and authenticates a packet with Xoodyak. + * + * \param c Buffer to receive the output. + * \param clen On exit, set to the length of the output which includes + * the ciphertext and the 16 byte authentication tag. + * \param m Buffer that contains the plaintext message to encrypt. + * \param mlen Length of the plaintext message in bytes. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param nsec Secret nonce - not used by this algorithm. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to encrypt the packet. + * + * \return 0 on success, or a negative value if there was an error in + * the parameters. + * + * \sa xoodyak_aead_decrypt() + */ +int xoodyak_aead_encrypt + (unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Decrypts and authenticates a packet with Xoodyak. + * + * \param m Buffer to receive the plaintext message on output. + * \param mlen Receives the length of the plaintext message on output. + * \param nsec Secret nonce - not used by this algorithm. + * \param c Buffer that contains the ciphertext and authentication + * tag to decrypt. + * \param clen Length of the input data in bytes, which includes the + * ciphertext and the 16 byte authentication tag. + * \param ad Buffer that contains associated data to authenticate + * along with the packet but which does not need to be encrypted. + * \param adlen Length of the associated data in bytes. + * \param npub Points to the public nonce for the packet which must + * be 16 bytes in length. + * \param k Points to the 16 bytes of the key to use to decrypt the packet. + * + * \return 0 on success, -1 if the authentication tag was incorrect, + * or some other negative number if there was an error in the parameters. + * + * \sa xoodyak_aead_encrypt() + */ +int xoodyak_aead_decrypt + (unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k); + +/** + * \brief Hashes a block of input data with Xoodyak to generate a hash value. + * + * \param out Buffer to receive the hash output which must be at least + * XOODYAK_HASH_SIZE bytes in length. + * \param in Points to the input data to be hashed. + * \param inlen Length of the input data in bytes. + * + * \return Returns zero on success or -1 if there was an error in the + * parameters. + */ +int xoodyak_hash + (unsigned char *out, const unsigned char *in, unsigned long long inlen); + +/** + * \brief Initializes the state for a Xoodyak hashing operation. + * + * \param state Hash state to be initialized. + * + * \sa xoodyak_hash_absorb(), xoodyak_hash_squeeze(), xoodyak_hash() + */ +void xoodyak_hash_init(xoodyak_hash_state_t *state); + +/** + * \brief Aborbs more input data into a Xoodyak hashing state. + * + * \param state Hash state to be updated. + * \param in Points to the input data to be absorbed into the state. + * \param inlen Length of the input data to be absorbed into the state. + * + * \sa xoodyak_hash_init(), xoodyak_hash_squeeze() + */ +void xoodyak_hash_absorb + (xoodyak_hash_state_t *state, const unsigned char *in, + unsigned long long inlen); + +/** + * \brief Squeezes output data from a Xoodyak hashing state. + * + * \param state Hash state to squeeze the output data from. + * \param out Points to the output buffer to receive the squeezed data. + * \param outlen Number of bytes of data to squeeze out of the state. + * + * \sa xoodyak_hash_init(), xoodyak_hash_absorb() + */ +void xoodyak_hash_squeeze + (xoodyak_hash_state_t *state, unsigned char *out, + unsigned long long outlen); + +/** + * \brief Returns the final hash value from a Xoodyak hashing operation. + * + * \param state Hash state to be finalized. + * \param out Points to the output buffer to receive the hash value. + * + * \note This is a wrapper around xoodyak_hash_squeeze() for a fixed length + * of XOODYAK_HASH_SIZE bytes. + * + * \sa xoodyak_hash_init(), xoodyak_hash_absorb() + */ +void xoodyak_hash_finalize + (xoodyak_hash_state_t *state, unsigned char *out); + +#ifdef __cplusplus +} +#endif + +#endif